将扭曲矩形转化为正常的算法

时间:2018-03-08 02:29:22

标签: algorithm pseudocode

我正在考虑将扭曲的矩形转换回正常的方法,但我不知道如何。我也找不到任何关于它的信息。任何人都可以提供一些有关如何知道4个交叉点的x,y位置的技巧的信息吗?已知扭曲前的矩形为640 x 480。Example of the distorted rectangle Example2

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

2 个答案:

答案 0 :(得分:1)

您有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)

r_binary_packages中描述了寻找透视变换矩阵的理论。

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

答案 1 :(得分:1)

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