opencv学习--透视变化

透视变换和仿射变换具有很大的相同特性,前面提到了放射变化,这里再次把它拿出和透视变换进行比较

 1 #include"cv.h"
 2 #include"highgui.h"
 3 using namespace cv;
 4 void WarpPerspective(IplImage *img);
 5 void WarpFangshe(IplImage *img);
 6 int main()
 7 {
 8     IplImage *getimg = cvLoadImage("e:/picture/Wife2.jpg");
 9     IplImage *img = cvCreateImage(cvSize(350,450),getimg->depth,getimg->nChannels);
10     cvResize(getimg,img);
11     WarpPerspective(img);
12     //WarpFangshe(img);
13     cvWaitKey();
14     cvDestroyAllWindows();
15     return 0;
16 }
17 //透视变换
18 //任意四边形的变换
19 //透视变换需要的设置四个点
20 void WarpPerspective(IplImage *img)
21 {
22     IplImage *dst = cvCreateImage(cvGetSize(img),img->depth,img->nChannels);
23     CvMat *mat = cvCreateMat(3,3,CV_32FC1);
24     CvPoint2D32f ori_point[4], dst_point[4];
25     ori_point[0].x = 0; ori_point[0].y = 0;
26     ori_point[1].x = img->width - 1; ori_point[1].y = 0;
27     ori_point[2].x = 0; ori_point[2].y = img->height-1;
28     ori_point[3].x = img->width - 1; ori_point[3].y = img->height - 1;
29     dst_point[0].x = img->width / 2; dst_point[0].y = img->height*0.05;
30     dst_point[1].x = img->width*0.3;; dst_point[1].y = img->height / 2;
31     dst_point[2].x = img->width*0.7; dst_point[2].y = img->height / 2;
32     dst_point[3].x = img->width / 2; dst_point[3].y = img->height*0.9;
33     //获取映射矩阵
34     cvGetPerspectiveTransform(ori_point,dst_point,mat);
35     cvWarpPerspective(img,dst,mat);
36     //cvFlip(dst,dst,1);
37     cvNamedWindow("origin");
38     cvNamedWindow("Warp");
39     cvShowImage("origin",img);
40     cvShowImage("Warp",dst);
41     cvReleaseImage(&img);
42     cvReleaseImage(&dst);
43     cvReleaseMat(&mat);
44 }
45 void WarpFangshe(IplImage *img)//仿射变换
46 {
47     //定义两个CvPoint2D32F的数组
48     //第一个数组用来标定将要变换的原始图像中的区域
49     //第二个数组用来标定变换后的图像在窗口中的位置
50     CvPoint2D32f SrcTri[3], DstTri[3];
51     //定义仿射映射矩阵,然后计算(2*3的矩阵)
52     CvMat *warp_mat = cvCreateMat(2, 3, CV_32FC1);
53     CvMat *rot_mat = cvCreateMat(2, 3, CV_32FC1);
54     IplImage *src, *dst;
55     src = img;
56     dst = cvCloneImage(src);
57     SrcTri[0].x = 0; SrcTri[0].y = 0;
58     SrcTri[1].x = src->width - 1; SrcTri[1].y = 0;
59     SrcTri[2].x = 0; SrcTri[2].y = src->height - 1;
60     DstTri[0].x = 0; DstTri[0].y = src->height*0.33;
61     DstTri[1].x = src->width*0.85; DstTri[1].y = src->height*0.25;
62     DstTri[2].x = src->width*0.15; DstTri[2].y = src->height*0.7;
63     //获取映射矩阵
64     cvGetAffineTransform(SrcTri, DstTri, warp_mat);
65     //映射变换
66     cvWarpAffine(src, dst, warp_mat);
67     cvCopy(dst, img);
68     cvNamedWindow("Warp");
69     //cvShowImage("Warp",dst);
70     //下面是对变换后的图像进一步旋转
71     CvPoint2D32f center = cvPoint2D32f(src->width / 2, src->height / 2);
72     double angle = 50.0;
73     double scale = 0.8;
74     //旋转图像
75     //上面center是旋转中心
76     //下面函数的第二个和第三个参数给出了旋转的角度和缩放的尺度
77     //最后一个参数是输出的映射矩阵
78     /*cv2DRotationMatrix(
79     CvPoint2D32F center
80     double angle
81     double scale
82     CvMat *map_matrix
83     )*/
84     cv2DRotationMatrix(center, angle, scale, rot_mat);
85     cvWarpAffine(src, dst, rot_mat);
86     cvShowImage("Warp", dst);
87     cvReleaseImage(&img);
88     cvReleaseImage(&dst);
89 }
时间: 2024-08-08 01:12:41

