如何通过神经网络(函数)从网络摄像头(函数camera_on,
以及)“传递”帧?control_timernetwork
class PredictNumber:
face_cascade = cv2.CascadeClassifier('cascade/haarcascade_russian_plate_number.xml')
def network(self, image_video):
ret, frame = image_video.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
plaques = face_cascade.detectMultiScale(gray, 1.3, 5)
for i, (x, y, w, h) in enumerate(plaques):
roi_color = frame[y:y + h, x:x + w]
r = 400.0 / roi_color.shape[1]
dim = (400, int(roi_color.shape[0] * r))
resized = cv2.resize(roi_color, dim, interpolation=cv2.INTER_AREA)
w_resized = resized.shape[0]
h_resized = resized.shape[1]
frame[100:100 + w_resized, 100:100 + h_resized] = resized
return resized
def camera_on(self):
ret, image = self.cap.read()
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
height, width, channel = image.shape
step = channel * width
img = QImage(image.data, width, height, step, QImage.Format_RGB888)
image_video = PredictNumber.network(self, img)
# Таким образом не работает,
происходит вылет программы.
self.ui.Cam.setPixmap(QPixmap.fromImage(image_video))
self.ui.Cam.setScaledContents(True)
def control_timer(self):
if not self.timer.isActive():
self.cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
self.timer.start(0)
UPD:重写并将相机移动到单独的类
为了避免将格式从 cv 转换为 QT image,我这样做了,添加了级联,但程序仍然崩溃:
class Worker1(QThread):
ImageUpdate = pyqtSignal(QImage)
face_cascade = cv2.CascadeClassifier('cascade/haarcascade_russian_plate_number.xml')
def run(self):
self.ThreadActive = True
Capture = cv2.VideoCapture(0)
while self.ThreadActive:
ret, frame = Capture.read()
if ret:
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
flipped_image = cv2.flip(image, 1)
with_cascade = faceCascade.detectMultiScale(flipped_image, 1.3, 7)
for (x, y, w, h) in with_cascade:
roi_color = ret[y:y + h, x:x + w]
r = 300.0 / roi_color.shape[1]
dim = (400, int(roi_color.shape[0] * r))
resized = cv2.resize(roi_color, dim, interpolation=cv2.INTER_AREA)
convert_to_qt_format = QImage(resized.data, resized.shape[1], fresized.shape[0], QImage.Format_RGB888)
self.ImageUpdate.emit(convert_to_qt_format)
在这里,该类被初始化,并在按下按钮时启动。
self.Worker1 = Worker1()
self.Worker1.ImageUpdate.connect(self.image_update_slot)
self.ui.Camera_btn.clicked.connect(self.Worker1.start)
这是一个用于更新相机的插槽。最后一行根据小部件制作相机大小
def image_update_slot(self, Image):
self.ui.Cam.setPixmap(QPixmap.fromImage(Image))
self.ui.Cam.setScaledContents(True)
很明显,它不起作用 - 您传输 type 的数据
QImage,但将其处理为VideoCapture(?)你需要做这样的事情:
如果它不起作用,请按照此处
Mat(image....)的说明尝试尝试替换类
Worker1: