假设我有以下输出图像:
基本上,我有视频流,我想只在输出图像中获取矩形的坐标。这是我的C ++代码:
while(1)
{
capture >> frame;
if(frame.empty())
break;
cv::cvtColor( frame, gray, CV_BGR2GRAY ); // Grayscale image
Canny( gray, canny_output, thresh, thresh * 2, 3 );
// Find contours
findContours( canny_output, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
// Draw contours
Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 );
for( int i = 0; i< contours.size(); i++ )
{
Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
drawContours( drawing, contours, i, color, 2, 8, hierarchy, 0, Point() );
}
cv::imshow( "w", drawing );
waitKey(20); // waits to display frame
}
感谢。
答案 0 :(得分:3)
查看opencv文档中find轮廓函数的定义并查看参数(link):
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())
参数:here
看看轮廓,就像拉法说的那样,每个轮廓都存储在一个点矢量中,每个点矢量都存储在一个矢量中,因此,通过在外部矢量中行走,然后在内部矢量中行走,你就可以了找到你想要的分数。
但是,如果您只想检测更大的轮廓,可能需要使用CV_RETR_EXTERNAL
作为模式参数,因为它只会检测大多数外部轮廓(大矩形)。
如果您仍希望保持较小的轮廓,则可以使用CV_RETR_TREE
并使用层次结构:Using hierarchy contours
答案 1 :(得分:2)
查看documentation,OutputArrayOfArrays contours
是关键。
轮廓 - 检测到的轮廓。每个轮廓都存储为点矢量。
所以,你有vector< vector<Point> > contours
。 vector<Point>
(内部)是轮廓的坐标,每个轮廓都存储在vector
中。
例如,要知道第5个向量,它是vector<Point> fifthcontour = contours.at(4);
你在那个向量中有坐标。
您可以访问这些坐标:
for (int i = 0; i < fifthcontour.size(); i++) {
Point coordinate_i_ofcontour = fifthcontour.size();
cout << endl << "contour with coordinates: x = " << coordinate_i_ofcontour.x << " y = " << coordinate_i_ofcontour.y;
}