2012-09-17 107 views
1

我在Android上使用OpenCV 2.4.0並嘗試在二進制文件中查找輪廓。Android上的OpenCV findContours拋出異常

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

,但我得到了同樣的異常。

+0

我想我找到了問題。輸入Mat的大小很大。 – ChHaupt

回答

0

確保坎尼()調用之後,你mIntermediateMat是類型CvType.CV_8的*

+0

但Mat mIntermediateMat = new Mat(height,width,CvType.CV_8UC1,new Scalar(0));應該管用? – ChHaupt

+0

它應該是在canny之後。如果您仍有問題,請發佈完整的錯誤消息。 –

+0

在Canny之後,圖像類型是CV_8UC1。 Mat mIntermediateMat = new Mat(height,width,CvType.CV_8UC1,new Scalar(0));取代了canny。完整的錯誤消息是:「CvException [org.opencv.core.CvException:../modules/core/src/array.cpp:2482:error:(-206)無法識別或不支持的函數數組類型CvMat * cvGetMat(const CvArr *,CvMat *,int *,int)「 – ChHaupt

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; 

}