矩形中的最大和最小顶点

时间:2015-11-29 15:51:08

标签: c++ opencv

我正在更好地解释这个问题。

我已经获得了一个矩形的四个点,我希望对其进行扭曲透视转换。当我手动选择点并为转换分配它们的位置时,我已经成功地对我的一个图像进行了变换。

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

如您所见,我手动将角分配给转换顶点。

由于我希望在多个稍微不同的图像上使用此代码,我希望能够更准确地分配角点。

所有图像都与此类似:

http://imgur.com/t0cgTzr

此图像的角落如下: 左上角 - (1106,331), 右上角 - (810,747), 左下角 - (825,187), 右下角 - (510,537)

我发现max和min 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;
    }

}

这给了我:

maxX - 1106,minX - 510,maxY - 747,minY - 187。

我想知道如何将max和min值重新组合到它们各自的值,这样我就可以使用这些点来执行转换。我对opencv很新,很抱歉,如果这很明显。

1 个答案:

答案 0 :(得分:1)

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

更好的是,摆脱这些循环并使用STL

x