Допустим, у меня есть следующее выходное изображение:
В принципе, у меня есть видеопоток, и я хочу получить координаты прямоугольника только в выходном изображении. Вот мой код на 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
}
Благодарю.
Посмотрите на определение функции поиска контуров в документации opencv и посмотрите параметры (ссылка на сайт):
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())
Параметры: Вот
Посмотрите на контуры, как Рафа сказал, что каждый контур хранится в векторе точек, а каждый вектор точек сохраняется в векторе, поэтому, пройдясь по внешнему вектору, а затем пройдя по внутреннему вектору, вы найдете точки, которые вы пожелает.
Однако, если вы хотите обнаружить только больший контур, вы можете использовать CV_RETR_EXTERNAL
в качестве параметра режима, потому что он будет обнаруживать только большинство внешних контуров (большой прямоугольник).
Если вы все еще хотите сохранить меньшие контуры, вы можете использовать CV_RETR_TREE
и работать со структурой иерархии: Использование контуров иерархии
Глядя на документация, 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;
}