1

android-opencv 2.3.1を使用して、画像内の円(コイン)を認識しようとしています。ただし、メソッドImgproc.cvtColorを実行すると、エラー(org.opencv.cvException)が発生します。

File imgFile = new File(Environment.getExternalStorageDirectory() + "/test.jpg");
imageBmp = BitmapFactory.decodeFile(imgFile.getAbsolutePath());

Mat mImg = new Mat();
mImg = Utils.bitmapToMat(imageBmp);        
Mat mGray = new Mat(mImg.rows(), mImg.cols(), CvType.CV_8UC1, new Scalar(0));
Imgproc.cvtColor(mImg , mGray, Imgproc.COLOR_BGRA2GRAY, 4); 
Imgproc.GaussianBlur( mGray , mGray , new Size(9, 9), 2, 2);
Mat circles = new Mat();
Imgproc.HoughCircles(mGray , circles, Imgproc.CV_HOUGH_GRADIENT, 1d, (double)  
                    mGray.height() / 70, 200d, 100d);   

私は何が間違っているのですか?携帯電話:Samsung Galaxy S i9000


新しいコードで質問を更新するだけです。「Imgproc.cvtColor」メソッドでも同じエラーが発生します。

File imgFile = new File(Environment.getExternalStorageDirectory() + "/test.jpg");
imageBmp = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
Mat mImg = new Mat();
mImg = Utils.bitmapToMat(imageBmp);
Mat mGray = new Mat(mImg.rows(), mImg.cols(), CvType.CV_8UC1);
Imgproc.cvtColor(mImg, mGray, Imgproc.COLOR_BGRA2GRAY);
Imgproc.GaussianBlur(mGray, mGray, new Size(9, 9), 2, 2);
Mat circleImage = new Mat(mGray.rows(), mGray.cols(), CvType.CV_8UC1);
Imgproc.HoughCircles(mGray, circleImage, Imgproc.CV_HOUGH_GRADIENT, 1d,
         (double) mGray.height() / 70, 200d, 100d);
4

1 に答える 1

2

私は Java プログラマーではありませんが、あなたのコードには 2 つの問題があります。まず、cvtColor() の最後の引数の値は 4 であってはなりません。これを変更します。

Imgproc.cvtColor(mImg , mGray, Imgproc.COLOR_BGRA2GRAY, 4);

これに

Imgproc.cvtColor(mImg , mGray, Imgproc.COLOR_BGRA2GRAY);

BGRA からグレースケールに変換しているので、宛先 ( mGray) が単一チャネルであることがわかります。

第二に、なぜあなたはに渡しnew Scalar(0)ます

Mat mGray = new Mat(mImg.rows(), mImg.cols(), CvType.CV_8UC1, new Scalar(0));

? それはおそらく物事を台無しにしています。イメージにメモリを割り当てるコンストラクタを呼び出します。

Mat mGray = new Mat(mImg.rows(), mImg.cols(), CvType.CV_8UC1);

編集:おそらく問題は、画像を読み取って に変換する方法にありますMat。私はこれを交換します

imgFile.getAbsolutePath()
mImg = Utils.bitmapToMat(imageBmp);

これで

Mat mImg = Highgui.imread(imgFile.getAbsolutePath());

次にmImg.rows()、正しい値が返されることを確認します。それがどうなるか教えてください。

于 2012-05-06T06:38:54.223 に答える