私はopenCVが初めてで、Android用に提供されているサンプルに取り組んでいます。
私の目標は色の塊を検出することなので、色の塊の検出サンプルから始めました。
カラー画像をグレースケールに変換してから、バイナリしきい値を使用してしきい値処理しています。
背景は白、ブロブは黒です。それらの黒い塊を検出したい。また、輪郭をカラーで描きたいのですが、画像が白黒なのでできません。
グレースケールでこれを達成することができましたが、輪郭の描画方法は好みません。色の許容範囲が高すぎて、輪郭が実際のブロブよりも大きいようです (ブロブが小さすぎる可能性がありますか?)。私が話しているこの「許容範囲」は setHsvColor と関係があると思いますが、その方法はよくわかりません。
前もって感謝します!よろしくお願いします
より多くの情報を更新
追跡したい画像は、インクスプリットです。黒いインクの裂け目がある白い紙を想像してみてください。今はリアルタイム(カメラビュー)でやっています。実際のアプリは写真を撮り、その写真を分析します。
上で述べたように、openCV GitHub リポジトリから color-blob-detection サンプル (android) を取得しました。そして、このコードをonCameraFrameメソッドに追加します (リアルタイムで白黒に変換するため) 変換が行われるため、インクが黒、青、赤のいずれであってもかまいません。
mRgba = inputFrame.rgba();
/**************************************************************************/
/** BLACK AND WHITE **/
// Convert to Grey
Imgproc.cvtColor(inputFrame.gray(), mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
Mat blackAndWhiteMat = new Mat ( H, W, CvType.CV_8U, new Scalar(1));
double umbral = 100.0;
Imgproc.threshold(mRgba, blackAndWhiteMat , umbral, 255, Imgproc.THRESH_BINARY);
// convert back to bitmap for displaying
Bitmap resultBitmap = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
blackAndWhiteMat.convertTo(blackAndWhiteMat, CvType.CV_8UC1);
Utils.matToBitmap(blackAndWhiteMat, resultBitmap);
/**************************************************************************/
これは最善の方法ではないかもしれませんが、うまくいきます。
ここで、黒いブロブ (インクの分裂) を検出したいと考えています。Logcat(サンプルアプリのログエントリ)が検出された輪郭の数をスローするため、それらが検出されたと思いますが、画像が白黒で、輪郭を赤くしたいなどの理由でそれらを見ることができません。
そして、これがRGBを使用して取得したものです(白黒画像ではなく、そのままの色のブロブ検出)。小さなブロブが検出されないことに注意してください。(検出できるか、小さすぎるか)
ご協力いただきありがとうございます!さらに情報が必要な場合は、この質問を喜んで更新します
更新: color-blob-detection サンプルの GitHub リポジトリ (2 番目の画像)