【发布时间】:2021-07-23 00:19:25
【问题描述】:
我正在开发一个需要在 c# 中调用 python 脚本的项目。事实是我熟悉python,但不熟悉c#,一点也不熟悉。
据我所知,基本上有两种选择:Iron 和 Python.net,您可以在这里查看 https://www.youtube.com/watch?v=oG5mmElsWJM&lc=UgzwcXvIteCqTjmHl2N4AaABAg.9Ls9q7VkDdc9MCYIPfOW0d。我现在在 python.net 上苦苦挣扎。我试图调用一个简单的乘法函数(例如 a * b),效果很好。但是当我转向图像数据时,弹出一个名为“'Delegates'的类型初始化程序引发异常。”的错误。
我使用的python脚本是:
import cv2
import numpy as np
def binarise(image):
ret, img_output = cv2.threshold(image,100,255,cv2.THRESH_BINARY)
return img_output
我试过的c#是:
if (greyImage1 != null)
{
try
{
var pythonPath = @"C:\Users\Admin\anaconda3";
Environment.SetEnvironmentVariable("PATH", $@"{pythonPath};" + Environment.GetEnvironmentVariable("PATH"));
Environment.SetEnvironmentVariable("PYTHONHOME", pythonPath);
Environment.SetEnvironmentVariable("PYTHONPATH ", $@"{pythonPath}\Lib");
string scriptFile = "myfunction.py";
string pythonCode = "";
using (var streamReader = new StreamReader(scriptFile, Encoding.UTF8))
{
pythonCode = streamReader.ReadToEnd();
}
using (Py.GIL())
{
var scope = Py.CreateScope();
scope.Exec(pythonCode);
greyImage1 = (scope as dynamic).binarise(greyImage1);
pictureBox1.Image = (System.Drawing.Image)greyImage1;
this.Cursor = Cursors.Default;
}
}
catch (Exception ex) { messageL.Text = ex.Message; }
}
有人有什么想法吗?感谢您的时间和帮助。
【问题讨论】:
-
这里的 grayImage1 是什么?将 .net 对象传递给 pythonnet 时,您需要调用 ToPython() 因此您需要执行 grayImage1.ToPython() 但这仍然行不通,因为您需要将图像数据类型更改为 opencv 期望的,即输入输入数组
-
谢谢。 grayImage1 处于浮动状态,我尝试在 python 脚本中将其更改为 2d 数组,以便我可以将 grayImage1 直接传递给函数。但没有运气。您认为这是什么原因?
-
谢谢roboto1986。我可以更改 python 脚本中的数据类型以使其可被 opencv 识别。我还将 grayImage1 替换为 grayImage1.ToPython()。我相信现在可以将数据发送到python,我现在的问题是在python函数之后,数据如何存储并返回到c#,以确保它可以被c#识别?
-
似乎在python之后,它作为pyobject返回,因为我收到错误[无法将类型'Python.Runtime.PyObject'隐式转换为'System.Drawing.Bitmap']。那么如何使用正确的数据类型回到 c# 呢?
标签: python c# integration