Я пытаюсь создать приложение, которое может переключаться между изображениями с веб-камеры. Я помещаю функциональность веб-камеры в класс, и он создает объект VideoCapture при создании класса.
Когда я инициализирую класс вне цикла While, у него нет проблем с открытием VideoCapture. . Когда я пытаюсь создать класс внутри цикла while (в приведенном ниже примере это только входные данные, входные данные — это индекс камеры), не удается правильно открыть VideoCapture.
import cv2
from threading import Thread
class CamObj:
"""
Class that continuously acquires images from a camera.
"""
def __init__(self, index):
self.error = False
print("Camera created")
self.index = index
self.stream = cv2.VideoCapture(self.index)
(self.got_frame, self.frame) = self.stream.read()
if not self.stream.isOpened():
print(self.index + " NOT OPENED")
self.running = True
self.thread = Thread(target=self.get_frames_loop)
print("Camera starting")
self.thread.start()
def get_frames_loop(self):
while self.running:
if not self.got_frame:
print("NO FRAME")
self.stop()
else:
(self.got_frame, self.frame) = self.stream.read()
def stop(self):
self.running = False
self.stream.release()
def run():
camera = CamObj(0) # good, works
camera = CamObj(1) # also works
while True:
index = input("\n Enter camera index: ")
camera.stop()
camera = CamObj(index) # fails to open the capture
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
run()
Я проверил, что он работает последовательно вне цикла while. (см. CamObj0 и CamObj1)
Я попробовал все индексы веб-камер, которые работают на моем компьютере (в настоящее время тестирую 4)
Я попробовал просто изменить индекс, выполнив вместо этого следующую функцию:
def change_index(self, index):
self.stream.release()
self.stream = cv2.VideoCapture(self.index)
if not self.stream.isOpened():
print(self.index + " NOT OPENED")
Подробнее здесь: https://stackoverflow.com/questions/789 ... while-loop