在使用Haarcascades时出错。

问题描述 投票:1回答:1

我想自己做一个项目,我以为我可以做这个项目,但是这个问题发生了,好...... 我不知道是怎么回事。这个项目的目的是在照片甚至视频上模糊眼睛。

import matplotlib.pyplot as plt
import numpy as np
import cv2

people = cv2.imread('Computer-Vision-with-Python/DATA/people.jpg',0)
people2 = cv2.imread('Computer-Vision-with-Python/DATA/people2.jpg')

def display(img, cmap='gray'):
    fig=plt.figure(figsize=(12,10))
    ax = fig.add_subplot(111)
    ax.imshow(img,cmap='gray')

eye_cascade = cv2.CascadeClassifier('Computer-Vision-with-Python/DATA/haarcascades/haarcascade_eye.xml')

def detect_eye(img):
    face_img = img.copy()

    face_rects = eye_cascade.detectMultiScale(face_img,scaleFactor=1.2,minNeighbors=6)

    for (x,y,w,h) in face_rects:
        cv2.rectangle(face_img,(x,y),(x+w,y+h),(255,255,255),10)

    return face_img

def detect_and_blur_eye(img):

    eye_img = img.copy()
    roi = img.copy()

    eye_rects = eye_cascade.detectMultiScale(eye_img,scaleFactor=1.2, minNeighbors=6) 

    for (x,y,w,h) in eye_rects: 
        print (x,y,w,h)
        roi = roi[y:y+h,x:x+w]
        blurred_roi = cv2.medianBlur(roi,7)

        eye_img[y:y+h,x:x+w] = blurred_roi

    return eye_img

results = detect_and_blur_eye(people)

之后,我得到了这个错误。


TypeError                                 Traceback (most recent call last)
<ipython-input-259-f561e117d7f8> in <module>
----> 1 results = detect_and_blur_eye(people)

<ipython-input-258-2ab32e080f88> in detect_and_blur_eye(img)
     12         blurred_roi = cv2.medianBlur(roi,7)
     13 
---> 14         eye_img[y:y+h,x:x+w] = blurred_roi
     15 
     16     return eye_img

TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'

我不知道发生了什么事! 请指导我在这种情况下。先谢谢你了。

EDIT

我能够发现一些东西,可以引导我解决问题。我改变了函数,所以我可以得到一些值。

def detect_and_blur_eye(img):

    eye_img = img.copy()
    roi = img.copy()

    eye_rects = eye_cascade.detectMultiScale(eye_img,scaleFactor=1.2, minNeighbors=6) 

    for (x,y,w,h) in eye_rects: 
        print (type(eye_rects))
        print (x,y,w,h)
        roi = roi[y:y+h,x:x+w]
        print(roi.shape)
        #blurred_roi = cv2.medianBlur(roi,7)

        #eye_img[y:y+h,x:x+w] = blurred_roi

    return eye_img

results = detect_and_blur_eye(people)

它给我的回报是这样的。

<class 'numpy.ndarray'>
1182 414 45 45
(45, 45)
<class 'numpy.ndarray'>
595 427 56 56
(0, 0)
<class 'numpy.ndarray'>
512 430 57 57
(0, 0)
<class 'numpy.ndarray'>
270 470 60 60
(0, 0)
<class 'numpy.ndarray'>
349 475 56 56
(0, 0)
<class 'numpy.ndarray'>
981 375 62 62
(0, 0)
<class 'numpy.ndarray'>
842 389 50 50
(0, 0)
<class 'numpy.ndarray'>
762 391 50 50
(0, 0)
<class 'numpy.ndarray'>
1072 390 54 54
(0, 0)
<class 'numpy.ndarray'>
1238 399 48 48
(0, 0)

因为某些原因,我的形状是(0,0)

python opencv haar-classifier
1个回答
0
投票

是的,你的问题就像@jtlz2说的那样,是由于在图像中找不到眼睛,因此有none类型,当你试图分配它时,它会引发一个错误。可以有两种解决方法,要么你使用一个更好的分类器,它可以找到眼睛,但如果你想把它用于视频,你会想要实时,不能使用CNNs。一个替代方案可以是dlib面部关键点。除此之外,如果你只想继续使用haar-cascades,那么你可以这样做。

try:
    print (x,y,w,h)
    roi = roi[y:y+h,x:x+w]
    blurred_roi = cv2.medianBlur(roi,7)

    eye_img[y:y+h,x:x+w] = blurred_roi
except:
    pass

这样一来,如果有任何错误,你的眼睛就不会模糊,但程序不会出错。


0
投票

我能够发现问题所在。在函数中,我需要在有另一个值之前重置投资回报率,我没有这样做。

def detect_and_blur_eye(img):

    eye_img = img.copy()
    roi = img.copy()

    eye_rects = eye_cascade.detectMultiScale(eye_img,scaleFactor=1.2, minNeighbors=6,minSize=(5,5)) 

    for (x,y,w,h) in eye_rects:
        roi = img.copy()
        print (type(eye_rects))
        print (x,y,w,h)
        roi = roi[y:y+h,x:x+w]
        print(roi.shape)
        blurred_roi = cv2.medianBlur(roi,21)
        eye_img[y:y+h,x:x+w] = blurred_roi

    return eye_img

这样就可以了!

© www.soinside.com 2019 - 2024. All rights reserved.