問題タブ [opencv-contour]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
114 参照

opencv - 正しいロジックにもかかわらず、特定の値より小さい輪郭が輪郭のリストから削除されません。なんで?

私はこの画像から始めました:

ここに画像の説明を入力

次に、Canny Edge Detector を次のように適用しました。

私が得た:

ここに画像の説明を入力

次に、 によって等高線のリスト ( ) を見つけました。次にcontoursImgproc.findContours()(1) 最大の等高線 ( ) の領域を見つけるためのコーディングを行いました(2)未満の面積を持つ等高線maximumContourAreaから削除します。質問の下部にあるコード。contoursmaximumContourArea

元の画像に緑色の(残りの)輪郭Imgproc.drawContours()を描画するために呼び出した

私が期待していたのは、それらすべての小さな汚れとノイズの輪郭を輪郭リストから削除する必要があるということでしcontoursたが、代わりにこのマットを取得しました(これらの小さな汚れの周りにも緑色の輪郭が描かれています):

ここに画像の説明を入力

さらに、Log.i()次のコードのメッセージはこれを出力します。

最初の輪郭の数: 27

処理後の輪郭の数: 27




編集:

  1. に置き換えまし(10/100)0.1が、実際にはわかりやすくする0.5ために、この例ではむしろ を使用することにしました。このようにして、最大の等高線の面積の半分よりも小さいすべての等高線を削除する必要があります。

  2. そのため、あちこちでいくつかのLog.iステートメントを実行した後、2 番目の while ループが実行されていないことに気付きました。いくつかいじってIteratorからforeachループに降りた後、私は取得ConcurrentModificationExceptionしていたので、次のように解決策がループであることが最終的にわかりましたfor

問題: (a) それでも同じMats が得られますが、次のコード スニペットと、このページの下部にある logcat 出力からmaximumContourAreaの s の値とs の値を見るとcurrentContourArea、面積のある 1 つの等高線しかないことに気付くでしょう。の1719.0残り、その他はすべて削除する必要があります。(b) 次のコードの後の Logcat 出力を参照してください。

コードが変更されました:

ログキャット出力:


