关于OpenCV 透视变换的所用的变换矩阵问题

wl_soft50 2011-05-16 10:35:26
最近有在做透视变换图的坐标还原的小项目,也就是把变形的图像区域进行校正,但是要准确的得到变形图像上的像素坐标到变换后的图像坐标,怎么得到?
这里假设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是变换用的矩阵,图像的移动、旋转、仿射和缩放都跟它有关,怎么得到这个矩阵?
...全文
942 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
grabcut 2011-11-01
  • 打赏
  • 举报
回复
鼠标点击两张图片对应的点,便可以得到坐标值,然后得到变换矩阵,然后得到真正的变换图像,你是这个意思吗?
wl_soft50 2011-05-24
  • 打赏
  • 举报
回复
帖子要沉了,自己顶一下!~
wl_soft50 2011-05-17
  • 打赏
  • 举报
回复
可以推荐一下有这类算法的图形图像的书吗?
ryfdizuo 2011-05-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wl_soft50 的回复:]
怎么沒大牛来指导呢?
[/Quote]
lz找本图形学书。这个很难指导。
opengl/dx 显示是将3d的坐标通过投影变换到2维视口,然后映射到屏幕。
你正好是逆过程。
wl_soft50 2011-05-16
  • 打赏
  • 举报
回复
怎么沒大牛来指导呢?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