【问题标题】:Android OpenCv HoughCirclesAndroid OpenCv HoughCircles
【发布时间】:2014-01-12 06:42:59
【问题描述】:

我正在尝试使用 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);

【问题讨论】:

    标签: android opencv


    【解决方案1】:

    我不是 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() 返回正确的值。 请告诉我进展如何。

    【讨论】:

    • 你能更新你的问题吗?也许只是添加新修改的代码,以便我们看到它现在的样子。
    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多