2013-03-21 3 views
0

Я разрабатываю код, который должен найти красную часть. Я использую функцию minEnclosingCircle, чтобы получить центр изображения.Извлечь данные из Point2f

Способ, которым функция дает мне центр, находится в векторном формате vector<Point2f>center(contours.size());. Однако мне нужны эти данные, чтобы определить интересующий регион (ROI). Есть ли способ извлечь данные из этой точки, так что я могу иметь две координаты в X и Y в целых числах?

Спасибо!

--update--

Я отправлю код, чтобы попытаться объяснить лучше, что я хочу сделать:

vector<vector<Point> > contours_poly(contours.size()); 
vector<Point2f>center(contours.size()); 
vector<float>radius(contours.size()); 


for(int i = 0; i < contours.size(); i++) 
{ 
    approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true); 
    minEnclosingCircle((Mat)contours_poly[i], center[i], radius[i]); 
} 

Поэтому, как только я получаю контуры от моего образа я применить функцию minEnclosingCicrle для определения центра. Я очень новичок в OpenCV. Я полагаю, что центр найденных кругов сохраняется в этом векторе Point2f. То, что я хочу сделать, - это доступ к этим точкам, чтобы получить позицию моего объекта для определения ROI вокруг объекта.

+0

[эти документы] (http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight = minenclosingcircle # void% 20minEnclosingCircle% 28InputArray% 20 точек,% 20Point2f &% 20center,% 20float &% 20radius% 29) требование 'minEnclosingCircle' дает вам центр и радиус для заданного набора входных точек. Какие именно данные вы пытаетесь извлечь? – juanchopanza

+0

Я обновил описание своей проблемы. –

+0

Итак, у вас много центров кругов. Что вы хотите сделать с этой информацией? – juanchopanza

ответ

3

Из ваших комментариев

Предположим, я получаю 20 кругов, и я знаю, что круг 15 является самым большим. Я хочу знать позицию X и Y центра [15], которая является точкой 2f, но внутри вектора.

без проверки ограничений:

float x = center[15].x; 
float y = center[15].y; 

с проверкой ограничений:

float x = center.at(15).x; 
float y = center.at(15).y; 

Что касается оценки вектора, если индекс >= center.size(), вы вышли за пределы. Таким образом, вы можете сделать проверку себя:

int idx = 15; 
if (idx < center.size()) 
{ 
    // OK to access with index 15 
} 

Обратите внимание, что индексация начинается с 0, так что здесь вы получаете доступ к 16-й пункт.

+0

Спасибо большое! Это сработало! У меня есть только один маленький вопрос. Мне пришлось использовать «с проверкой границ». Что это значит? Какая разница между наличием границ или нет? –

+0

@ enric.cornella в принципе, если вы выходите за пределы, используя оператор '[]', вы получаете неопределенное поведение, что означает, что ваша программа может что-то делать *, включая перенос результатов дерьма. Если вы выходите за пределы, используя 'at()', вы получите исключение, которое, если только вы не будете обрабатываться вами, прекратит выполнение программы. – juanchopanza

+0

Thankyou @juanchopanza! –

0

Если вы используете IDE, то вы можете просто ввести что-то вроде

Point2f p; 
p. 

и IDE поможет вам завершить собственное поле класса.

Если вы пишете программу без интеллектуального автоматического завершения, вы можете просто посмотреть в исходном коде opencv, чтобы увидеть (эти части кода из источника opencv и распространяются по лицензии, вы можете найти на opencv-сайте и исходных кодах) :

typedef Point_<float> Point2f; 
.... 
template<typename _Tp> class CV_EXPORTS Point_{ 
.... 
    _Tp x, y; //< the point coordinates 
0

minEnclosingCircle возвращает центр как Point2f и радиусом, не знаю, как вы получаете вектор ..?

В любом случае вы можете получить доступ к координатам Point2f напрямую, поскольку они являются открытыми.

Point2f a; 
int x = (int)a.x; 
int y = (int)a.y; 
+0

Я получаю вектор Point2f, потому что он вычисляет больше одного. См. Новый обновленный вопрос с кодом. Я полагаю, я не могу использовать этот метод, потому что у меня есть несколько точек, сохраненных в моем векторе. –