簡體   English   中英

將重疊矩形與 OpenCV 合並

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM