码迷,mamicode.com
首页 > 其他好文 > 详细

【练习4.7】使用键盘控制透视变换和仿射变换的变换矩阵:实现拉伸、收缩、扭曲、旋转

时间:2014-08-03 20:25:35      阅读:515      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   使用   os   strong   

《学习OpenCV》中文版第4章第7题

 注意:操作的使用将输入法状态切换到“英文”状态

提纲
题目要求
程序代码
结果图片

 

 

 

 

题目要求:

a、使用数字键1~9以及数字键与Shift的组合,实现透视变换变换矩阵中对应元素的增大和缩小

b、使用上下方向键实现仿射变换变换矩阵中对应元素的增大和缩小,以实现对图片的缩放。

c、使用左右方向键实现仿射变换变换矩阵中对应元素的增大和缩小,以实现对图片的旋转。

程序代码:

  1 #include "stdafx.h"
  2 #include <cv.h>
  3 #include <highgui.h>
  4 #include <iostream>
  5 using namespace cv;
  6 using namespace std;
  7 //函数声明-->--->-->--->-->--->-->--->//
  8 
  9 int shiftKeyHandler(int key);
 10 
 11 //<--<--<--<--<--<--<--<--<--函数声明//
 12 
 13 int _tmain(int argc, _TCHAR* argv[])
 14 {
 15     const char * fileName = "D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg";
 16     IplImage * img = cvLoadImage(fileName, CV_LOAD_IMAGE_UNCHANGED);    
 17     assert(img);
 18     
 19     IplImage * dst = cvCloneImage(img);
 20     dst->origin = img->origin;
 21     cvZero(dst);
 22 
 23     IplImage * affinedImage = NULL;
 24     CvPoint2D32f center = cvPoint2D32f(img->width / 2, img->height/2);
 25     double angle = -20.0;
 26     double scale = 1.0;    
 27 
 28     cvNamedWindow("ExerciseWindow", CV_WINDOW_AUTOSIZE);    
 29     cvNamedWindow("透视变换", CV_WINDOW_AUTOSIZE);
 30     cvNamedWindow("图片缩放旋转", CV_WINDOW_AUTOSIZE);
 31 
 32     cvShowImage("ExerciseWindow", img);
 33 
 34     CvMat * warp_matrix = cvCreateMatHeader(3, 3, CV_32FC1);     
 35     float matDataSource[9] = { 0.372190326f, 0.216031685f, 25.6000004f,
 36         -0.213343531f, 0.600807548f, 168.960007f,
 37         -0.00104052317f, 0.000641974097f, 1.00000000f };
 38     warp_matrix->data.fl = matDataSource;
 39     
 40     CvMat *rot_mat = cvCreateMat(2, 3, CV_32FC1);
 41 
 42     while (true)
 43     { 
 44         int key = cvWaitKey(0);
 45         
 46         //---------------------------透视变换:开始--------------------------------//
 47         //使用1~9键盘数字或与Shift的结合控制透视变换矩阵的9个元素
 48 
 49         //当没有按下Shift键的时候
 50         if (key >= 49 && key <= 57)    //按键1~9的ASCII码是49~57
 51         {
 52             matDataSource[key % 49] += matDataSource[key % 49] / 10.0f;    //这种方式可以省掉使用switch的大段代码
 53         }
 54         else//当按下Shift键的时候
 55         {
 56             int subscript = shiftKeyHandler(key);
 57             if (subscript != -1)
 58             {
 59                 //题目要求是对应数据最小值是0,但实际操作中发现,有负值的情况比较理想
 60                 /*float temp = matDataSource[subscript] / 10.0f;
 61                 if ((matDataSource[subscript] -= matDataSource[subscript] / 10.0f) < 0.000001f)
 62                 {
 63                     matDataSource[subscript] += temp;
 64                 }*/
 65 
 66                 matDataSource[subscript] -= matDataSource[subscript] / 10.0f;
 67             }
 68             else
 69             {
 70                 cout << "请在程序获取输入焦点的情况下将输入法切换到英文状态再试!" << endl;
 71             }
 72         }
 73 
 74         cvWarpPerspective(img, dst, warp_matrix);
 75         cvShowImage("透视变换", dst);
 76 
 77         //---------------------------透视变换:结束--------------------------------//        
 78 
 79         //---------------------------图片缩放与旋转:开始(仿射变换方法)----------------//
 80         //使用上下箭头即“↑”“↓”控制图片放大缩小
 81         //使用上下箭头即“←”“→”控制图片旋转
 82 
 83         if (key == 2490368 || key == 2621440 || key == 2424832 || key == 2555904)
 84         {
 85             affinedImage = cvCloneImage(img);
 86             affinedImage->origin = img->origin;
 87             cvZero(affinedImage);
 88             
 89             if (key == 2490368)//方向键“↑”
 90             {
 91                 scale += scale*0.2;
 92             }
 93 
 94             if (key == 2621440)
 95             {
 96                 scale -= scale*0.2;
 97             }
 98 
 99             if (key == 2424832)//方向键“←”
100             {
101                 angle -= 10.0;
102             }
103 
104             if (key == 2555904)
105             {
106                 angle += 10.0;
107             }
108 
109             cv2DRotationMatrix(center, angle, scale, rot_mat);
110             cvWarpAffine(img, affinedImage, rot_mat);
111             cvShowImage("图片缩放旋转", affinedImage);
112         }
113 
114         //---------------------------图片缩放与旋转:结束--------------------------------//
115 
116         if (waitKey(15) == 27)
117         {
118             break;
119         }
120     }
121 
122     cvWaitKey(0);
123 
124     cvReleaseImage(&img);
125     cvReleaseImage(&dst);
126     cvReleaseImage(&affinedImage);
127     cvDestroyWindow("ExerciseWindow");     
128     cvDestroyWindow("透视变换");
129     cvDestroyWindow("图片缩放旋转");
130 
131 
132     return 0;
133 }
134 
135 //当同时按下Shift键时,处理key的值,使其结果方便使用
136 int shiftKeyHandler(int key)
137 {
138     //输入法分为英文和中文两种输入状态,本程序只开了英文状态,当然,实际开发中也可在使用代码控制输入法状态
139     switch (key)
140     {
141     case !:return 0;
142     case @:return 1;
143     case #:return 2;
144     case $:return 3;
145     case %:return 4;
146     case ^:return 5;
147     case &:return 6;
148     case *:return 7;
149     case (:return 8;
150     default:
151         return -1;        
152     }    
153 }

 

结果图片

bubuko.com,布布扣

 

 

【练习4.7】使用键盘控制透视变换和仿射变换的变换矩阵:实现拉伸、收缩、扭曲、旋转,布布扣,bubuko.com

【练习4.7】使用键盘控制透视变换和仿射变换的变换矩阵:实现拉伸、收缩、扭曲、旋转

标签:des   style   blog   http   color   使用   os   strong   

原文地址:http://www.cnblogs.com/tingshuixuan2012/p/OpenCVExercises4_7.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!