Как передать изображение в виде байтового массива из сценария c# в Python - PullRequest
0 голосов
/ 05 марта 2020

Мне нужно передать изображение в виде байта [] от 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()
...