我正在尝试使用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);
我究竟做错了什么?
手机:三星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);
最佳答案
我不是Java程序员,但是可以在您的代码中看到两个问题。首先,不应将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()
返回正确的值。请让我知道怎么回事。