2015-11-28 9 views
0

Я хочу найти четыре угла прямоугольника из вектора точек Point2f.Минимальное и максимальное значение Point2f vector

Этими значениями будут значения max и min x с их соответствующими значениями, а остальные два угла будут максимальными значениями y со своими соответствующими значениями y.

До сих пор я нашел max и mins для x и y. Я пытаюсь понять, как воссоединить эти максимальные значения с их другим значением, поэтому у меня есть четыре точки x, y. Это возможно?

Редактировать: прямоугольник находится под углом относительно изображения.

Это мой код, как он стоит, и работает хорошо:

vector<cv::KeyPoint> keypoints; 
blob_detector->detect(backproj_dilate, keypoints); 

vector<Point2f> XY; 
for (size_t i=0; i<keypoints.size(); i++){ 
    XY.push_back(keypoints[i].pt); 

} 

float X, Y; 
float maxX= 0; 
float minX = 10000; 
float maxY= 0; 
float minY = 10000; 
for(size_t i=0; i<keypoints.size(); i++){ 
    X = XY[i].x; 
    Y = XY[i].y; 
    if(X > maxX){ 
     maxX = X; 
    } 
    if(X < minX){ 
     minX = X; 
    } 
    if(Y > maxY){ 
     maxY = Y; 
    } 
    if(Y < minY){ 
     minY = Y; 
    } 

} 
+0

Вы пытаетесь решить http://stackoverflow.com/questions/33938487/opencv-connecting-dots? если да, попробуйте, что предложил @Miki. – sturkmen

+0

В то время как я изучал те, я наткнулся на simpleBlobDetector, который я считал отличным, потому что он дал мне координаты каждой точки. Вот как я сейчас здесь. Как вы думаете, что я пытаюсь сделать, невозможно? – user5608415

+0

, если вы публикуете свой полный код, я могу показать, как делать то, что вы хотите. – sturkmen

ответ

0

Другие, чем ваши текущие структуры , которые, как:

struct vector2 { float x, y; }; 
struct key_point { vector2 pt; }; 

вы могли бы иметь структуру прямоугольника, который содержит все четыре угла:

struct rect { 
    vector2 top_left; 
    vector2 top_right; 
    vector2 bottom_left; 
    vector2 bottom_right; 
}; 

, а затем вы можете заполнить их все с:

std::vector<key_point> key_points; 
auto x_comparator = [](auto const& a, auto const& b) { return a.pt.x < b.pt.x; }; 
auto y_comparator = [](auto const& a, auto const& b) { return a.pt.x < b.pt.x; }; 

float max_x = boost::max_element(key_points, x_comparator)->pt.x; 
float min_x = boost::min_element(key_points, x_comparator)->pt.x; 
float max_y = boost::max_element(key_points, y_comparator)->pt.y; 
float min_y = boost::min_element(key_points, y_comparator)->pt.y; 
auto rectangle = rect{ 
    {min_x, min_y}, 
    {max_x, min_y}, 
    {min_x, max_y}, 
    {max_x, max_y} 
}; 

Live demo

+0

Здравствуйте, извините, я должен был быть более явным в своем вопросе. Прямоугольник находится под углом, поэтому соответствующее значение y для значения maxX не является значением max или min y. – user5608415

0

Ну теперь у вас есть

(maxX, maxY) 
(minX, minY) 

Вы уже знаете, что это прямоугольник, так что другие две точки

(maxX, minY) 
(minX, maxY) 

     minX   maxX  
    0|---|--------------|-- 
    | 
minY (minX, minY) (maxX, minY) 
    | 
    | 
    | 
    | 
    | 
maxY (minX,maxY) (maxX,maxY) 
    | 
+0

Привет, я должен был быть более явным в своем вопросе. Прямоугольник находится под углом, поэтому соответствующее значение y для значения maxX не является значением max или min y. – user5608415

0

У вас есть 4 очка:

P1 = { XMin, YMin } 
P2 = { XMax, YMin } 
P3 = { XMin, YMax } 
P4 = { XMax, YMax } 

P1 ---- P2 
|  | 
P3 ---- P4 

Вы можете положить, что в структуре данных

struct Rectangle 
{ 
    float UpLeft[2]; 
    float UpRight[2]; 
    float DownLeft[2]; 
    float DownRight[2]; 
}; 

(я должен здесь, что Y = 0 находится в верхней и X = 0 находится на левой стороне)

+0

Привет, мне следовало быть более явным в моем вопросе. Прямоугольник находится под углом, поэтому соответствующее значение y для значения maxX не является значением max или min y. – user5608415

1

Вы можете использовать следующие две функции в CV, в зависимости от того, вращается коробка ограничительная или нет:

1) boundingRect

2) minAreaRect

Следующие x, y, возвращаемые в прямоугольную прямоугольную решетку, представляют собой xmin и ymin. и другие параметры могут быть использованы для получения xmax, ymax.

Смежные вопросы