###実現したいこと
OpenCV for Androidを用いて、物体認識を行いたい。
具体的にはfindContoursで輪郭を検出し、完全に囲われている部分を切り取って物体と認識する。
###問題点
findContoursで輪郭を検出したいのですが、肝心の輪郭が途切れてしまっています。(画像参照)
特にコップのような物体だと検出が難しく、画像の左の辺などはほぼ検出されていません。
###試したこと
以下ににコードを掲載しますが、
- medianBlurで画像をぼかし、ノイズを消す
- morphologyExでノイズを消す
- dilateで輪郭を強調
- adaptiveThresholdで二値化
- thresholdで二値化
- Cannyでで二値化
- findContoursで輪郭を検出
と、前処理はしっかりと行っているはずなのにうまくいきません。
Kotlin
1fun Image_Conversion() { 2val bitmap = imageView.drawable.toBitmap() 3 val mat = Mat() 4 var mat_bin = Mat() 5 var counter = arrayListOf<MatOfPoint>() 6 var hiert = Mat() 7 var output = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888) 8 9Imgproc.cvtColor(mat, mat_bin, Imgproc.COLOR_RGB2GRAY) 10Imgproc.medianBlur(mat_bin, mat_bin, 7) 11 12 Imgproc.morphologyEx(mat_bin, mat_bin, Imgproc.MORPH_OPEN, Mat()) 13 Imgproc.dilate(mat_bin, mat_bin, Imgproc.getStructuringElement(Imgproc.MORPH_RECT, Size(5.0, 5.0))) 14 15 Imgproc.adaptiveThreshold(mat_bin, mat_bin, 255.0, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY_INV, 13, 19.0) 16 17 Imgproc.threshold(mat_bin, mat_bin, 0.0, 255.0, Imgproc.THRESH_BINARY_INV or Imgproc.THRESH_OTSU) 18 19 Imgproc.Canny(mat_bin, mat_bin, 20 Imgproc.threshold(mat_bin, mat_bin, 0.0, 255.0, Imgproc.THRESH_BINARY_INV or Imgproc.THRESH_OTSU) * 0.5, 21 Imgproc.threshold(mat_bin, mat_bin, 0.0, 255.0, Imgproc.THRESH_BINARY_INV or Imgproc.THRESH_OTSU), 22 3, true) 23 24 Imgproc.findContours(mat_bin, counter, hiert, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_NONE) 25}
これを解決するにはどうすればいいでしょうか?
点群は一応コップの輪郭を表せているので点群をいい感じに曲線で結ぶような方法でもあれば簡単なのですけどね。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。