【问题标题】:Cannot decode Base64 buffer into opencv2 frame无法将 Base64 缓冲区解码为 opencv2 帧
【发布时间】:2021-12-21 05:57:55
【问题描述】:

我的目标是进行进程间通信,以将 opencv 帧从 cpp 进程传输到 python 进程。为此,我将帧转换为 base64 并将其发送到命名管道。在 python 代码中接收帧时,我似乎遗漏了一些关于 base64 解码的内容。我在这几行中重现了我的问题:

base_img = cv2.VideoCapture(0).read()[1]

im_b64 = base64.b64encode(base_img)

im_bytes = base64.b64decode(im_b64)
im_arr = np.frombuffer(im_bytes, dtype=np.uint8)

cv2.imshow('Window', im_arr) # wide blank rectangle
cv2.waitKey(2000)

img = cv2.imdecode(im_arr, flags=cv2.IMREAD_COLOR)

cv2.imshow('Window', img)
cv2.waitKey(2000)

im_arr 似乎是一个有效的数组,因此当使用imshow 显示它时,它会显示一个奇怪的空白垂直矩形,类似于 200x5000。

使用imdecode 解码此数组返回无。我也已经尝试过使用标志IMREAD_ANYCOLOR

我的代码来自https://jdhao.github.io/2020/03/17/base64_opencv_pil_image_conversion/#base64-to-opencv-image,看起来很清楚。有人能发现我错过了什么吗?

【问题讨论】:

  • 因为你从不“imencode”,你也不应该“imdecode”,所以在这种情况下,im_arr 就是你想要的。
  • 谢谢@Miki,我没有理解 np 数组本身就是 cv2 Mat 的事实。尽管如此,imshow(base_img) 仍然有效,并且 base_img b64encoded、b64decoded 和从缓冲区读取的 imshow 无效(呈现一个宽的白色矩形)
  • 你应该显示im_arr,而不是img

标签: python python-3.x opencv base64


【解决方案1】:

将我的图像编码为 jpg 后,事情终于奏效了

image = cv2.VideoCapture(0).read()[1]
jpg_image = cv2.imencode('.jpg', image)[1]
jpg_b64_image = base64.b64encode(jpg_image)

buffer = base64.b64decode(jpg_b64_image)
jpg_image = np.frombuffer(buffer, dtype=np.uint8)
image = cv2.imdecode(jpg_image, flags=cv2.IMREAD_COLOR)

cv2.imshow('Window', image)
cv2.waitKey(3000)```

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 2014-12-30
    相关资源
    最近更新 更多