2012-11-30 85 views
4

我使用2.4.3版本的OpenCV,并试图用“findContours”功能Canny边缘检测这样的后:OpenCV的:findContours功能错误

struct Component 
{ 
    cv::Rect boundingBox; 
    double area; 
    double circularity; 
} 

cv::vector <Component> components; 
cv::vector <cv::Vec4i> hierarchy; 
cv::findContours (cannyEdges, components, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE); 

然后,它抛出了一行行的错误“CV :: findContours”像这样:

OpenCV Error: Assertion failed (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1((type0) & fixedDepthMask) != 0)) in unknown function, file ...\opencv\modeuls\core\src\matrix.cpp, line 1421 

我怎样才能解决这个问题?

+1

我们不能用你给我们重现错误。请提供[简短,独立,正确(可编译),示例](http://sscce.org/)。 – karlphillip

+0

@karlphillip:该链接为+1 –

回答

11

cv :: findcontours将每个轮廓返回为点的向量(请参见http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#findcontours)。

你有这些载体自己像我创造了这个小例子,转换成你的数据结构(组件):

#include <opencv2/opencv.hpp> 
#include <iostream> 
struct Component 
{ 
    cv::Rect boundingBox; 
    double area; 
    double circularity; 
}; 
int main() 
{ 
    // Create a small image with a circle in it. 
    cv::Mat image(256, 256, CV_8UC3, cv::Scalar(0, 0, 0)); 
    cv::circle(image, cv::Point(80, 110), 42, cv::Scalar(255,127, 63), -1); 

    // Find canny edges. 
    cv::Mat cannyEdges; 
    cv::Canny(image, cannyEdges, 80, 60); 

    // Show the images. 
    cv::imshow("img", image); 
    cv::imshow("cannyEdges", cannyEdges); 

    // Find the contours in the canny image. 
    cv::vector<cv::Vec4i> hierarchy; 

    // "Each contour is stored as a vector of points." 
    // http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#findcontours 
    typedef cv::vector<cv::vector<cv::Point> > TContours; 
    TContours contours; 
    cv::findContours(cannyEdges, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE); 
    // cannyEdges is destroyed after calling cv::findContours 

    // Print number of found contours. 
    std::cout << "Found " << contours.size() << " contours." << std::endl; 

    // Convert contours to Components. 
    typedef cv::vector<Component> TComponents; 
    TComponents components; 
    for (TContours::const_iterator it(contours.begin()); it != contours.end(); ++it) 
    { 
     Component c; 
     c.area = cv::contourArea(*it); 
     c.boundingBox = cv::boundingRect(*it); 
     c.circularity = 0.0; // Insert whatever you mean by circularity; 
     components.push_back(c); 
    } 

    for (TComponents::const_iterator it(components.begin()); it != components.end(); ++it) 
     std::cout << it->area << std::endl; // and whatever you want. 

    // Wait for user input. 
    cv::waitKey(); 
} 
+0

亲爱的Dobi:非常感谢您的回答。我试过你的代码,它给出了“typedef cv :: vector(...)”这一行的错误,并说“错误:类模板的参数列表”std :: vector“丢失”。由于互联网访问问题,我很晚才回复。 –

+0

我想你正在使用一个较旧的编译器,它不支持模板类型中的>>。我在上面的代码中纠正了这一点,例如,我制作了“typedef cv :: vector > TContours;”到“typedef cv :: vector > TContours;”。请再试一次。 –

+0

非常感谢你!现在它工作正常。 –