对于我的项目,我想为opencv VideoCapture创建一个子类,如下所示:
import cv2
class VideoOperator(cv2.VideoCapture):
def __init__(self, video_path):
super().__init__(video_path)
self.current_frame_index = 0
self.last_frame_index = int(self.get(cv2.CAP_PROP_FRAME_COUNT) - 1)
def move_to_frame(self, frame_index):
if frame_index > self.last_frame_index:
self.set(cv2.CAP_PROP_POS_FRAMES, self.last_frame_index)
self.current_frame_index = self.last_frame_index
elif frame_index < 0:
self.set(cv2.CAP_PROP_POS_FRAMES, 0)
self.current_frame_index = 0
else:
self.set(cv2.CAP_PROP_POS_FRAMES, frame_index)
self.current_frame_index = frame_index
def move_x_frames(self, x):
self.move_to_frame(self.current_frame_index + x)
def get_current_frame(self):
_, image = self.read()
self.move_to_frame(self.current_frame_index)
return image
然后我使用unittest编写了一些测试。因为我想要一个子类的新实例,所以我决定在setUp()
函数中创建它。测试(不完整)如下所示:
import unittest, time
import video_operator
class TestVideoOperator(unittest.TestCase):
def setUp(self):
self.vid_op = video_operator.VideoOperator(r'E:\PythonProjects\video_cutter\vid1.mp4')
def tearDown(self):
self.vid_op.release()
def test_init(self):
self.assertEqual(self.vid_op.current_frame_index, 0)
self.assertEqual(self.vid_op.last_frame_index, 430653)
def test_move_to_existing_frame(self):
self.vid_op.move_to_frame(100)
self.assertEqual(self.vid_op.current_frame_index, 100)
def test_move_to_negative_frame(self):
self.vid_op.move_to_frame(-100)
self.assertEqual(self.vid_op.current_frame_index, 0)
def test_move_to_non_existing_frame(self):
self.vid_op.move_to_frame(self.vid_op.last_frame_index + 100)
self.assertEqual(self.vid_op.current_frame_index, self.vid_op.last_frame_index)
if __name__ == '__main__':
unittest.main()
但是,即使有4个测试,也只有1个被执行,并且总是以诸如以下退出代码的信息结尾:
当我仅将vid_op定义为类字段,而没有在每次测试开始时尝试对其进行初始化时,一切都将正常运行。即使我在创建另一个实例之前释放了每个实例,也无法创建VideoCapture类的多个实例吗?还是其他地方有问题?
答案 0 :(得分:0)
您是否给VideoCapture足够的时间进行初始化? 我正在使用cv2并行读取16个RTSP摄像机。初始化大约需要1分钟以上。 就我而言,我无法使用VideoCapture.read(),因为它要处理的工作太多。我通过在高速循环中运行cap.grab()来布置一些帧并仅抓取一些帧,而这些帧旨在显示给我,我只使用cap.retrieve()来解码我感兴趣的帧并增加应用性能。例如。要以30帧/秒的相机以3帧/秒的速度显示相机,则应以10帧间隔拍摄1帧。 值得一提的是,Linux已经展示出比Windows 10更好地处理这些VideoCapture对象。 初始化几分钟后,即使是Raspberry pi也可以并行运行多个VideoCapture。 希望这些信息对您有所帮助。