最近有在做透视变换图的坐标还原的小项目,也就是把变形的图像区域进行校正,但是要准确的得到变形图像上的像素坐标到变换后的图像坐标,怎么得到?
这里假设p(x,y)是待校正的变形图像像素坐标,p'(x',y')是校正后p点对应的像素坐标,已知p怎么得到p'的准确像素坐标值?
透视变换的代码:
#include "stdafx.h"
#include "highgui.h"
#include "cv.h"
int _tmain(int argc, _TCHAR* argv[])
{
CvPoint2D32f srcQuad[4],dstQuad[4];
CvMat* warp_matrix = cvCreateMat(3,3,CV_32FC1);
IplImage* src = NULL;
IplImage* dst = NULL;
src = cvLoadImage("test2.jpg",-1);
if(!src)
{
return -1;
}
cvNamedWindow("source",0);
cvNamedWindow("Perspective_warp",0);
cvResizeWindow("source",400,400);
cvResizeWindow("Perspective_warp",400,400);
cvShowImage("source",src);
dst = cvCloneImage(src);
cvZero(dst);
//Before you want to change orgion,four points//
srcQuad[0].x = 197;
srcQuad[0].y = 47;
srcQuad[1].x = 488;
srcQuad[1].y = 72;
srcQuad[2].x = 215;
srcQuad[2].y = 461;
srcQuad[3].x = 502;
srcQuad[3].y = 403;
//then you want change it
dstQuad[0].x = 197;
dstQuad[0].y = 47;
dstQuad[1].x = 497;
dstQuad[1].y = 47;
dstQuad[2].x = 197;
dstQuad[2].y = 447;
dstQuad[3].x = 497;
dstQuad[3].y = 447;
//Do transform
cvGetPerspectiveTransform(srcQuad,dstQuad,warp_matrix);
cvWarpPerspective(src,dst,warp_matrix);
cvShowImage("Perspective_warp",dst);
cvWaitKey(0);
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvReleaseMat(&warp_matrix);
cvDestroyAllWindows();
return 0;
}
我们知道warp_matrix是变换用的矩阵,图像的移动、旋转、仿射和缩放都跟它有关,怎么得到这个矩阵?