前提・実現したいこと
Android StudioにてOpenCV for Androidを用い、端末内の画像を読み取り、直線検出を行ったのち、元画像にその直線全ての上に赤線を表示させる動作の実現を目指しています。
発生している問題・エラーメッセージ
五線譜の実線だけが引かれた画像をサンプルとして用いたのですが、直線が一本だけしか検出されず他の直線の上に赤線が引かれていません。
サンプル
エッジ検出までの実行結果
実行結果
初心者なため、おかしなコードの書き方をしているかもしれませんが、何卒訂正、解決策をご教授いただければ幸いです。
エラーメッセージ
該当のソースコード
java
1 2import android.content.Intent; 3import android.graphics.Bitmap; 4import android.graphics.BitmapFactory; 5import android.net.Uri; 6import android.os.Bundle; 7import android.os.ParcelFileDescriptor; 8import android.support.v7.app.AppCompatActivity; 9import android.view.View; 10import android.widget.ImageView; 11 12import org.opencv.android.Utils; 13import org.opencv.core.Mat; 14import org.opencv.core.Point; 15import org.opencv.core.Scalar; 16import org.opencv.imgproc.Imgproc; 17 18import java.io.FileDescriptor; 19import java.io.IOException; 20 21public class MainActivity extends AppCompatActivity { 22 private static final int RESULT_PICK_IMAGEFILE = 1000; 23 private ImageView imageView; 24 Bitmap btmp; 25 Bitmap rtn_btmap; 26 27 static { 28 System.loadLibrary("opencv_java3"); 29 } 30 31 @Override 32 protected void onCreate(Bundle savedInstanceState) { 33 super.onCreate(savedInstanceState); 34 setContentView(R.layout.activity_main); 35 36 imageView = (ImageView) findViewById(R.id.image_view); 37 38 findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { 39 @Override 40 public void onClick(View v) { 41 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); 42 intent.addCategory(Intent.CATEGORY_OPENABLE); 43 intent.setType("image/*"); 44 startActivityForResult(intent, RESULT_PICK_IMAGEFILE); 45 } 46 }); 47 } 48 49 protected void onRestart() { 50 super.onRestart(); 51 onImageScan(); 52 } 53 54 public void onActivityResult(int requestCode, int resultCode, Intent resultData) { 55 if (requestCode == RESULT_PICK_IMAGEFILE && resultCode == RESULT_OK) { 56 Uri uri = null; 57 if (resultData != null) { 58 uri = resultData.getData(); 59 60 try { 61 Bitmap bmp = getBitmapFromUri(uri); 62 imageView.setImageBitmap(bmp); 63 btmp = Bitmap.createBitmap(bmp); 64 } catch (IOException e) { 65 e.printStackTrace(); 66 } 67 } 68 } 69 } 70 71 public Bitmap getBitmapFromUri(Uri uri) throws IOException { 72 ParcelFileDescriptor parcelFileDiscriptor = getContentResolver().openFileDescriptor(uri, "r"); 73 FileDescriptor fileDescriptor = parcelFileDiscriptor.getFileDescriptor(); 74 Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor); 75 parcelFileDiscriptor.close(); 76 return image; 77 } 78 79 private void onImageScan() { 80 Mat mat = new Mat(); 81 Utils.bitmapToMat(btmp, mat); 82 83 mat = getThreshold(mat); 84 rtn_btmap = Bitmap.createBitmap(mat.width(), mat.height(), Bitmap.Config.ARGB_8888); 85 Utils.matToBitmap(mat, rtn_btmap); 86 imageView.setImageBitmap(rtn_btmap); 87 } 88 89 private Mat getThreshold(Mat mat) { 90 Imgproc.cvtColor(mat, mat, Imgproc.COLOR_BGR2GRAY); 91 Imgproc.threshold(mat, mat, 225, 255, Imgproc.THRESH_BINARY_INV); 92 Imgproc.Canny(mat,mat,10,225,3,true); 93 Mat linesMat = new Mat(); 94 Imgproc.HoughLinesP(mat, linesMat, 1, Math.PI / 180, 300); 95 Mat bmpmat = new Mat(); 96 Utils.bitmapToMat(btmp, bmpmat); 97 double[] data; 98 Point pt1 = new Point(); 99 Point pt2 = new Point(); 100 for (int i = 0; i < linesMat.cols(); i++){ 101 data = linesMat.get(0, i); 102 pt1.x = data[0]; 103 pt1.y = data[1]; 104 pt2.x = data[2]; 105 pt2.y = data[3]; 106 Imgproc.line(bmpmat, pt1, pt2, new Scalar(255, 0, 0), 1); 107 } 108 return (bmpmat); 109 } 110} 111
試したこと
HoughLinesP()内のthresholdの値等のパラメータ調整を行ってみましたが、赤線が引かれる直線の位置が変化するのみででした。
このサイト様(http://google-os.blog.jp/archives/50716505.html)を参考にしHoughLinesP~Imgproc.lineの処理を置き換えて見たところ下記のエラーが出ました。(4890fcd826a22845b8803bb923300310.jpeg)
Caused by: java.lang.UnsupportedOperationException:Provided data element number (2) should be multiple of the Mat channels count (4)
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー