使用Python时,
openCV 函数
cv.HaarDetectObjects()
返回找到的对象以及检测分数。
如果我改用 opencv2 函数,
cv2.CascadeClassifier.detectMultiScale()
我得到检测到的物体,但没有得分。这使得难以获得良好的检测“置信度”度量。
有没有办法以某种方式使用CV2?
使用Python时,
openCV 函数
cv.HaarDetectObjects()
返回找到的对象以及检测分数。
如果我改用 opencv2 函数,
cv2.CascadeClassifier.detectMultiScale()
我得到检测到的物体,但没有得分。这使得难以获得良好的检测“置信度”度量。
有没有办法以某种方式使用CV2?
根据文档
cv2.CascadeClassifier.detectMultiScale(image, rejectLevels, levelWeights[, scaleFactor[, minNeighbors[, flags[, minSize[, maxSize[, outputRejectLevels]]]]]]) → objects
该列表rejectLevels
是表示检测结果置信度的分数。
相应的(但未记录的)C++ API是:
CV_WRAP virtual void detectMultiScale( const Mat& image,
CV_OUT vector<Rect>& objects,
vector<int>& rejectLevels,
vector<double>& levelWeights,
double scaleFactor=1.1,
int minNeighbors=3, int flags=0,
Size minSize=Size(),
Size maxSize=Size(),
bool outputRejectLevels=false );
您可以通过以下代码在 %100 到 %99 之间找到权重百分比:
cascade_01 = cv2.CascadeClassifier(<type here path of .xml file>)
found_object = cascade_01.detectMultiScale(image_gray, scaleFactor=1.05, minNeighbors=15, minSize=(20, 20))
score_rejlevels= cascade_01.detectMultiScale3(image_gray, outputRejectLevels=True)
if len(found_object) != 0:
if len(score_rejlevels[2]) <2:
if len(score_rejlevels[2])!=0:
score=100-1/float(score_rejlevels[2])
print(score)
我知道这是一个非常古老的问题,但是有一个未回答的评论:可以使用detectMultiScale3
接受outputRejectLevels
布尔参数并返回置信度分数的方法。
weights='data/haarcascades/haarcascade_frontalface_alt.xml'
face_cascade = cv2.CascadeClassifier()
face_cascade.load(cv2.samples.findFile(weights))
face_cascade.detectMultiScale3(image, outputRejectLevels=True)