Android findContours 上的 OpenCV 抛出异常

Posted

技术标签:

【中文标题】Android findContours 上的 OpenCV 抛出异常【英文标题】:OpenCV on Android findContours throws Exception 【发布时间】:2012-09-17 10:33:06 【问题描述】:

我在 android 上使用 OpenCV 2.4.0 并尝试在二进制图像中查找轮廓。

List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Mat mIntermediateMat = new Mat();
Imgproc.Canny(img, mIntermediateMat, 50, 100);
Imgproc.findContours(mIntermediateMat, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);

但该函数会抛出“函数 CvMat 中无法识别或不支持的数组类型...”异常。

我也试试这个垫子作为输入:

Mat mIntermediateMat = new Mat(height, width, CvType.CV_8UC1, new Scalar(0));

但我得到了同样的例外。

【问题讨论】:

我想我找到了问题所在。输入 Mat 的大小 ist to large。 【参考方案1】:

试试这个功能找轮廓:

public static ArrayList<Rect> detection_contours(Mat outmat) 
    Mat v = new Mat();
    Mat vv = outmat.clone();
    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
    Imgproc.findContours(vv, contours, v, Imgproc.RETR_LIST,
            Imgproc.CHAIN_APPROX_SIMPLE);

    double maxArea = 100;
    int maxAreaIdx = -1;
    Rect r = null;
    ArrayList<Rect> rect_array = new ArrayList<Rect>();

    for (int idx = 0; idx < contours.size(); idx++) 
        Mat contour = contours.get(idx);
        double contourarea = Imgproc.contourArea(contour);
        if (contourarea > maxArea) 
            // maxArea = contourarea;
            maxAreaIdx = idx;
            r = Imgproc.boundingRect(contours.get(maxAreaIdx));
            rect_array.add(r);
          //  Imgproc.drawContours(imag, contours, maxAreaIdx, new Scalar(0,0, 255));
        

    

    v.release();

    return rect_array;


【讨论】:

【参考方案2】:

确保在 Canny() 调用之后,您的 mIntermediateMat 的类型为 CvType.CV_8*

【讨论】:

但是Mat mIntermediateMat = new Mat(height, width, CvType.CV_8UC1, new Scalar(0));应该工作吗? 如果是在canny之后应该。如果仍有问题,请发布完整的错误消息。 在 Canny 之后的图像类型是 CV_8UC1。和 Mat mIntermediateMat = new Mat(height, width, CvType.CV_8UC1, new Scalar(0));取代了精明。完整的错误消息是:“CvException [org.opencv.core.CvException: ../modules/core/src/array.cpp:2482: error: (-206) Unrecognized or unsupported array type in function CvMat* cvGetMat(const CvArr*, CvMat*, int*, int)"

以上是关于Android findContours 上的 OpenCV 抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

为啥openCV中的输入图像findContours()要转灰度?

Android opencv轮廓检测

Android O 上的 android.intent.action.SEND - URI 包含 file:// 网址而不是 content://

值得你关注的Android8.0(Android O)上的重要变化

Google I/O 大会上的 Android Things 亮点汇总

OpenCV cv::findcontours *** 异常