Проблема с несколькими экземплярами VideoCapture в Python CV2 - PullRequest
0 голосов
/ 23 января 2019

Для моего проекта я хотел создать подкласс для 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, хотя я выпускаю каждый из них перед созданием другого? Или проблема где-то еще?

...