[英]Merging overlapping rectangle with OpenCV
我同時使用兩種 Haar 級聯算法(正面和側面)和 OpenCV 來改進人臉檢測。
不幸的是,檢測無法正常工作,我不知道如何修復它。 返回值是 2(在一張有 5 張人臉的圖片上,正常檢測到)並且所有的矩形都消失了。
這是預期的結果(沒有重疊的矩形):
如果您想自己進行測試,這是原始圖片(以及result.jpg)。
這是代碼:
import cv2
import numpy as np
image=cv2.imread("/home/pi/Downloads/test.jpg")
face_cascade=cv2.CascadeClassifier("/home/pi/opencv-3.4.0/data/haarcascades/haarcascade_frontalface_alt.xml")
profil_cascade=cv2.CascadeClassifier("/home/pi/opencv-3.4.0/data/haarcascades/haarcascade_profileface_alt.xml")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
face=face_cascade.detectMultiScale(gray, 1.06, 5)
profil=profil_cascade.detectMultiScale(gray, 1.1, 5)
combined_array=np.append(face, profil, axis=0)
combined_list=combined_array.tolist()
result=cv2.groupRectangles(combined_list,2)
print("I've found "+str(len(result))+ " face(s)")
for (x,y,w,h) in result[0]:
cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)
cv2.imwrite("/home/pi/Download/result.jpg", image)
非最大抑制算法用於解決檢測結果重疊的問題。 pyimagesearch有一篇關於它的非常好的文章和代碼,可以讓你朝着正確的方向前進。
經過大量研究,我已經部分解決了這個問題。
我已經改變了閾值和的EPS result=cv2.groupRectangles
和我也使在減法print
功能之間測得的總的面部的數量(在combined_list)和重疊的檢測次數(由結果返回)
這是新代碼:
import cv2
import numpy as np
image=cv2.imread("/home/pi/Downloads/test.jpg")
face_cascade=cv2.CascadeClassifier("/home/pi/opencv-3.4.0/data/haarcascades/haarcascade_frontalface_alt.xml")
profil_cascade=cv2.CascadeClassifier("/home/pi/opencv-3.4.0/data/haarcascades/haarcascade_profileface_alt.xml")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
face=face_cascade.detectMultiScale(gray, 1.06, 5)
profil=profil_cascade.detectMultiScale(gray, 1.1, 5)
combined_array=np.append(face, profil, axis=0)
combined_list=combined_array.tolist()
result=cv2.groupRectangles(combined_list,1,0.85)
print("I've found "+str(len(combined_list)-str(len(result[1]))+ " face(s)")
for (x,y,w,h) in result[0]:
cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),2)
cv2.imwrite("/home/pi/Download/result.jpg", image)
最后,程序給了我正確的面數 (5) 並重繪重疊矩形(這是個好消息),但非重疊矩形已經消失......
我試着通過使用來解決這個np.subtract
之間從combined_list和結果的坐標,然后繪制矩形失蹤與for (x,y,w,h) in np.subtract[0]
但它沒有工作. 原因是重疊矩形的坐標點是直接重新計算的,所以不能和原來的坐標點做減法
如果有人有解決此問題的想法,請不要猶豫:)
openCV 函數 groupRectangles 需要 3 個輸入。
1) rectList : 矩形向量
2) groupthreshold :最小可能的矩形數減 1
3) eps : 矩形邊之間的相對差以將它們合並為一組
您的代碼:
result=cv2.groupRectangles(combined_list,1,0.85)
從您的代碼中,您已將 groupthreshold 參數設置為 1,這將拒絕具有一個矩形的所有集群。 將此參數設置為 0,您應該會得到您想要的結果。
解決方案:
result=cv2.groupRectangles(combined_list,0,0.85)
詳細解釋如下:( https://docs.opencv.org/3.4/d5/d54/group__objdetect.html#ga3dba897ade8aa8227edda66508e16ab9 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.