简体   繁体   中英

Min and max value of Point2f vector

I want to find four corners of a rectangle out of a vector of Point2f points.

These points will be the max and min x values with their respective values and the other two corners will be the max y values with their respective y values.

So far I found the max and mins for x and y. I am trying to figure out how to reunite these max values with their other value so i have four x,y points. Is this possible?

Edit: The rectangle is at an angle with respect to the picture view.

This is my code as it stands and is working well:

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;
    }

}

You can use the following two functions in CV, depending upon whether the bounding box is rotated or not:

1) boundingRect

2) minAreaRect

The subsequent x,y returned in the rect/roated rect array are the xmin and ymin. and the other parameters can be used to get xmax, ymax.

Well now you have

(maxX, maxY)
(minX, minY)

You already know it's a rectangle, so the other two points are

(maxX, minY)
(minX, maxY)

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

Well you've got 4 points :

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

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

You can put that in a data structure

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

(I supposed here that Y = 0 is at the top and X = 0 is on the left)

Other than your current structures, which are like:

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

you could have a rectangle structure that holds all four corners:

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

and then you can populate them all with:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM