問題タブ [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.
opencv - 正しいロジックにもかかわらず、特定の値より小さい輪郭が輪郭のリストから削除されません。なんで?
私はこの画像から始めました:
次に、Canny Edge Detector を次のように適用しました。
私が得た:
次に、 によって等高線のリスト ( ) を見つけました。次にcontours
、Imgproc.findContours()
(1) 最大の等高線 ( ) の領域を見つけるためのコーディングを行いました(2)未満の面積を持つ等高線maximumContourArea
から削除します。質問の下部にあるコード。contours
maximumContourArea
元の画像に緑色の(残りの)輪郭Imgproc.drawContours()
を描画するために呼び出した
私が期待していたのは、それらすべての小さな汚れとノイズの輪郭を輪郭リストから削除する必要があるということでしcontours
たが、代わりにこのマットを取得しました(これらの小さな汚れの周りにも緑色の輪郭が描かれています):
さらに、Log.i()
次のコードのメッセージはこれを出力します。
最初の輪郭の数: 27
処理後の輪郭の数: 27
編集:
に置き換えまし
(10/100)
た0.1
が、実際にはわかりやすくする0.5
ために、この例ではむしろ を使用することにしました。このようにして、最大の等高線の面積の半分よりも小さいすべての等高線を削除する必要があります。そのため、あちこちでいくつかの
Log.i
ステートメントを実行した後、2 番目の while ループが実行されていないことに気付きました。いくつかいじってIterator
からforeach
ループに降りた後、私は取得ConcurrentModificationException
していたので、次のように解決策がループであることが最終的にわかりましたfor
。
問題: (a) それでも同じMat
s が得られますが、次のコード スニペットと、このページの下部にある 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.");
ArrayList
remove()
currentContour--;
私もこの声明の後に付け加えました。
Logcat メッセージは次のとおりです。
^ 動作しているようです。現在残っている唯一の問題は、元の画像に緑色の輪郭を描画するために最後に実行されたときに、すべての輪郭が描画されるのはなぜですか (それらの小さな汚れを巻き付けたものでも) 。drawContours()
python - 識別機能付きのopencvモーショントラッカー
現在、次のスクリプトは完全に正常に動作しますが、各長方形のバインドされたボックスに識別子を付けたいと考えています。
たとえば、次の画像があるとします。
4 つの長方形の境界のそれぞれをオブジェクトとして識別できるようにしたいと考えています。(つまり、左端はダイヤの女王カードのバインドされたボックスで、右端はハートのエース カードのバインドされたボックスです)
今、私はどうしたらこれを達成できるのか途方に暮れており、誰かが私にインスピレーションを与えることができるかどうか疑問に思っています.
c++ - 輪郭が別の輪郭の内側に存在するかどうかを検索します
openCV で vector(vector(Points)) として定義されている OUTERCONT と INNERCONT の 2 つの輪郭ベクトルがあります。ある輪郭が別の輪郭内に存在するかどうかを確認したい.各OUTERCONT内にいくつの輪郭が存在するかも知りたい. 現在、各輪郭の周りに minEnclosingRect を描画し、次のことを確認しています。
これは機能していないようです。カウントは常に 120 前後の数値として返されますが、これは正しくありません。これを正しく機能させるための変更を提案できますか?
注: 階層は使用できません。これは、2 つの異なる関数から返される 2 つの別個の輪郭セットであるためです。
PointPloygon テストがオプションであることは知っていますが、これを行う方法を他に提案できますか?
opencv - Opencv 曲線の輪郭を滑らかにするにはどうすればよいですか?
曲線の輪郭を滑らかにするためにいくつかの問題に直面しています。画像処理したらこんな画像になりました。
結果は次のとおりです。
https://dl.dropboxusercontent.com/u/710615/testEhhancBwColor_.jpg
「ズーム」であるこの画像でわかるように、私は成功していません。
c# - FindContours メソッドで見つかった等高線の階層をナビゲートしますか?
これは、OpenCV を直接使用する C++ 開発者にとって単純でなければなりません。ただし、私が使用しているのは Emgu (.NET の OpenCV ラッパー) であり、最新バージョンではCvInvoke.FindContours
void を返すメソッドがあり、出力結果はパラメーター参照によって渡され、タイプはVectorOfVectorOfPoint
です。
簡単な呼び出しは次のとおりです。
モードの場合RetrType.List
、結果を配列の配列に変換し、すべての輪郭を簡単にループできます。ただし、ここでは、ツリー内のすべての輪郭をナビゲートしたいと思います。Ptr
ここでは、ポインター (出力結果のプロパティを介してアクセス) を使用して、ネイティブ (安全でない) C++ コードで何かを行う必要があると思います。しかし、これにはもっと .NET に適したソリューションがあるのではないかと思います。Ptr
そして、ポインターを使用することが唯一の解決策である場合でも、輪郭ツリーをナビゲートするためにそれを掘り下げる方法はまだわかりません。
Emgu のインストールに付随するサンプル コードには、CvInvoke.FindContourTree
代わりに を使用するスニペットがあります (これは を返しますint[,]
)。
c++ - OpenCV C++、ゼロ関数を使用せずに黒い画面が表示されるのはなぜですか?
なぜラインが必要なのですか?
その行をコメントアウトし、その下の残りのコードで変数「drawing」を「img」に変更すると、実行時に黒い画面が表示されるのはなぜですか? 輪郭線以外の写真の残りの部分を黒くする、気の利いた変換された画像だけではありませんか? 私が読んだことから、ゼロ関数は画像内の行列の値を 0 に変更して黒くすることを想定しています。これにより、for ループが黒い画像の上に描画され、等高線のみが表示されます。
android - AndroidのCameraViewでFloodFillアルゴリズム(画像処理)を適用するには?
ImageView で FloodFill アルゴリズムの実装を達成しました。しかし、私はカメラ(AndroidのSurface View)でそれを達成することができません。私はそれを行うためにOpenCVライブラリを使用しています。輪郭の概念を使用して次のコードを試しました。しかし、私は正確な結果を得ていません。
誰もがそれを行う方法について考えを持っています。前もって感謝します。