从变形图像中获取像素的原始坐标

3

我从一张名为 sourceImage 的图片中提取出了四个角:

src_vertices[0] = corners[upperLeft];
src_vertices[1] = corners[upperRight];   
src_vertices[2] = corners[downLeft];
src_vertices[3] = corners[downRight];

这四个角被弯曲到destinationImage,就像这样:
dst_vertices[0] = Point(0,0);
dst_vertices[1] = Point(width, 0); 
dst_vertices[2] = Point(0, height);
dst_vertices[3] = Point(width, height);

Mat warpPerspectiveMatrix = getPerspectiveTransform(src_vertices, dst_vertices);
cv::Size size_d =  Size(width, height);
cv::Mat DestinationImage(width,height,CV_8UC3);
warpPerspective(sourceImage, destinationImage, warpPerspectiveMatrix, size_d, INTER_LINEAR, BORDER_CONSTANT);

现在我的问题是:
我有一个从destinationImage中取出的点p(x,y),如何在原始的sourceImage中检索该点的坐标?
换句话说,我想使用warpPerspectiveMatrix来执行与getPerspectiveTransform相反的工作。

如果您通过从目标到源的映射来获取一个新的warpPerspectiveMatrix,然后将其应用于单个点,那么您将得到您想要的结果。这样做有什么问题吗? - mmgp
1个回答

6
你需要逆透视变换。如果你原始的转换是S->S',那么你需要转换矩阵S'->S。
Mat InversewarpPerspectiveMatrix = getPerspectiveTransform(dst_vertices, src_vertices);

然后你需要创建一个稀疏矩阵。
Mat PerspectiveCoordinates containing the vector x,y.

最后,您希望调用

PerspectiveTransform(PerspectiveCoordinates,OriginalCoordinates,InversewarpPerspectiveMatrix)

稀疏矩阵是什么意思?如何将向量x、y添加到透视坐标中? - Zaher Joukhadar
这是一个完全不同的问题。 - Boyko Perfanov
谢谢Boyko,现在一切都好了。 - Zaher Joukhadar
@BoykoPerfanov 或者 ZaherJoukhada,你们有没有办法使用OpenCV获取解析矩阵?我也遇到了同样的问题,谢谢! - Engine
2
@引擎 请尝试访问http://www.micc.unifi.it/ballan/downloads/ocv_tutorial.pdf的第23页“集合和稀疏矩阵”。 - Boyko Perfanov
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接