Мне нужно передать изображение в виде байта [] от C# до Python скрипта. Я знаю, что могу сохранить это изображение как временный файл, а затем прочитать его через python. Это простой способ, но довольно медленный. Есть ли другие варианты? Мой скрипт Python использует библиотеки nymphy и opencv. Я мог бы использовать Iron Python, но поддерживает ли он эти python libs? C# код:
public string RunScript(string scriptToRun, string interpreter, byte[] image, int ksize = 9, int treshold1 = 50, int treshold2 = 5, int size1 = 100, int size2 = 250)
{
Process process = new Process();
process.StartInfo.FileName = interpreter;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = false;
process.StartInfo.Arguments = string.Concat(scriptToRun, " ", image, " ", ksize, " ", treshold1, " ", treshold2, " ", size1, " ", size2);
process.Start();
StreamReader streamReader = process.StandardOutput;
return streamReader.ReadToEnd();
}
python код:
import sys
import cv2
import numpy as np
from os.path import basename, splitext
def main():
input_path = sys.argv[1]
ksize = sys.argv[2]
treshold1 = sys.argv[3]
treshold2 = sys.argv[4]
size1 = sys.argv[5]
size2 = sys.argv[6]
contours = process_image(arr, ksize, treshold1, treshold2, size1, size2)
print(contours)
def process_image(arr, ksize, treshold1, treshold2, size1, size2):
gray = cv2.cvtColor(arr, cv2.COLOR_BGR2GRAY)
blur = cv2.medianBlur(gray, ksize)
edged = cv2.Canny(blur, treshold1, treshold2)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (size1, size2))
closed = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)
contours, _ = cv2.findContours(closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contour_list = []
for contour in contours:
approx = cv2.approxPolyDP(contour,0.01*cv2.arcLength(contour,True),True)
area = cv2.contourArea(contour)
if ((len(approx) > 8) & (50000 > area > 10000)):
contour_list.append(contour)
cv2.drawContours(arr, contour_list, -1, (255,0,0), 2)
contours = contour_list[0]
return contours
main()