我对此比较陌生,但这就是我要做的事情。我有一个覆盆子零连接到覆盆子pi相机,我通过uv4l无线传输来自覆盆子pi的视频。我用这个命令:
sudo uv4l -f -k --sched-fifo --mem-lock --driver raspicam --auto-video_nr --encoding h264 --width 1080 --height 720 --enable-server on
我可以通过查看pi的ip地址在Web浏览器上访问此流。现在我想做的是能够在opencv中查看视频流。这是我读过的作品,但是我遇到了以下错误:
Streaming http://192.168.1.84:8080/stream
Traceback (most recent call last):
File "videoStream.py", line 17, in <module>
bytes+=stream.read('1024')
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/http/client.py", line 448, in read
b = bytearray(amt)
TypeError: string argument without an encoding
这是我的代码。注意我正在运行python 3.5和opencv 3:
import cv2
import urllib.request
import numpy as np
import sys
host = "192.168.1.84:8080"
if len(sys.argv)>1:
host = sys.argv[1]
hoststr = 'http://' + host + '/stream'
print('Streaming ' + hoststr)
stream=urllib.request.urlopen(hoststr)
bytes=''
while True:
bytes+=stream.read('1024')
a = bytes.find('\xff\xd8')
b = bytes.find('\xff\xd9')
if a!=-1 and b!=-1:
jpg = bytes[a:b+2]
bytes= bytes[b+2:]
i = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8),cv2.CV_LOAD_IMAGE_COLOR)
cv2.imshow(hoststr,i)
if cv2.waitKey(1) ==27:
exit(0)
我不确定如何解决此问题,或者是否有更好的方法可以在opencv中查看此视频流。
答案 0 :(得分:1)
尝试一下。更改
bytes=''
while True:
bytes+=stream.read('1024')
a = bytes.find('\xff\xd8')
b = bytes.find('\xff\xd9')
到
bytes=b''
while True:
bytes+=stream.read(1024)
a = bytes.find(b'\xff\xd8')
b = bytes.find(b'\xff\xd9')
并使用
i = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8),cv2.IMREAD_COLOR)
这在python 3.5 cv2 4.0.0版本中对我有用
答案 1 :(得分:0)
我无法验证您的代码,因为我没有与我进行流媒体设置。但首先,我认为stream.read('1024')
应为stream.read(1024)
。 1024
是缓冲区的大小(以字节为单位),而不是1024的字符串。
其次,urllib.request.openurl().read()
会返回一个字节对象,因此,当np.fromstring(jpg, dtype=np.uint8)
期待np.fromstring
作为字符串时,您的代码可能会遇到解码问题jpg
,但jpg
的类型是一个字节。您需要将其转换为如下字符串:
np.fromstring(jpg.decode('utf-8'), dtype=np.uint8)
答案 2 :(得分:0)
只需替换
bytes=''
带
bytes=bytearray()
和
bytes+=stream.read('1024')
与
bytes+=bytearray(stream.read(1024))