Как кодировать изображение np.array в Python и декодировать в System.Drawing.Imaging.BitmapData в c #? - PullRequest
0 голосов
/ 22 марта 2019

Я пытаюсь закодировать изображение, прочитанное на python, с помощью OpenCV, чтобы я мог отправить его через очередь сообщений (ZeroMQ) и декодировать его в c #. Вот питон, который я использую для сбора изображений

cap = cv2.VideoCapture(0)
while True:
    retval, img = cap.read()

Мне нужно закодировать img в строку, которую можно декодировать в c #, в объект BitmapData. Я пробовал это до сих пор.

Python

context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind('tcp://127.0.0.1:12345')

cap = cv2.VideoCapture(0)
while True:
    retval, img = cap.read()
    #cv2.imshow('Webcam', img)
    #cv2.waitKey(1)

    retval, buffer = cv2.imencode('.png', img)
    buffer = bytearray(buffer)
    buffer = buffer.decode('utf-8', 'ignore')
    print(buffer[25:50])
    payload = {}
    payload['message'] = buffer
    payload['originatingTime'] = datetime.datetime.now().isoformat()
    socket.send_multipart(['cozmo.img'.encode(), json.dumps(payload).encode('utf-8')])

с #

using (Pipeline pipeline = Pipeline.Create())
            {
                var mq = new NetMQSource<string>(pipeline, "cozmo.img", "tcp://localhost:12345", JsonFormat.Instance);
                IProducer<Microsoft.Psi.Imaging.Image> imgStream = mq.Select(x => {
                    Console.WriteLine(x);
                    byte[] imgData = Encoding.ASCII.GetBytes(x);
                    Bitmap bmp;
                    var ms = new MemoryStream(imgData);
                    bmp = new Bitmap(ms);

                    Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
                    System.Drawing.Imaging.BitmapData bmpData =
                        bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
                        bmp.PixelFormat);

                    Microsoft.Psi.Imaging.Image img = new Microsoft.Psi.Imaging.Image(bmpData);
                    Console.WriteLine(img.Width + " " + img.Height);
                    //byte[] data = ;
                    return img;
                });
                pipeline.RunAsync();
                Console.ReadKey();
            }       
...