OpenCV, как использовать каскад на экране записи - PullRequest
0 голосов
/ 15 января 2019

Итак, я новичок в opencv и после практики с некоторыми детекторами лица и понимания того, как использовать библиотеку, я создал собственный каскад, и он должен идентифицировать значки на моем компьютере, такие как логотипы и другие. Сначала, чтобы убедиться, что мой каскад работает, я написал один, который определяет значки из изображений, которые я сделал, я сделал снимок экрана и обработал его через каскад в качестве изображения и работал нормально. код для этого

import numpy as np
import cv2
img = cv2.imread('body.jpg')

face_csc = cv2.CascadeClassifier('new_cascade.xml')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_csc.detectMultiScale(gray, 1.1 , 4)

for (x,y,w,h) in faces:
    cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),3)

cv2.imshow('img',img)
cv2.waitKey(0)

через некоторое время я написал это для того, чтобы он отображал мой экран при обнаружении значков так же, как при попытке сделать это на скриншоте:

import numpy as np
import cv2
from PIL import ImageGrab

fourcc = cv2.VideoWriter_fourcc(*'XVID')

face_csc = cv2.CascadeClassifier('new_cascade.xml')

out = cv2.VideoWriter("test_output.avi", fourcc, 5.0, (1366, 768))

while True:

    img = ImageGrab.grab(bbox=(100, 10, 750, 750))
    # convert image to numpy array
    img_np = np.array(img)
    # convert color space from BGR to RGB
    frame = cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB)
    # show image on OpenCV frame
    faces = face_csc.detectMultiScale(frame, 1.1 , 4)
    cv2.imshow("stream", frame)
    # write frame to video writer
    out.write(frame)
    for (x,y,w,h) in faces:
        cv2.rectangle(frame,(x,y),(x+w,y+h), (255,0,0), 2)
        roi_gray = frame[y:y+h, x:x+w]
        roi_color = img_np[y:y+h,x:x+w]
        if cv2.waitKey(1) == 27:
            break
cv2.waitKey(0)
out.release()

но при запуске кода он не показывает никаких ошибок, но также не обнаруживает и не идентифицирует какие-либо значки, он просто записывает мой экран, я пытался отлаживать это часами безрезультатно, есть идеи?

1 Ответ

0 голосов
/ 15 января 2019

Вы должны показывать и писать видео после рисования прямоугольников, а не до.

import numpy as np
import cv2
from PIL import ImageGrab

fourcc = cv2.VideoWriter_fourcc(*'XVID')

face_csc = cv2.CascadeClassifier('new_cascade.xml')

out = cv2.VideoWriter("test_output.avi", fourcc, 5.0, (1366, 768))

while True:

    img = ImageGrab.grab(bbox=(100, 10, 750, 750))
    # convert image to numpy array
    img_np = np.array(img)
    # convert color space from BGR to RGB
    frame = cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB)
    # show image on OpenCV frame
    faces = face_csc.detectMultiScale(frame, 1.1 , 4)

    for (x,y,w,h) in faces:
        cv2.rectangle(frame,(x,y),(x+w,y+h), (255,0,0), 2)
        roi_gray = frame[y:y+h, x:x+w]
        roi_color = img_np[y:y+h,x:x+w]
        if cv2.waitKey(1) == 27:
            break

    cv2.imshow("stream", frame)
    # write frame to video writer
    out.write(frame)

cv2.waitKey(0)
out.release()
...