cv2.VideoWriter() 在带有 Raspicam 的 Raspberry Pi 上不起作用

Posted

技术标签:

【中文标题】cv2.VideoWriter() 在带有 Raspicam 的 Raspberry Pi 上不起作用【英文标题】:cv2.VideoWriter() Doesn't work on the Raspberry Pi with the Raspicam 【发布时间】:2016-11-16 18:26:16 【问题描述】:

我使用以下代码在 Raspicam 上捕捉动作,问题是 cv2.VideoWriter() 在 Pi 上似乎不起作用,我已阅读有关此问题的信息,并且已安装 v4l 驱动程序但它仍然存在似乎不起作用。

如果有人有另一种捕获视频的方法或解决方案,他会对我有很大的帮助。

from picamera.array import PiRGBArray
from picamera import PiCamera
import time
import cv2
import numpy
from datetime import datetime, timedelta

MOTION_RECORD_TIME = timedelta(seconds = 3)


def have_motion(frame1, frame2):
    if frame1 is None or frame2 is None:
        return False
    delta = cv2.absdiff(frame1, frame2)
    thresh = cv2.threshold(delta, 25, 255, cv2.THRESH_BINARY)[1]
    return numpy.sum(thresh) > 0

camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))
time.sleep(0.1)

prev_frame = None
last_motion = None
motion_filename = None
motion_file = None

frame_size = camera.resolution
fourcc = cv2.cv.CV_FOURCC(*"XVID")

for frame in camera.capture_continuous(rawCapture, format="bgr",use_video_port=True):
    image = frame.array



    frame_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    frame_gray = cv2.GaussianBlur(frame_gray, (21, 21), 0)



    if have_motion(prev_frame, frame_gray):
        if motion_file is None:
            now = datetime.now()
            motion_filename = now.strftime("%Y_%m_%d_%H_%M_%S_MOTION.h264")
            motion_file = cv2.VideoWriter(motion_filename, fourcc, 20.0, frame_size)
            last_motion = time.time()
        print "Motion!", last_motion

    if motion_file is not None:
        motion_file.write(image)
        print 'Saving...'
        print now
        print time.time() - last_motion
        if time.time() - last_motion > 3:
            motion_file.release()
            motion_file = None
            print 'Saved'
            print motion_filename
            break


    prev_frame = frame_gray
    cv2.imshow('frame', image)
    rawCapture.truncate(0)

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

【问题讨论】:

您尝试过不同的编解码器和文件结尾吗?对我来说,用 cpp 编写我的应用程序很有效。 @al-eax 什么编解码器适合你? 【参考方案1】:

我通过更改编解码器解决了这个问题

fourcc = cv2.cv.CV_FOURCC(*"XVID")

fourcc = cv2.cv.CV_FOURCC(*"MPV4")

通过改变

motion_filename = now.strftime("%Y_%m_%d_%H_%M_%S_MOTION.h264")

motion_filename = now.strftime("%Y_%m_%d_%H_%M_%S_MOTION.avi")

【讨论】:

以上是关于cv2.VideoWriter() 在带有 Raspicam 的 Raspberry Pi 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法选择 cv2 VideoWriter 写入哪个目录?

如何在 cv2.VideoWriter 中使用 FPS 参数?

cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

cv2.VideoWriter 保存图像为视频的几个问题

cv2.VideoWriter 不会使用fourcc h.264写入文件(使用罗技c920,python 2.7,windows 8)

图像转视频