web-dev-qa-db-ja.com

opencv 3、blobdetection、関数/機能はdetectAndComputeに実装されていません()

Opencv 3に問題があります。凸性と真円度によるフィルターを使用しようとしている、機能検出器SimpleBlobDetectorを使用したいと思います。しかし、コードを実行しようとすると、次のエラーが追跡されます。

関数/機能はdetectAndComputeに実装されていません()

その後、アプリケーションがクラッシュします。

私はインターネットで情報を検索しましたが、関連する答えはありませんでした。 Opencvの3番目のバージョンがこのバグの原因である可能性があると思います。なぜなら、私は検出器を良い方法で使用していることを知っており(公式のopencvチュートリアルとまったく同じように試しました)、SimpleBlobDectorが3番目のバージョン用に変更されていることに気づきました。

ブレークポイントを使用すると、次の行がクラッシュすることがわかります。

detector.detect(gray、keypoints);

SimpleBlobDetectorは(create関数を使用して)作成および構成されており、グレーイメージは空ではなく、検出前にキーポイントベクトルを入力する必要はありません。

QtCreatorを使用してMinGWでコンパイルされたopencv3.0.0を使用しています。 opencv処理は、メインスレッドから起動されません。

他の誰かが同じ問題を抱えていましたか?別のクラスを使用してパッチまたは別のソリューションを入手できれば幸いです。私は本当に凸面を使用してブロブをフィルタリングする必要があり、見つけた他の検出器(FeatureDetectorまたはBrisk)は構成できず、凸面を計算するための面積または完全度パラメーターを持たないキーポイントのみを返します。

前もって感謝します

10
Vincent Lartaud

これは解決されたように見えますが、おそらくそれは他の誰かを助けます。私も同じ問題を抱えていました。私は次のようなブロブ検出器を作成しました:

_cv::SimpleBlobDetector detector;
detector.create(params);
detector.detect( img, keypoints );
_

これはエラーで終わりました:The function/feature is not implemented () in detectAndCompute

しかし、私がこのようにそれを試したとき:

_cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params); 
detector->detect( img, keypoints );
_

これですべてが期待どおりに機能します。

それは本当に奇妙です、そして誰かがなぜそのように働いているのか知っているなら私に知らせてください。

16
benderto

これは、OpenCV 3.Xを使用しているためです。ここで、(この記事の執筆時点では)オンラインで見つかるすべての例でOpenCV2.Xが使用されています。

ただし、掘り下げてみると、移行ガイドが見つかります: http://docs.opencv.org/master/db/dfa/tutorial_transition_guide.html#tutorial_transition_hints_headers

それはあなたが使用する必要があると言います:

Ptr<SomeAlgo> algo = makePtr<SomeAlgo>(...);
Ptr<SomeAlgo> algo = SomeAlgo::create(...);

の代わりに:

SomeAlgo algo(); // bad

したがって、この場合、次を使用する必要があります。

Ptr<SimpleBlobDetector> d = SimpleBlobDetector::create();

または:

Ptr<SimpleBlobDetector> d = SimpleBlobDetector::create(params);

あなたがパラメータを持っているなら。

13
David Wolever

返信ありがとうございます。

私はdetectを使用します(前のメッセージで言ったように)。検出関数はおそらくdetectAndComputeを使用していると思います。

メソッドがまだ修正されておらず、記述子が原因であるという開発者のメモを見つけるまで、Emgu(opencvのC#バージョン)で同等の問題がすでに発生していたため、記述子の欠如が実際に問題になる可能性があります。

同じ問題を抱えている他の人のために、私はついにブロブ検出器の代わりにcv :: findContoursを使用しました。それは問題なく、はるかにうまく機能します。凸面検出を置き換えるために、膨らみ(形状領域/境界ボックス領域)を使用して評価できます。真円度を置き換えるには、次の式を使用します。

円の面積/境界ボックスの面積= PI/4

これが他の人にも期待されることを願っています。

2
Vincent Lartaud

DetectAndCompute(...)ではなく、detect(...)を使用してください。ブロブ検出用に定義された機能記述子はありません。

ここを参照してください: https://stackoverflow.com/a/11079868/1611317

0
Viatorus