我正在尝试从RTSP H.264视频帧中按需捕获单个图像。我在树莓派上使用Python的OpenCV。
我的理解是您不能简单地捕获图像,而必须不断读取视频流的图像,并舍弃除了偶尔需要的一些以外的所有图像。这非常消耗计算资源,仅读取和舍弃1280x720 15 fps H.264 rtsp视频帧就会占用Pi约25%的CPU。
是否有其他方法?我很灵活,也可以使用GStreamer、FFMPEG或任何其他更具计算效率的工具。
我正在尝试从RTSP H.264视频帧中按需捕获单个图像。我在树莓派上使用Python的OpenCV。
我的理解是您不能简单地捕获图像,而必须不断读取视频流的图像,并舍弃除了偶尔需要的一些以外的所有图像。这非常消耗计算资源,仅读取和舍弃1280x720 15 fps H.264 rtsp视频帧就会占用Pi约25%的CPU。
是否有其他方法?我很灵活,也可以使用GStreamer、FFMPEG或任何其他更具计算效率的工具。
我做过类似的事情。 这是我的代码:
最初的回答:
def CaptureFrontCamera():
_bytes = bytes()
stream = urllib.request.urlopen('http://192.168.0.51/video.cgi?resolution=1920x1080')
while True:
_bytes += stream.read(1024)
a = _bytes.find(b'\xff\xd8')
b = _bytes.find(b'\xff\xd9')
if a != -1 and b != -1:
jpg = _bytes[a:b+2]
_bytes = _bytes[b+2:]
filename = '/home/pi/capture.jpeg'
i = cv2.imdecode(np.fromstring(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
cv2.imwrite(filename, i)
return filename
回答我自己的问题。不要使用read()方法:
cap = cv2.VideoCapture('rtsp_url')
def captureimages():
while True:
image = cap.read()
s = threading.Thread(target=captureimages)
s.start()
if takepic == True:
picture = image.copy()
将其分解为grab()和retrieve()更加高效。虽不是完美的解决方案,但更好:
cap = cv2.VideoCapture('rtsp_url')
def captureimages():
while True:
cap.grab()
s = threading.Thread(target=captureimages)
s.start()
if takepic == True:
picture = cap.retrieve()