QCameraImageCapture не излучает сигнал imageCaptured после вызова функции capture() ⇐ Python
QCameraImageCapture не излучает сигнал imageCaptured после вызова функции capture()
Я разрабатываю приложение PyQt с обработкой нескольких камер. Логика проста — каждую 1 секунду с помощью QTimer я запускаю цикл по всем доступным камерам для последовательной съемки текущих снимков.
Я установил функции print(..) как слоты для всех возможных сигналов QCamera & Объекты QCameraImageCapture для целей отладки. Судя по журналам, это выглядит так, когда я вызываю QCameraImageCapture.capture(), выдается только сигнал QCameraImageCapture.readyForCaptureChanged, когда сигнал QCameraImageCapture.imageCaptured не излучается .
Я не могу понять проблему, поскольку все сигналы QCamera демонстрируют ожидаемое поведение, а сигналы ошибок также не выдаются.
Будем очень признательны за любую помощь и предложения.
Вот мой исходный код
из импорта uic из PyQt5 из PyQt5.QtCore импортировать QTimer из PyQt5.QtMultimedia импортировать QCamera, QCameraInfo, QCameraImageCapture из PyQt5.QtWidgets импортировать QApplication, QMainWindow импортировать систему класс MultipleCamerasApp(QMainWindow): def get_camera_by_name(self, camera_name): если имя_камеры в self.camera_name_to_device_name.keys(): имя_устройства = self.имя_камеры_to_имя_устройства.get(имя_камеры) для camera_info в QCameraInfo.availableCameras(): если camera_info.deviceName() == имя_устройства: вернуть QCamera(camera_info) возврат Нет def capture_camera(self, camera_name): камера = self.get_camera_by_name(имя_камеры) если камера Нет: print(f"{имя_камеры} не найдено.") возвращаться print(f'-------------------- получение снимка с {camera_name} -------------------- -----------------------') camera.statusChanged.connect(lambda status: print(f'{camera_name}: status = {status}')) camera.stateChanged.connect(состояние лямбда: print(f"{camera_name}: состояние = {state}")) camera.lockStatusChanged.connect(статус лямбда: print(f"{camera_name}: lockStatus = {status}")) camera.captureModeChanged.connect(лямбда-режим: print(f"{camera_name}: captureMode = {mode}")) camera.errorOccurred.connect(состояние лямбда: print(f"{camera_name}: error = {state}")) camera.availabilityChanged.connect(состояние лямбда: print(f"{camera_name}: доступность = {state}")) захват = QCameraImageCapture (камера) capture.setCaptureDestination(capture.CaptureToBuffer) capture.imageCaptured.connect(lambda id, image: print(f"Capture: захваченное изображение {id}, {image}")) capture.imageExpose.connect(lambda id, image: print(f"Захват: экспонированное изображение {id}, {image}")) capture.imageSaved.connect(lambda id, image: print(f"Capture: изображение сохранено {id}, {image}")) capture.error.connect(идентификатор лямбда, сообщение: print(f"Захват: ошибка {сообщение}")) capture.readyForCaptureChanged.connect(лямбда готова: print(f"Capture: ReadyForCaptured = {ready}")) camera.setCaptureMode(QCamera.CaptureStillImage) камера.searchAndLock() камера.start() захват.захват() # self.display_image(id=0, image=QImage('cat.jpg'), video_containers=video_containers) камера.unlock() камера.unload() защита capture_all_cameras (сам): для имя_камеры в self.camera_name_list: self.capture_camera(имя_камеры=имя_камеры) защита print_available_cameras (сам): для camera_info в QCameraInfo.availableCameras(): print('deviceName', camera_info.deviceName()) print('описание', camera_info.description()) print('позиция', camera_info.position()) print('defaultCamera', camera_info.defaultCamera()) Распечатать('-------') защита __init__(сам): супер().__init__() uic.loadUi('ui_files/glasCylinders_v5.ui', self) self.camera_name_to_device_name = { "Камера 1": r"@device:pnp:\\?\usb#vid_32e6&pid_9005&mi_00#7&1b6ceba2&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global", "Камера 2": r"@device:pnp:\\?\usb#vid_32e6&pid_9005&mi_00#7&2e269c47&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global", «Камера 3»: r"@device:pnp:\\?\usb#vid_1902&pid_8301&mi_00#7&27601722&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global", } self.print_available_cameras() self.message_box = Нет self.search_timer = Нет self.video_containers_1 = [ self.videoContainer_00, self.videoContainer_10, self.videoContainer_11, self.videoContainer_12, self.videoContainer_20 ] self.video_containers_2 = [ self.videoContainer_01, self.videoContainer_13, self.videoContainer_14, self.videoContainer_15, self.videoContainer_21, self.videoContainer_22 ] self.video_containers_3 = [ self.videoContainer_02, self.videoContainer_03, self.videoContainer_16, self.videoContainer_17, self.videoContainer_18, self.videoContainer_19, self.videoContainer_23, self.videoContainer_24 ] self.camera_name_list = ["Камера 1", "Камера 2", "Камера 3"] self.video_containers_list = [self.video_containers_1, self.video_containers_2, self.video_containers_3] Assert len(self.camera_name_list) == len(self.video_containers_list) таймер = QTimer(собственный) timer.timeout.connect(self.capture_all_cameras) таймер.старт(1,0 * 1e3) если __name__ == '__main__': приложение = QApplication(sys.argv) окно = MultipleCamerasApp() окно.шоу() sys.exit(app.exec_()) И логи за одну итерацию (повторяется любое количество итераций)
-------------------- получение снимка с камеры 1 -------------------- ------------------------ Камера 1: статус = 2 Камера 1: статус = 4 Камера 1: статус = 6 Захват: ReadyForCaptured = True Камера 1: статус = 8 Камера 1: состояние = 2 Захват: ReadyForCaptured = False Камера 1: статус = 7 Камера 1: статус = 4 Камера 1: статус = 3 Камера 1: статус = 1 Камера 1: состояние = 0 -------------------- получение снимка с камеры 2 ------------------------- ------------------ Камера 2: статус = 2 Камера 2: статус = 4 Камера 2: статус = 6 Захват: ReadyForCaptured = True Камера 2: статус = 8 Камера 2: состояние = 2 Захват: ReadyForCaptured = False Камера 2: статус = 7 Камера 2: статус = 4 Камера 2: статус = 3 Камера 2: статус = 1 Камера 2: состояние = 0 -------------------- получение снимка с камеры 3 ------------------------- ------------------ Камера 3: статус = 2 Камера 3: статус = 4 Камера 3: статус = 6 Захват: ReadyForCaptured = True Камера 3: статус = 8 Камера 3: состояние = 2 Захват: ReadyForCaptured = False Камера 3: статус = 7 Камера 3: статус = 4 Камера 3: статус = 3 Камера 3: статус = 1 Камера 3: состояние = 0
Я разрабатываю приложение PyQt с обработкой нескольких камер. Логика проста — каждую 1 секунду с помощью QTimer я запускаю цикл по всем доступным камерам для последовательной съемки текущих снимков.
Я установил функции print(..) как слоты для всех возможных сигналов QCamera & Объекты QCameraImageCapture для целей отладки. Судя по журналам, это выглядит так, когда я вызываю QCameraImageCapture.capture(), выдается только сигнал QCameraImageCapture.readyForCaptureChanged, когда сигнал QCameraImageCapture.imageCaptured не излучается .
Я не могу понять проблему, поскольку все сигналы QCamera демонстрируют ожидаемое поведение, а сигналы ошибок также не выдаются.
Будем очень признательны за любую помощь и предложения.
Вот мой исходный код
из импорта uic из PyQt5 из PyQt5.QtCore импортировать QTimer из PyQt5.QtMultimedia импортировать QCamera, QCameraInfo, QCameraImageCapture из PyQt5.QtWidgets импортировать QApplication, QMainWindow импортировать систему класс MultipleCamerasApp(QMainWindow): def get_camera_by_name(self, camera_name): если имя_камеры в self.camera_name_to_device_name.keys(): имя_устройства = self.имя_камеры_to_имя_устройства.get(имя_камеры) для camera_info в QCameraInfo.availableCameras(): если camera_info.deviceName() == имя_устройства: вернуть QCamera(camera_info) возврат Нет def capture_camera(self, camera_name): камера = self.get_camera_by_name(имя_камеры) если камера Нет: print(f"{имя_камеры} не найдено.") возвращаться print(f'-------------------- получение снимка с {camera_name} -------------------- -----------------------') camera.statusChanged.connect(lambda status: print(f'{camera_name}: status = {status}')) camera.stateChanged.connect(состояние лямбда: print(f"{camera_name}: состояние = {state}")) camera.lockStatusChanged.connect(статус лямбда: print(f"{camera_name}: lockStatus = {status}")) camera.captureModeChanged.connect(лямбда-режим: print(f"{camera_name}: captureMode = {mode}")) camera.errorOccurred.connect(состояние лямбда: print(f"{camera_name}: error = {state}")) camera.availabilityChanged.connect(состояние лямбда: print(f"{camera_name}: доступность = {state}")) захват = QCameraImageCapture (камера) capture.setCaptureDestination(capture.CaptureToBuffer) capture.imageCaptured.connect(lambda id, image: print(f"Capture: захваченное изображение {id}, {image}")) capture.imageExpose.connect(lambda id, image: print(f"Захват: экспонированное изображение {id}, {image}")) capture.imageSaved.connect(lambda id, image: print(f"Capture: изображение сохранено {id}, {image}")) capture.error.connect(идентификатор лямбда, сообщение: print(f"Захват: ошибка {сообщение}")) capture.readyForCaptureChanged.connect(лямбда готова: print(f"Capture: ReadyForCaptured = {ready}")) camera.setCaptureMode(QCamera.CaptureStillImage) камера.searchAndLock() камера.start() захват.захват() # self.display_image(id=0, image=QImage('cat.jpg'), video_containers=video_containers) камера.unlock() камера.unload() защита capture_all_cameras (сам): для имя_камеры в self.camera_name_list: self.capture_camera(имя_камеры=имя_камеры) защита print_available_cameras (сам): для camera_info в QCameraInfo.availableCameras(): print('deviceName', camera_info.deviceName()) print('описание', camera_info.description()) print('позиция', camera_info.position()) print('defaultCamera', camera_info.defaultCamera()) Распечатать('-------') защита __init__(сам): супер().__init__() uic.loadUi('ui_files/glasCylinders_v5.ui', self) self.camera_name_to_device_name = { "Камера 1": r"@device:pnp:\\?\usb#vid_32e6&pid_9005&mi_00#7&1b6ceba2&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global", "Камера 2": r"@device:pnp:\\?\usb#vid_32e6&pid_9005&mi_00#7&2e269c47&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global", «Камера 3»: r"@device:pnp:\\?\usb#vid_1902&pid_8301&mi_00#7&27601722&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global", } self.print_available_cameras() self.message_box = Нет self.search_timer = Нет self.video_containers_1 = [ self.videoContainer_00, self.videoContainer_10, self.videoContainer_11, self.videoContainer_12, self.videoContainer_20 ] self.video_containers_2 = [ self.videoContainer_01, self.videoContainer_13, self.videoContainer_14, self.videoContainer_15, self.videoContainer_21, self.videoContainer_22 ] self.video_containers_3 = [ self.videoContainer_02, self.videoContainer_03, self.videoContainer_16, self.videoContainer_17, self.videoContainer_18, self.videoContainer_19, self.videoContainer_23, self.videoContainer_24 ] self.camera_name_list = ["Камера 1", "Камера 2", "Камера 3"] self.video_containers_list = [self.video_containers_1, self.video_containers_2, self.video_containers_3] Assert len(self.camera_name_list) == len(self.video_containers_list) таймер = QTimer(собственный) timer.timeout.connect(self.capture_all_cameras) таймер.старт(1,0 * 1e3) если __name__ == '__main__': приложение = QApplication(sys.argv) окно = MultipleCamerasApp() окно.шоу() sys.exit(app.exec_()) И логи за одну итерацию (повторяется любое количество итераций)
-------------------- получение снимка с камеры 1 -------------------- ------------------------ Камера 1: статус = 2 Камера 1: статус = 4 Камера 1: статус = 6 Захват: ReadyForCaptured = True Камера 1: статус = 8 Камера 1: состояние = 2 Захват: ReadyForCaptured = False Камера 1: статус = 7 Камера 1: статус = 4 Камера 1: статус = 3 Камера 1: статус = 1 Камера 1: состояние = 0 -------------------- получение снимка с камеры 2 ------------------------- ------------------ Камера 2: статус = 2 Камера 2: статус = 4 Камера 2: статус = 6 Захват: ReadyForCaptured = True Камера 2: статус = 8 Камера 2: состояние = 2 Захват: ReadyForCaptured = False Камера 2: статус = 7 Камера 2: статус = 4 Камера 2: статус = 3 Камера 2: статус = 1 Камера 2: состояние = 0 -------------------- получение снимка с камеры 3 ------------------------- ------------------ Камера 3: статус = 2 Камера 3: статус = 4 Камера 3: статус = 6 Захват: ReadyForCaptured = True Камера 3: статус = 8 Камера 3: состояние = 2 Захват: ReadyForCaptured = False Камера 3: статус = 7 Камера 3: статус = 4 Камера 3: статус = 3 Камера 3: статус = 1 Камера 3: состояние = 0
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение