矩形中的最大和最小顶点

Max and min vertices in a rectangle

本文关键字:顶点      更新时间:2023-10-16

我再次提出这个问题,并给出了更好的解释。

我已经获得了要对其执行扭曲透视变换的矩形的四个点。当我手动选择这些点并为变换指定它们的位置时,我已经成功地对其中一个图像进行了变换。

cv::Point2f src_vertices[4];
src_vertices[0] = corners[3];
src_vertices[1] = corners[1];
src_vertices[2] = corners[0];
src_vertices[3] = corners[2];
Point2f dst_vertices[4];
dst_vertices[0] = Point(0, 0);
dst_vertices[1] = Point(box.boundingRect().width-1, 0); 
dst_vertices[2] = Point(0, box.boundingRect().height-1);
dst_vertices[3] = Point(box.boundingRect().width-1, box.boundingRect().height-1);

如您所见,我手动将角指定给了变换顶点。

由于我希望在多个略有不同的图像上使用此代码,我希望有一种更准确的方式来分配角点。

所有的图像看起来都像这样:

https://i.stack.imgur.com/uqyFs.jpg

此图像的角如下所示:左上-(1106331),右上-(810747),左下-(825187),右下-(510537)

我发现最大值和最小值x和y如下:

float X, Y;
float maxX= 0;
float minX = 10000;
float maxY= 0;
float minY = 10000;
for(int i=0; i< 4; i++){
    if( corners[i].x > maxX){
        maxX = corners[i].x;
    }
    if( corners[i].x < minX){
        minX = corners[i].x;
    }
    if( corners[i].y > maxY){
        maxY = corners[i].y;
    }
    if( corners[i].y < minY){
        minY = corners[i].y;
    }
}

这给了我:

最大X-1106,最小X-510,最大Y-747,最小Y-187。

我想知道如何将最大值和最小值重新组合为它们各自的值,这样我就可以使用这些点来执行变换。我是opencv的新手,如果这很明显的话,我很抱歉。

要在不丢失其他坐标信息的情况下获得角点,可以找到整个点。您可以存储Point2f maxX(0,0);并修改for循环,以跟踪点本身,而不仅仅是x坐标,而不是仅存储float maxX= 0;

更好的是,去掉这些循环并使用STL

Point2f maxX = *std::max_element(corners, corners+4, [](Point2f a, Point2f b){return a.x < b.x;});