2012-05-06 62 views
1

我試圖使用android-opencv 2.3.1來識別圖像中的圓圈(硬幣)。 但是通過執行方法Imgproc.cvtColor發生錯誤(org.opencv.cvException)。Android OpenCv HoughCircles

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); 

我在做什麼錯? 手機:三星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); 

回答

2

我不是Java程序員,但可以在您的代碼中看到兩個問題。首先,在cvtColor()最後一個參數的值shoudn't是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的方式。我想這個

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

替換此

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

並確保mImg.rows()返回正確的值。 請讓我知道它是怎麼回事。

+0

我做了更改,但仍然給出相同的錯誤。 –

+0

你能更新你的問題嗎?也許只需添加新的修訂代碼,以便我們看到現在的樣子。 – fireant

+0

當然。我會在下面發佈我的代碼。 –

相關問題