Python 尝试对Haarcascades使用模糊时出错

Python 尝试对Haarcascades使用模糊时出错,python,python-3.x,opencv,haar-classifier,Python,Python 3.x,Opencv,Haar Classifier,我正试着自己做一个项目,我想我可以做到这一点,但问题发生了,嗯。。。我不知道发生了什么事。这个项目的目标是模糊照片甚至视频上的眼睛 导入matplotlib.pyplot作为plt 将numpy作为np导入 进口cv2 people=cv2.imread('Computer-Vision-with-Python/DATA/people.jpg',0) people2=cv2.imread('Computer-Vision-with-Python/DATA/people2.jpg')) def显示

我正试着自己做一个项目,我想我可以做到这一点,但问题发生了,嗯。。。我不知道发生了什么事。这个项目的目标是模糊照片甚至视频上的眼睛

导入matplotlib.pyplot作为plt
将numpy作为np导入
进口cv2
people=cv2.imread('Computer-Vision-with-Python/DATA/people.jpg',0)
people2=cv2.imread('Computer-Vision-with-Python/DATA/people2.jpg'))
def显示(img,cmap='灰色'):
图=plt.图(图尺寸=(12,10))
ax=图添加_子批次(111)
ax.imshow(img,cmap='gray')
eye_cascade=cv2.CascadeClassifier('Computer-Vision-with-Python/DATA/haarcascades/haarcascade_-eye.xml'))
def检测眼(img):
面\u img=img.copy()
face_rects=eye_cascade.检测多尺度(face_img,scaleFactor=1.2,minNeighbors=6)
对于面直线中的(x,y,w,h):
cv2.矩形(面_img,(x,y),(x+w,y+h),(255255),10)
返回面
def检测和模糊眼睛(img):
eye_img=img.copy()
roi=img.copy()
eye_rects=eye_cascade.detectMultiScale(eye_img,scaleFactor=1.2,minNeighbors=6)
对于眼睛中的(x,y,w,h):
打印(x、y、w、h)
roi=roi[y:y+h,x:x+w]
模糊的roi=cv2.medianBlur(roi,7)
眼睛图像[y:y+h,x:x+w]=模糊的roi
回程眼
结果=检测和模糊眼睛(人)
之后,我得到了这个错误:


它还给了我这个:

<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)

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

因此,出于某种原因,我的形状是(0,0)

是的,你的问题如@jtlz2所说是因为在图像中找不到眼睛,因此没有类型,当你尝试分配它时,会产生错误。有两种解决方法,一种是使用更好的分类器来填充查找眼睛,另一种是如果你想将其用于视频,那么你需要实时性,而不能使用CNN。另一种选择是dlib面部关键点。除此之外,如果您只想继续使用haar级联,则可以执行以下操作:

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

这样,如果存在任何错误,则您的眼睛不会模糊,但程序不会抛出错误。

是的,您的问题(如@jtlz2所述)是由于在图像中找不到眼睛,因此没有类型,当您尝试分配它时会引发错误。有两种解决方法,一种是使用更好的分类器来填充查找眼睛,另一种是如果你想将其用于视频,那么你需要实时性,而不能使用CNN。另一种选择是dlib面部关键点。除此之外,如果您只想继续使用haar级联,则可以执行以下操作:

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

这样,如果存在任何错误,则您的眼睛不会模糊,但程序不会抛出错误。

我能够发现问题。在函数中,我需要在获得另一个值之前重置ROI,但我没有这样做

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

真管用

我发现了这个问题。在函数中,我需要在获得另一个值之前重置ROI,但我没有这样做

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

真管用

好项目!如果打印(x,y,w,h)会发生什么情况?可能(在某些帧中)没有找到人脸,因此眼睛是无的,因此x,y,w,h(需要是roi切片的整数)的类型错误。因此,您可能/可能只需要处理这些异常情况。您是否能够发布您的两个示例图像?这些是图像:和漂亮的项目!如果打印(x,y,w,h)会发生什么情况?可能(在某些帧中)没有找到人脸,因此眼睛是无的,因此x,y,w,h(需要是roi切片的整数)的类型错误。因此,你可能/可能只需要处理这些异常情况。你能发布你的两个示例图像吗?这些是图像:很抱歉,我没有理解你想说的。我刚刚用一些好的信息编辑了这篇文章,可能会有所帮助!感谢您的时间,您不应该使用纯except语句-也许至少打印一条警告?:)很抱歉,我没有理解你想说的。我刚刚用一些好的信息编辑了这篇文章,也许它能帮上忙!感谢您的时间,您不应该使用纯except语句-也许至少打印一条警告?:)如果图像(框架)中没有眼睛,会发生什么?当您开始将此应用于视频时,这种情况必然会发生。为什么不直接执行
roi=img[y:y+h,x:x+w]
?您也可以将
img
直接传递到检测器中,而不是每次都复制一份图像(帧)中没有眼睛会发生什么情况?当您开始将此应用于视频时,这种情况必然会发生。为什么不直接执行
roi=img[y:y+h,x:x+w]
?您也可以将
img
直接传递到检测器中,而不是每次都复制一份