c++ - 矩形中的最大和最小顶点

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

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

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

所有图像看起来都与此类似:

/image/uqyFs.jpg

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

我发现 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。

我想知道如何将最大值和最小值重新组合为各自的值,以便我可以使用这些点来执行变换。我对 opencv 很陌生,如果这是非常明显的,我很抱歉。

最佳答案

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

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

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

关于c++ - 矩形中的最大和最小顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33984685/

相关文章:

java - 如何在Java包装器中使用Opencv的分区功能

python - 如何在 python 中从 LAB (l*a*b) 颜色空间中获取 a channel

python - 为什么图像 block 在提取时会像素化,但在连接时会变得正常?

c++ - 如何将 void 指针转换为 int[3]?

c++ - gcc,包括文件依赖

c++ - 关闭clang中的类型转换

python - 使用 cv2 numpy 和 Python 2.7 调整 RGB 图像的大小

c++ - 编译 rsa 库时出现 LNK 错误

C++ 将输入与文本文件中的数据进行匹配,如果匹配则只显示该数据

opencv - 检索圆点