3 回答
TA贡献1848条经验 获得超2个赞
问题是在向量内声明点的顺序,然后在定义上还有另一个与此相关的问题dst_vertices。
该点的顺序关系到getPerspectiveTransform(),必须按以下顺序指定:
1st-------2nd
| |
| |
| |
3rd-------4th
因此,原产地需要重新订购:
vector<Point> not_a_rect_shape;
not_a_rect_shape.push_back(Point(408, 69));
not_a_rect_shape.push_back(Point(1912, 291));
not_a_rect_shape.push_back(Point(72, 2186));
not_a_rect_shape.push_back(Point(1584, 2426));
和目的地:
Point2f dst_vertices[4];
dst_vertices[0] = Point(0, 0);
dst_vertices[1] = Point(box.boundingRect().width-1, 0); // Bug was: had mistakenly switched these 2 parameters
dst_vertices[2] = Point(0, box.boundingRect().height-1);
dst_vertices[3] = Point(box.boundingRect().width-1, box.boundingRect().height-1);
在此之后,需要进行一些裁剪,因为生成的图像不仅仅是绿色矩形内的区域,我认为它将是:
我不知道这是不是OpenCV的错误,或者我错过了什么,但主要问题已经解决了。
TA贡献1725条经验 获得超7个赞
使用四边形时,OpenCV并不是你的朋友。RotatedRect会给你不正确的结果。此外,你需要一个透视投影,而不是像这里提到的其他仿射投影。
基本上必须做的是:
遍历所有多边形段并连接几乎相同的多边形段。
对它们进行排序,使您拥有4个最大的线段。
相交这些线,你有4个最可能的角点。
在从角点和已知对象的纵横比收集的透视图上变换矩阵。
我实现了一个Quadrangle处理轮廓到四边形转换的类,并且还将在正确的视角上对其进行转换。
- 3 回答
- 0 关注
- 1002 浏览
添加回答
举报