Получить координаты контуров в OpenCV

Допустим, у меня есть следующее выходное изображение:

введите описание изображения здесь

В принципе, у меня есть видеопоток, и я хочу получить координаты прямоугольника только в выходном изображении. Вот мой код на 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

}

Благодарю.

2

Решение

Посмотрите на определение функции поиска контуров в документации opencv и посмотрите параметры (ссылка на сайт):

void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())

Параметры: Вот

Посмотрите на контуры, как Рафа сказал, что каждый контур хранится в векторе точек, а каждый вектор точек сохраняется в векторе, поэтому, пройдясь по внешнему вектору, а затем пройдя по внутреннему вектору, вы найдете точки, которые вы пожелает.

Однако, если вы хотите обнаружить только больший контур, вы можете использовать CV_RETR_EXTERNAL в качестве параметра режима, потому что он будет обнаруживать только большинство внешних контуров (большой прямоугольник).

Если вы все еще хотите сохранить меньшие контуры, вы можете использовать CV_RETR_TREE и работать со структурой иерархии: Использование контуров иерархии

3

Другие решения

Глядя на документация, 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;
}
2

По вопросам рекламы [email protected]