OKのメソッドは削除されたもの (輪郭) を返すため、に置き換えcontours.remove(currentContour);ました。(ソースLog.i(TAG, "PNM A contour with an area of " + Imgproc.contourArea(contours.remove(currentContour)) + " is being removed.");ArrayListremove()

currentContour--;私もこの声明の後に付け加えました。

Logcat メッセージは次のとおりです。

^ 動作しているようです。現在残っている唯一の問題は、元の画像に緑色の輪郭を描画するために最後に実行されたときに、すべての輪郭が描画されるのはなぜですか (それらの小さな汚れを巻き付けたものでも) 。drawContours()

0 投票する
1 に答える
1445 参照

python - 識別機能付きのopencvモーショントラッカー

現在、次のスクリプトは完全に正常に動作しますが、各長方形のバインドされたボックスに識別子を付けたいと考えています。

たとえば、次の画像があるとします。

4 つの長方形の境界のそれぞれをオブジェクトとして識別できるようにしたいと考えています。(つまり、左端はダイヤの女王カードのバインドされたボックスで、右端はハートのエース カードのバインドされたボックスです)

今、私はどうしたらこれを達成できるのか途方に暮れており、誰かが私にインスピレーションを与えることができるかどうか疑問に思っています.

0 投票する
1 に答える
1728 参照

c++ - 輪郭が別の輪郭の内側に存在するかどうかを検索します

openCV で vector(vector(Points)) として定義されている OUTERCONT と INNERCONT の 2 つの輪郭ベクトルがあります。ある輪郭が別の輪郭内に存在するかどうかを確認したい.各OUTERCONT内にいくつの輪郭が存在するかも知りたい. 現在、各輪郭の周りに minEnclosingRect を描画し、次のことを確認しています。

これは機能していないようです。カウントは常に 120 前後の数値として返されますが、これは正しくありません。これを正しく機能させるための変更を提案できますか?

注: 階層は使用できません。これは、2 つの異なる関数から返される 2 つの別個の輪郭セットであるためです。

PointPloygon テストがオプションであることは知っていますが、これを行う方法を他に提案できますか?

0 投票する
0 に答える
966 参照

opencv - Opencv 曲線の輪郭を滑らかにするにはどうすればよいですか?

曲線の輪郭を滑らかにするためにいくつかの問題に直面しています。画像処理したらこんな画像になりました。

ここに画像の説明を入力 このコードでより滑らかな曲線を取得しようとしています:

結果は次のとおりです。

https://dl.dropboxusercontent.com/u/710615/testEhhancBwColor_.jpg

「ズーム」であるこの画像でわかるように、私は成功していません。

ここに画像の説明を入力

0 投票する
1 に答える
3601 参照

c# - FindContours メソッドで見つかった等高線の階層をナビゲートしますか?

これは、OpenCV を直接使用する C++ 開発者にとって単純でなければなりません。ただし、私が使用しているのは Emgu (.NET の OpenCV ラッパー) であり、最新バージョンではCvInvoke.FindContoursvoid を返すメソッドがあり、出力結果はパラメーター参照によって渡され、タイプはVectorOfVectorOfPointです。

簡単な呼び出しは次のとおりです。

モードの場合RetrType.List、結果を配列の配列に変換し、すべての輪郭を簡単にループできます。ただし、ここでは、ツリー内のすべての輪郭をナビゲートしたいと思います。Ptrここでは、ポインター (出力結果のプロパティを介してアクセス) を使用して、ネイティブ (安全でない) C++ コードで何かを行う必要があると思います。しかし、これにはもっと .NET に適したソリューションがあるのではないかと思います。Ptrそして、ポインターを使用することが唯一の解決策である場合でも、輪郭ツリーをナビゲートするためにそれを掘り下げる方法はまだわかりません。

Emgu のインストールに付随するサンプル コードには、CvInvoke.FindContourTree代わりに を使用するスニペットがあります (これは を返しますint[,])。

0 投票する
1 に答える
2377 参照

c++ - opencvの輪郭内の子輪郭の数を数える

私はこのソース画像を持っています

ここに画像の説明を入力

これを取得するためにバイナリしきい値を適用しました

ここに画像の説明を入力

輪郭を使用して、子輪郭を持つものとそうでないものを区別しました。結果の写真は

ここに画像の説明を入力

しかし、各緑色の輪郭に含まれる子輪郭の数をどのように数えますか? これは私が使用したコードです:-

EDIT-1- 最後に Humam のコードを追加してチェックアウトしました。

しかし、私が得た出力は次のようなものでした:

0 投票する
1 に答える
296 参照

c++ - OpenCV C++、ゼロ関数を使用せずに黒い画面が表示されるのはなぜですか?

なぜラインが必要なのですか?

その行をコメントアウトし、その下の残りのコードで変数「drawing」を「img」に変更すると、実行時に黒い画面が表示されるのはなぜですか? 輪郭線以外の写真の残りの部分を黒くする、気の利いた変換された画像だけではありませんか? 私が読んだことから、ゼロ関数は画像内の行列の値を 0 に変更して黒くすることを想定しています。これにより、for ループが黒い画像の上に描画され、等高線のみが表示されます。

0 投票する
0 に答える
451 参照

android - AndroidのCameraViewでFloodFillアルゴリズム(画像処理)を適用するには?

ImageView で FloodFill アルゴリズムの実装を達成しました。しかし、私はカメラ(AndroidのSurface View)でそれを達成することができません。私はそれを行うためにOpenCVライブラリを使用しています。輪郭の概念を使用して次のコードを試しました。しかし、私は正確な結果を得ていません。

誰もがそれを行う方法について考えを持っています。前もって感謝します。