本文介绍了OpenCV:findContours功能错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用2.4.3版本的opencv,并尝试使用findContours函数进行canny边缘检测,如下所示:
I am using 2.4.3 version of opencv, and trying to use "findContours" function after canny edge detection like this:
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抛出一个错误:
Then it throws an error for line line "cv::findContours" like this:
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
我如何解决这个问题?
推荐答案
cv :: findcontours将每个轮廓作为点的向量返回(请参阅)。
cv::findcontours returns every contour as a vector of points (see http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#findcontours).
您必须将这些向量转换为数据结构(Component),就像我创建的这个最小例子:
You have to convert these vectors to your data structure (Component) by yourself like in this minimal example I created:
#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();
}
这篇关于OpenCV:findContours功能错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!