【问题标题】:reading an opencv image in python through a socket通过套接字在python中读取opencv图像
【发布时间】:2018-06-04 19:17:49
【问题描述】:

我正在尝试读取从 c++ 发送的 python 套接字中的 opencv 图像。

我能够将图像读入另一个 c++ 程序或 VB 程序并构建图像,但使用 python 我不明白发生了什么。

我发送 mat.data 的发送代码:

char *start_s = "<S><size>43434234<cols>64<rows>64<SE>";//plus I send the image size, cols, rows, which varies, not like the static char string shown
char *end_e = "<E>";
cv::Mat image_send = some_mat;
iResult = send( ConnectSocket, start_s, (int)strlen(start_s), 0 );
iResult = send( ConnectSocket, (const char *) image_send.data, i_buffer_size, 0 );
iResult = send( ConnectSocket, end_e, (int)strlen(end_e), 0 );

这是我在 python 上尝试过的,但还没有成功。 image_cols 和 Image_rows 是从套接字中过滤出来的,这里没有显示,只有 c++ mat 中的 image_mat.data 位于我试图放入图像的套接字中:

data = conn.recv(4757560)
        if(i_Read_Image == 2) & (image_cols != 0) & (image_rows != 0):
            print ("Entering")
            #print(data)
            data2 = np.fromstring(data, dtype='uint8')
            img_np = cv2.imdecode(data2,cv2.IMREAD_COLOR )
            cv2.imshow('image',img_np)
            cv2.waitKey(0)

            #Also tried this
            #img = Image.new('RGB', (image_cols, image_rows))
            #img.putdata(data)

        #img5 = np.reshape(data2,(image_rows,image_cols))
        i_Read_Image = 0

【问题讨论】:

  • “还没有成功”是什么意思?发生什么了?我认为这只是试图让它工作的试用代码,但实际上你不想将字节数硬编码为recv。您已经阅读了image_colsimage_rows,因此您可以计算套接字所需的额外字节数。
  • 上面的代码,我得到一个尺寸需要大于 0 的错误。如果我打印(data2),一切看起来都很好:[154 207 255 ..., 51 56 79] 但是带有 img_np 的行抛出错误:错误:(-215) size.width>0 && size.height>0 in function cv::imshow
  • 您是否在套接字上发送了原始像素数据?我认为您需要做的就是将data 重塑为大小正确的二维数组。我不太明白你为什么打电话给fromstringimdecode
  • 类似img_np = data.reshape((image_rows, image_cols, image_channels))

标签: python c++ sockets opencv


【解决方案1】:

在 cmets 的帮助下,我得到了一个可行的答案。原始图像是单个数组 RGB,这需要重新整形并放入 'RGB' 图像,可以在一行中完成:

img = Image.fromarray(data2.reshape(image_rows,image_cols,3), 'RGB')

当从套接字读取 opencv 数据数组时:这有效:

data = conn.recv(567667)
if(i_Read_Image == 2) & (image_cols != 0) & (image_rows != 0):
    data2 = np.fromstring(data, dtype='uint8')
    img = Image.fromarray(data2.reshape(image_rows,image_cols,3), 'RGB')
    img.show()

【讨论】:

    猜你喜欢
    • 2013-12-17
    • 2017-02-25
    • 2016-11-06
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    相关资源
    最近更新 更多