此操作的最终目标是创建一个在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中完成,我希望在转换的任何一端都能得到相同的结果,但是出了点问题,我什至不确定从哪里开始寻找。(标准和全屏截图:{{3} })
答案 0 :(得分:0)
您可以使用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()