任务是从网络摄像头接收一系列图像,对其进行过滤,选择一种颜色(例如,仅绿色)并将其显示在窗口中。
使用OpenCV很容易做到这一点,但是使用PyQt5时有两个问题:
- 如何获取图像数组?
- 如何在窗口中显示修改后的图像?
所提供的代码显示来自网络摄像头的原始图像:
import sys
from PyQt5.Qt import *
class MyWidget(QWidget):
def __init__(self, parent):
super(QWidget, self).__init__(parent)
self.layout = QVBoxLayout(self)
self.viewfinder = QCameraViewfinder()
self.cameraInfo = QCameraInfo.defaultCamera()
self.camera = QCamera(self.cameraInfo)
self.camera.setViewfinder(self.viewfinder)
self.camera.setCaptureMode(QCamera.CaptureStillImage)
self.layout.insertWidget(1, self.viewfinder)
if self.camera.status() != QCamera.UnavailableStatus:
self.camera.start()
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.widget1 = MyWidget(self)
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
main_layout = QVBoxLayout(self.central_widget)
main_layout.addWidget(self.widget1)
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setApplicationName("pyqt5")
window = MainWindow()
window.show()
sys.exit(app.exec())
更新:上面介绍了使用OpenCV
在图像中显示绿色的代码。
需要在PyQt5窗口中显示相同的图像。
import cv2
import numpy as np
# Границы зеленого цвета в формате 'HLS'
hls_min = np.array((30, 0, 0), np.uint8)
hls_max = np.array((100, 255, 255), np.uint8)
cap = cv2.VideoCapture(0)
while True:
# Трёхмерный массив оригинального изображения в формате 'BGR'
ret, frame = cap.read()
# Перевод из 'bgr' в 'hls' (нужно именно в 'HLS')
hls = cv2.cvtColor(frame, cv2.COLOR_BGR2HLS) # Трёхмерный массив изображения в формате 'HLS'
# Фильтр
img_mask = cv2.inRange(hls, hls_min, hls_max)
# Применение фильтра цвета
img_filt = cv2.bitwise_and(frame, frame, mask = img_mask)
a=cv2.waitKey(1)
a=cv2.imshow("Filtered image", img_filt)