cv::findContours函数返回每个轮廓作为点的向量(请参见http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#findcontours)。
您需要自己将这些向量转换为您的数据结构(Component),就像我创建的这个最小示例一样:
#include <opencv2/opencv.hpp>
#include <iostream>
struct Component
{
cv::Rect boundingBox;
double area;
double circularity;
};
int main()
{
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);
cv::Mat cannyEdges;
cv::Canny(image, cannyEdges, 80, 60);
cv::imshow("img", image);
cv::imshow("cannyEdges", cannyEdges);
cv::vector<cv::Vec4i> hierarchy;
typedef cv::vector<cv::vector<cv::Point> > TContours;
TContours contours;
cv::findContours(cannyEdges, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);
std::cout << "Found " << contours.size() << " contours." << std::endl;
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;
components.push_back(c);
}
for (TComponents::const_iterator it( components.begin() ); it != components.end(); ++it)
std::cout << it->area << std::endl;
cv::waitKey();
}