【问题标题】:Encode/decode image data after changing to/from string/bytes在更改为字符串/字节后编码/解码图像数据
【发布时间】:2019-05-11 05:50:26
【问题描述】:

这样做的最终目标是创建一个在 Raspberry Pi 上运行的程序,该程序可以将视频数据流式传输到远程客户端。为此,我(相信)我需要将帧数据更改为原始字节,以便通过套接字发送它们。在将其部署到现实世界之前,我只是检查以确保我可以进行字节之间的转换。我确实得到了输出,它正在实时从相机读取数据,但它的显示方式是在 1 像素宽的垂直左对齐线上。 (当使用 OpenCV 窗口上的默认全屏按钮时,它会增加到大约 5 个像素宽。)另外澄清一下,tostring() 函数显然将给定数据转换为原始字节而不是字符串?在检查时,Python 说新变量是字节。

我之前的尝试主要集中在获取原始图像数据并尝试对其进行编码和解码,但遇到了错误。我认为我走在正确的轨道上,但这是道路上的一个颠簸。

import cv2
import numpy as np

vid = cv2.VideoCapture(0)

while True:
    empty, frame = vid.read()

    frameString = frame.tostring()

    # Intermediary socket stuffs.

    newFrame = np.frombuffer(frameString)

    cv2.imshow("s", newFrame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

vid.release()

考虑到这一切都是通过 Numpy 进行的,我希望在转换的任一端都有相同的结果,但出现了问题,我什至不确定从哪里开始寻找。(标准和全屏屏幕截图:https://imgur.com/a/BIPxr50

【问题讨论】:

    标签: python numpy opencv encoding


    【解决方案1】:

    您可以使用cv2.imencode() 对帧进行编码,然后将其转换为字符串。从那里你可以通过你的套接字发送它。在接收端,您可以使用np.fromString()cv2.imdecode() 对其进行解码。

    import cv2
    import numpy as np
    
    vid = cv2.VideoCapture(0)
    
    while True:
        if vid.isOpened():
            empty, frame = vid.read()
            data = cv2.imencode('.jpg', frame)[1].tostring()
    
            # Intermediary socket stuffs
    
            nparr = np.fromstring(data, np.uint8)
            newFrame = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
            cv2.imshow("s", newFrame)
    
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
    
    vid.release()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 2020-05-22
      相关资源
      最近更新 更多