0

Я использую следующий код для захвата движения на Raspicam, проблема в том, что cv2.VideoWriter(), похоже, не работает на Pi, Я прочитал об этой проблеме, и я установил драйвер v4l, но он все еще не работает.cv2.VideoWriter() Не работает на Raspberry Pi с Raspicam

Если у кого есть альтернативный метод для захвата видео или решения для этого, он окажет мне огромную помощь.

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 
+0

Вы пробовали разные кодеки и окончания файлов? Для меня это работало, чтобы написать мое приложение в cpp. –

+0

@ al-eax какой кодек работал для вас? – alex190030

ответ

0

Я решил, изменив кодек от

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") 
Смежные вопросы