我试图用python中的opencv录制一段视频,在窗口上显示流的线程中执行多线程处理。我对多线程相当陌生,我不知道是什么原因,我不能得到一个视频录制。我保存了一个文件,但其中没有流。指针很大谢谢。这个我的代码是:
import cv2
import os
import threading
import shutil
import json
import re
import datetime
import time
now=datetime.datetime.now()
class camThread(threading.Thread):
def __init__(self, previewName, camID):
threading.Thread.__init__(self)
self.previewName = previewName
self.camID = camID
def run(self):
print("Starting " + self.previewName)
camPreview(self.previewName, self.camID)
def camPreview(previewName, camID):
cv2.namedWindow(previewName)
cam = cv2.VideoCapture(camID)
cam.set(cv2.CAP_PROP_FRAME_WIDTH, 480)
cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
if cam.isOpened():
rval, frame = cam.read()
frame_width = int(cam.get(3))
frame_height = int(cam.get(4))
else:
rval = False
while rval:
cv2.namedWindow(previewName, cv2.WINDOW_NORMAL)
if (camID == 2):
frame= cv2.flip(frame,-1)
# cv2.setWindowProperty(previewName, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
cv2.imshow(previewName, frame)
# cam.set(CV_CAP_PROP_SETTINGS, 0)
rval, frame = cam.read()
key = cv2.waitKey(20)
if key == 115 :
Cam1="Cam"+str(camID)+"_"+timestr
ts=datetime.datetime.now()
filename="{}.avi".format(Cam1+ts.strftime("%Y%m%d_%H-%M-%S"))
out=cv2.VideoWriter(filename,cv2.VideoWriter_fourcc('M','J', 'P','G'),10,(480,720))
out.write(frame)
if key == 27:
print("Stopping recording")
break
if key == 27: # exit on ESC
break
cv2.destroyWindow(previewName)
# Create threads as follows
thread1 = camThread("Camera 1", 0)
thread2 = camThread("Camera 2", 2)
thread3 = camThread("Camera 3", 3)
timestr=str(now.strftime("%Y%m%d_%H-%M-%S"))
print("Working Directory:")
print(timestr)
#thread1.start()
thread2.start()
thread3.start()
print()
print("Active threads", threading.activeCount())
我想你是对的,但我无法用你的代码保存文件。下面是一个视频流到视频小部件,使用多线程来获取帧。每个摄影机流有两个线程:
我们将读帧与显示/写入分开,因为
cv2.VideoCapture.read()
是一个阻塞操作。因此,我们在它自己的独立线程中读取帧,通过减少I/O操作的延迟来“提高”FPS。另外,通过将帧捕获隔离到它自己的线程中,总是有一个帧可以被处理,而不必等待I/O操作完成并返回一个新帧。在第二个专门处理的线程中,我们现在可以自由地显示和保存每个帧到输出文件中。在同样,通过将所有这些封装到单个对象中,我们可以为每个摄影机创建一组线程,无论使用多少个摄影机,都可以轻松缩放。由于每个摄影机流都是在一个后台线程中生成的,所以我们必须使主线程保持活动状态。请确保将
src
字符串更改为您自己的相机。下面是一个同时录制三个视频流的示例。在相关问题 更多 >
编程相关推荐