opencv学习--透视变化的相关文章

OpenCV 学习笔记(模板匹配)

OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够高时,就认为找到了我们的目标. 在 OpenCV 中,提供了相应的函数完成这个操作. matchTemplate 函数:在模板和输入图像之间寻找匹配,获得匹配结果图像 minMaxLoc 函数:在给定的矩阵中寻找最大和最小值,并给出它们的位置 在具体介绍这两个函数之前呢,我们还要介绍一个概念,就是如何来评价两

OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 2013-03-23 17:44 16963人阅读 评论(28) 收藏 举报 分类: 机器视觉(34) 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] KAZE系列笔记: OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 OpenCV学习笔记(28)KA

OpenCV学习教程入门篇<一、介绍>

OpenCV,是Inter公司开发的免费开源专门由于图像处理和机器视觉的C/C++库,英文全称是Open Source Computer Vision. 1. 可视化语言Matlab与OpenCV都可以用于图像处理,学哪种比较好? Matlab是主要面对高校做科研的一种可视化数学处理工具箱,OpenCV在有关图像的项目研发方面应用广泛.想做模式识别和机器视觉方向的,我的导师建议两者都要学好,不论发表paper,还是做项目. 2.OpenCV是基于C/C++的函数库,有什么优势? 使用C编写的库,

opencv学习---运动目标(前景)检测

opencv学习---运动目标(前景)检测 1.帧差法 原理:视频序列相邻两帧或三帧间采用基于像素的时间差分,通过闭值化来提取出图像中的运动区域. 优点:算法简单.计算量小,无需训练背景,对缓慢变换的光照不是很敏感. 缺点:容易受天气.阴影及杂乱背景干扰,阈值T的选择相当关键,稳定性差. 2.背景差分法 原理:用背景的参数模型来近似背景图像,将当前帧与背景图像进行差分比较实现对运动区域的检测 优点:计算量小,较高的实时性,利用已有帧信息进行背景动态更新 缺点:如何建立对于不同场景的动态变化均具有

网友提问(透视变化)

您好: 我在网上看到您的opencv透视变换的博客,https://www.cnblogs.com/jsxyhelu/p/4219564.html, 我是opencv小菜鸟一个,现在想要得到一个图片变形之后保存,整个图片信息不丢失,即四个角的信息不丢失应该怎么做?原图中某一点在新图中坐标应该怎么计算?万望不吝赐教,不胜感激,万分感谢. 你好: 我按照您的代码和网上找到的python代码(https://blog.csdn.net/fengxueniu/article/details/779643

OpenCV 学习(利用滤波器进行边缘提取)

OpenCV 学习(利用滤波器进行边缘提取) 通过低通滤波器,我们可以将图像平滑,相反的,利用高通滤波器可以提取出图像的边缘. Sobel 滤波器 Sobel 滤波器是一种有方向性的滤波器,可以作用在 X 方向或 Y 方向. 关于这种滤波器的理论介绍可以参考: https://en.wikipedia.org/wiki/Sobel_operator 函数原型如下: void Sobel( InputArray src, OutputArray dst, int ddepth, int dx, i

OpenCV学习之六: 使用方向梯度直方图估计图像旋转角度

在备份ltedecoder程序时,需要把此目录拷由到bak目录下,但decoder目录下有个大文件,不需要备份,还有日志问题,也不需要备份,如何实现呢?? 方法: cd /source-dir find . -name .snapshot -prune -o -print0 | cpio -pmd0 /dest-dir 解释: This command copies the contents of /source-dir to /dest-dir, but omits files and dir

Opencv学习笔记(六)SURF学习笔记

原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/7392345 本人挺菜的,肯定有非常多错误纰漏之处 ,希望大家不吝指正. 看了harris角点检測之后,開始研究SURF角点检測,发现挺复杂的,一时也仅仅了解了大概,把了解的东西总结下,以便下次深入学习. SURF角点检測算法是对SIFT的一种改进,主要体如今速度上,效率更高.它和SIFT的主要差别是图像多尺度空间的构建方法不同. 在计算视觉领域,尺度空间被象征性的表述

opencv学习笔记(四)投影

opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: 1 #include <cv.h> 2 #include <highgui.h> 3 using namespace std; 4 using namespace cv; 5 int main() 6 { 7 IplImage * src = cvLoadImage("cat.png", 0); //强制转化读取图像为灰度图 8 cvShowImage("灰度图像", s