python cv2中有多个VideoCapture实例的问题

时间:2019-01-23 19:42:43

标签: python testing cv2

对于我的项目,我想为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个被执行,并且总是以诸如以下退出代码的信息结尾:

enter image description here

当我仅将vid_op定义为类字段,而没有在每次测试开始时尝试对其进行初始化时,一切都将正常运行。即使我在创建另一个实例之前释放了每个实例,也无法创建VideoCapture类的多个实例吗?还是其他地方有问题?

1 个答案:

答案 0 :(得分:0)

您是否给VideoCapture足够的时间进行初始化? 我正在使用cv2并行读取16个RTSP摄像机。初始化大约需要1分钟以上。 就我而言,我无法使用VideoCapture.read(),因为它要处理的工作太多。我通过在高速循环中运行cap.grab()来布置一些帧并仅抓取一些帧,而这些帧旨在显示给我,我只使用cap.retrieve()来解码我感兴趣的帧并增加应用性能。例如。要以30帧/秒的相机以3帧/秒的速度显示相机,则应以10帧间隔拍摄1帧。 值得一提的是,Linux已经展示出比Windows 10更好地处理这些VideoCapture对象。 初始化几分钟后,即使是Raspberry pi也可以并行运行多个VideoCapture。 希望这些信息对您有所帮助。