【问题标题】:C# -> Python Encoding and Decoding Webcam StreamC# -> Python 编码和解码网络摄像头流
【发布时间】:2020-09-27 07:20:18
【问题描述】:

我一直无法弄清楚如何通过命名管道传递网络摄像头图像。已经完成让服务器和客户端交换数据,但无法弄清楚如何使用库来正确编码和解码图像。现在我的 Python 端只是显示为灰色图像。希望您能帮助指导我解决这个问题。

这是我将位图编码为 ByteArray 并通过命名管道传递的 C# 块:

public byte[] encodeImage(System.Drawing.Image imageIn)
    //Helper Function for turning Bitmap images into ByteArrays
    {
        using (var ms = new MemoryStream())
        {
            imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
            return ms.ToArray();
        }
    }

public void OnFrameReceive(object sender, NewFrameEventArgs eventArgs)
    {
        byte[] image_bytes;
        Console.WriteLine("Received new frame");
        Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
        image_bytes = encodeImage(bitmap);
        writeToPipe(image_bytes);
    }

public void writeToPipe(byte[] frame)
    {
        if (server.IsConnected)
        {
            MemoryStream memoryStream = new MemoryStream();
            using (BinaryWriter writer = new BinaryWriter(memoryStream))
            {
                Console.WriteLine("Wrting to pipe");
                writer.Write(frame);
                int bufferLength = (memoryStream.ToArray().Length);
                server.Write(memoryStream.ToArray(), 0, bufferLength);
            }
            memoryStream.Close();
        }
        else
        {
            Console.WriteLine("Not connected");
        }

这里是 Python 端接收该数据并尝试对其进行解码:

def init_pipe_signal():
    print("At init_pipe_signal")
    bufferSize = 921600
    arraySize = int(math.sqrt(bufferSize))
    i = np.arange(bufferSize).reshape(arraySize, arraySize)

    fileHandle = win32file.CreateFile("\\\\.\\pipe\\Demo", win32file.GENERIC_READ | win32file.GENERIC_WRITE, 0, None, win32file.OPEN_EXISTING, 0, None)

    while True:
        response, data = win32file.ReadFile(fileHandle, bufferSize)

        if response == 0:
            try:
                frame = Image.frombytes("RGB", (480,640), data, decoder_name="raw")
                frame = np.array(frame)
                cv.imshow('Test',frame)
            
            except ValueError:
                print("Value Error Here")
    
        else:
            print("No pipe data")

任何指导或帮助将不胜感激!

【问题讨论】:

  • 我立即注意到的事情是:1)在 C# 端,您将其保存为位图(特定文件格式),而在 Python 端,您尝试将其视为原始文件(我可能是错的,因为我不是 Python 开发人员)。 2)当您写入流时,您没有传递图像的字节长度,因此您无法知道一个图像在哪里结束,另一个在哪里开始。

标签: python c# image decode encode


【解决方案1】:

知道了!对于那些正在寻找答案的人: 这是我的 C# 端

        public byte[] encodeImage(System.Drawing.Image imageIn)
    //Helper Function for turning Bitmap images into ByteArrays
    {
        using (var ms = new MemoryStream())
        {
            imageIn.Save(ms, ImageFormat.Bmp);
            return ms.ToArray();
        }
    }

    public void OnFrameReceive(object sender, NewFrameEventArgs eventArgs)
    {
        byte[] image_bytes;
        Console.WriteLine("Received new frame");
        Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
        image_bytes = encodeImage(bitmap);
        writeToPipe(image_bytes);
    }
    public void writeToPipe(byte[] frame)
    {
        if (server.IsConnected)
        {
            MemoryStream memoryStream = new MemoryStream();
            using (BinaryWriter writer = new BinaryWriter(memoryStream))
            {

                Console.WriteLine("Wrting to pipe");
                writer.Write(frame);

                //int bufferLength = (memoryStream.ToArray().Length/32)*32;
                int bufferLength = (memoryStream.ToArray().Length);
                server.Write(memoryStream.ToArray(), 0, bufferLength);
                Console.WriteLine(memoryStream.ToArray().Length);
            }
            /*
            Not sure if Memory Stream needs to be closed here (after every Write) 
            or after every time the server finishes.
            Test performance for both
            */
            memoryStream.Close();
        }
        else
        {
            Console.WriteLine("NOPE NOT CONNECTED");
        }
    }

这里是python解码端:

def init_pipe_signal():
    print("At init_pipe_signal")
    bufferSize = 921654
    fileHandle = win32file.CreateFile("\\\\.\\pipe\\Demo", win32file.GENERIC_READ | win32file.GENERIC_WRITE, 0, None, win32file.OPEN_EXISTING, 0, None)
while True:
    response, data = win32file.ReadFile(fileHandle, bufferSize)

    if response == 0:
        try:
            frame = np.array(Image.frombytes("RGB", (640, 480), data))
            frame = np.rot90(frame, 2)
            cv2.imshow("Test", frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

        except ValueError:
            print("Value Error Here")
    
    else:
        print("No pipe data")

【讨论】:

    猜你喜欢
    • 2013-08-12
    • 2015-05-26
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    相关资源
    最近更新 更多