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)