2012-05-06 2 views
1

Я пытаюсь использовать android-opencv 2.3.1 для распознавания кругов (монет) на изображении. Однако возникает ошибка (org.opencv.cvException), выполняя метод Imgproc.cvtColor.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); 

Что я делаю неправильно? сотового телефона: 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); 

ответ

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

Edit: теперь, вероятно, проблема заключается в том, как вы читаете изображения и преобразования в Mat. Я хотел бы заменить этот

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

этим

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

, а затем убедитесь, что mImg.rows() возвращает правильное значение. Пожалуйста, дайте мне знать, как это происходит.

+0

Я внесла изменения, но по-прежнему дает ту же ошибку. –

+0

Можете ли вы обновить свой вопрос, пожалуйста? возможно, просто добавьте новый переработанный код, чтобы мы теперь посмотрели, как он выглядит. – fireant

+0

Несомненно. Я отправлю свой код ниже. –

Смежные вопросы