Algorithm 将扭曲矩形恢复为法线的算法

Algorithm 将扭曲矩形恢复为法线的算法,algorithm,pseudocode,Algorithm,Pseudocode,我正在考虑一种方法来将扭曲的矩形转换回正常状态,但我不知道如何。我也找不到关于它的任何信息。只有知道4个交叉点的x,y位置,谁能提供一些关于如何做这个把戏的信息?在变形之前,已知矩形为640 x 480 我认为这个问题可以通过在线性代数中找到变换矩阵来解决。因为有关于原始矩阵和最终矩阵的信息。您有扭曲矩形的4个角的坐标,并希望将其转换为某个矩形。在这种情况下,您需要透视变换。只需根据需要为生成的矩形定义点(例如,坐标原点中的单位平方) 现在您有8对对应的参数(每个点的x和y),需要使用8个方程计

我正在考虑一种方法来将扭曲的矩形转换回正常状态,但我不知道如何。我也找不到关于它的任何信息。只有知道4个交叉点的x,y位置,谁能提供一些关于如何做这个把戏的信息?在变形之前,已知矩形为640 x 480


我认为这个问题可以通过在线性代数中找到变换矩阵来解决。因为有关于原始矩阵和最终矩阵的信息。

您有扭曲矩形的4个角的坐标,并希望将其转换为某个矩形。在这种情况下,您需要透视变换。只需根据需要为生成的矩形定义点(例如,坐标原点中的单位平方)

现在您有8对对应的参数(每个点的x和y),需要使用8个方程计算矩阵的8个参数

 //four pairs of such equations:
 x' = (A * x + B * y + C) / (G * x + H * y + 1.0)
 y' = (D * x + E * y + F) / (G * x + H * y + 1.0)
本文介绍了寻找透视变换矩阵的理论

C++实现可以在(文件agg_trans_perspective.h)中找到

使用OpenCV

样品头

Point lt = Point(200, 40) ;
Point rt = Point(500, 44) ;
Point rb = Point(740, 355) ;
Point lb = Point(30, 200) ;

vector<Point> rect ;
rect.push_back(lt) ;
rect.push_back(rt) ;
rect.push_back(rb) ;
rect.push_back(lb) ;

double w1 = sqrt(pow(rb.x-lb.x, 2)+pow(rb.y-lb.y, 2)) ;
double w2 = sqrt(pow(rt.x-lt.x, 2)+pow(rt.y-lt.y, 2)) ;
double h1 = sqrt(pow(rb.x-rt.x, 2)+pow(rb.y-rt.y, 2)) ;
double h2 = sqrt(pow(lb.x-lt.x, 2)+pow(lb.y-lt.y, 2)) ;
double maxW = (w1<w2)? w2 : w1 ;
double maxH = (h1<h2)? h2 : h1 ;

Point2f src[4], dst[4] ;
src[0]=Point2f(lt.x, lt.y) ;
src[1]=Point2f(rt.x, rt.y) ;
src[2]=Point2f(rb.x, rb.y) ;
src[4]=Point2f(lb.x, lb.y) ;

dst[0]=Point2f(0,0) ;
dst[1]=Point2f(maxW, 0) ;
dst[2]=Point2f(maxW, maxH) ;
dst[3]=Point2f(0, maxH) ;

tfMat = getPerspectiveTransform(src, dst) ;
wrapPerspective(srcImage, dstImage, trMat, Size(maxW, maxH)) ;
点lt=点(200,40);
点rt=点(500,44);
点rb=点(740355);
点lb=点(30200);
向量rect;
矩形推回(lt);
直线推回(rt);
矩形推回(rb);
直线推回(磅);
双w1=sqrt(功率(rb.x-lb.x,2)+功率(rb.y-lb.y,2));
双w2=sqrt(功率(rt.x-lt.x,2)+功率(rt.y-lt.y,2));
双h1=sqrt(功率(rb.x-rt.x,2)+功率(rb.y-rt.y,2));
双h2=sqrt(功率(lb.x-lt.x,2)+功率(lb.y-lt.y,2));

double maxW=(W1)这是一个倾斜问题而不是转换问题如果你能计算出原始矩形所包围的面积,你所要做的就是移动x&y位置,直到你得到一个面积相同的非倾斜矩形。见鬼,你可能会作弊,只需画一个新的矩形。你需要发布你解决这个问题的尝试(我上面给出的建议可能会有所帮助)。这是家庭作业吗?在你定义可能的扭曲集之前,这个问题不会有任何有意义的解决方案。谁知道原始矩形是什么样子的?任何矩形都可能“扭曲”到您的示例中的一个。@Jason Liu-描述原始矩形是不够的。有许多可能的转换可以将特定的矩形变成特定的“扭曲”除非你指定一组可能的变换和次序,在其中可以执行多个变换,否则你的问题没有唯一的解决方案。而且,顺便说一下,你的问题是关于一个算法——标记为C或C++是无关的。