Как прогнать кадры с камеры через нейросеть?
Как сделать "прогон" кадров с веб камеры (функция camera_on,
а также control_timer) через нейросеть (функция network)?
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)
Ответы (2 шт):
Понятно, что не работает - передаете данные типа QImage, а обрабатываете как VideoCapture (?)
Надо сделать что-то типа такого:
class PredictNumber:
face_cascade = cv2.CascadeClassifier('cascade/haarcascade_russian_plate_number.xml')
def network(self, image):
# QImage в cv::Mat
frame = Mat(image.height(), image.width(), <тип данных из cv, который соответствует QImage.Format_RGB888>...)
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
Если не получится Mat(image....), по попробовать как написано вот тут
Попробуйте заменить класс Worker1:
class Worker1(QThread):
ImageUpdate = pyqtSignal(QImage)
def __init__(self, *args, **kwargs):
super().__init__()
self.ThreadActive = True
self.cam = cv2.VideoCapture(0)
def run(self):
while self.ThreadActive:
# --------> vvvvvvvvvvvv
face_cascade = cv2.CascadeClassifier('cascade/haarcascade_russian_plate_number.xml')
ret, frame = self.cam.read() # 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)
# ---------------------------> vvvvvvvvvvvv
with_cascade = face_cascade.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)