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

 #include"cv.h"
#include"highgui.h"
using namespace cv;
void WarpPerspective(IplImage *img);
void WarpFangshe(IplImage *img);
int main()
{
IplImage *getimg = cvLoadImage("e:/picture/Wife2.jpg");
IplImage *img = cvCreateImage(cvSize(,),getimg->depth,getimg->nChannels);
cvResize(getimg,img);
WarpPerspective(img);
//WarpFangshe(img);
cvWaitKey();
cvDestroyAllWindows();
return ;
}
//透视变换
//任意四边形的变换
//透视变换需要的设置四个点
void WarpPerspective(IplImage *img)
{
IplImage *dst = cvCreateImage(cvGetSize(img),img->depth,img->nChannels);
CvMat *mat = cvCreateMat(,,CV_32FC1);
CvPoint2D32f ori_point[], dst_point[];
ori_point[].x = ; ori_point[].y = ;
ori_point[].x = img->width - ; ori_point[].y = ;
ori_point[].x = ; ori_point[].y = img->height-;
ori_point[].x = img->width - ; ori_point[].y = img->height - ;
dst_point[].x = img->width / ; dst_point[].y = img->height*0.05;
dst_point[].x = img->width*0.3;; dst_point[].y = img->height / ;
dst_point[].x = img->width*0.7; dst_point[].y = img->height / ;
dst_point[].x = img->width / ; dst_point[].y = img->height*0.9;
//获取映射矩阵
cvGetPerspectiveTransform(ori_point,dst_point,mat);
cvWarpPerspective(img,dst,mat);
//cvFlip(dst,dst,1);
cvNamedWindow("origin");
cvNamedWindow("Warp");
cvShowImage("origin",img);
cvShowImage("Warp",dst);
cvReleaseImage(&img);
cvReleaseImage(&dst);
cvReleaseMat(&mat);
}
void WarpFangshe(IplImage *img)//仿射变换
{
//定义两个CvPoint2D32F的数组
//第一个数组用来标定将要变换的原始图像中的区域
//第二个数组用来标定变换后的图像在窗口中的位置
CvPoint2D32f SrcTri[], DstTri[];
//定义仿射映射矩阵,然后计算(2*3的矩阵)
CvMat *warp_mat = cvCreateMat(, , CV_32FC1);
CvMat *rot_mat = cvCreateMat(, , CV_32FC1);
IplImage *src, *dst;
src = img;
dst = cvCloneImage(src);
SrcTri[].x = ; SrcTri[].y = ;
SrcTri[].x = src->width - ; SrcTri[].y = ;
SrcTri[].x = ; SrcTri[].y = src->height - ;
DstTri[].x = ; DstTri[].y = src->height*0.33;
DstTri[].x = src->width*0.85; DstTri[].y = src->height*0.25;
DstTri[].x = src->width*0.15; DstTri[].y = src->height*0.7;
//获取映射矩阵
cvGetAffineTransform(SrcTri, DstTri, warp_mat);
//映射变换
cvWarpAffine(src, dst, warp_mat);
cvCopy(dst, img);
cvNamedWindow("Warp");
//cvShowImage("Warp",dst);
//下面是对变换后的图像进一步旋转
CvPoint2D32f center = cvPoint2D32f(src->width / , src->height / );
double angle = 50.0;
double scale = 0.8;
//旋转图像
//上面center是旋转中心
//下面函数的第二个和第三个参数给出了旋转的角度和缩放的尺度
//最后一个参数是输出的映射矩阵
/*cv2DRotationMatrix(
CvPoint2D32F center
double angle
double scale
CvMat *map_matrix
)*/
cv2DRotationMatrix(center, angle, scale, rot_mat);
cvWarpAffine(src, dst, rot_mat);
cvShowImage("Warp", dst);
cvReleaseImage(&img);
cvReleaseImage(&dst);
}

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

  1. warpperspective 透视变化的opencv实现

    warpperspective 透视变化的opencv2.0实现 1st-------2nd | | | | | |3rd-------4th 原始代码              cv::Mat sr ...

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

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  3. OpenCV 学习笔记(模板匹配)

    OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够 ...

  4. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  5. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  6. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  7. OpenCV学习笔记5

    OpenCV学习笔记5 图像变换 傅里叶变换 这里可以先学习一下卷积分,了解清除卷积的过程和实际意义,在看这一章节的内容. 原理: 傅里叶变换经常被用来分析不同滤波器的频率特性.我们可以使用 2D 离 ...

  8. OpenCV学习笔记3

    OpenCV学习笔记3 图像平滑(低通滤波) 使用低通滤波器可以达到图像模糊的目的.这对与去除噪音很有帮助.其实就是去除图像中的高频成分(比如:噪音,边界).所以边界也会被模糊一点.(当然,也有一些模 ...

  9. opencv学习笔记(七)SVM+HOG

    opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...

随机推荐

  1. ionic 日期插件学习

    <ion-header> <ion-navbar> <ion-title> DateTime </ion-title> </ion-navbar& ...

  2. Linux内核设计笔记11——定时器

    定时器与时间管理笔记 内核中的时间 时钟中断:内核中的系统定时器以某种频率触发中断,该频率可以通过编程预定. 节拍率HZ:时钟中断的频率称为节拍率. 节拍:相邻两次中断的时间间隔称为节拍,1/节拍率. ...

  3. php 连接redis查询数据

    class Layoutdemo{ function index(){ $db = new Db(); $id=390; $layout_json = array(); if($info = $db- ...

  4. JDK源码分析 – LinkedList

    LinkedList类的申明 public class LinkedList<E> extends AbstractSequentialList<E> implements L ...

  5. Razor语法和Razor引擎大全

    一.Razor语法 1.Razor的标识符 解释:@字符被定义为Razor服务器代码块的标识符,后面的表示是服务器代码了.web form中使用<%%>中写服务器代码一个道理.在vs工具里 ...

  6. ZOJ 2072 K-Recursive Survival

    https://vjudge.net/contest/67836#problem/K n people numbered 1 to n around a circle, we eliminate ev ...

  7. 第二部分shell编程2正则(grepegrepsedawk)

    一.grep/egrep 1. 语法+选项语法: grep [-cinvABC] 'word' filename -c :打印符合要求的行数-n :在输出符合要求的行的同时连同行号一起输出 -v :打 ...

  8. project之chrome.exe

    查看chrome.exe的以来文件可以得到下面这个列面,大部分是在%systemroot%/system32下面的系统dll文件,只有两个是chromium自己生成的:base.dll, conten ...

  9. cacti 添加mysql 监控 (远程服务器)

    监控主机 192.168.24.69 ,以下用A表示 被监控主机 192.168.24.79,以下用B标识   记得在A服务器的cacti中导入监控mysql的templates文件   1.在B上安 ...

  10. MVC 上传文件实例

    http://www.cnblogs.com/leiOOlei/archive/2011/08/17/2143221.html