• Open Source Computer Vision Library

图像旋转与缩放

Wikipedia,自由的百科全书

初始作者:Hunnish 来源:http://blog.csdn.net/hunnish/archive/2006/11/07/1370998.aspx

  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include "math.h"
  4. int main (int argc, char **argv)
  5. {
  6. IplImage *src = 0;
  7. IplImage *dst = 0;
  8.  
  9. /* the first command line parameter must be image file name */
  10. if ((argc == 2) && (src = cvLoadImage (argv[1], -1)) != 0)
  11. {
  12. int delta = 1;
  13. int angle = 0;
  14. int opt = 0; // 1: 旋转加缩放
  15. // 0: 仅仅旋转
  16. double factor;
  17.  
  18. dst = cvCloneImage (src);
  19. cvNamedWindow ("src", 1);
  20. cvShowImage ("src", src);
  21.  
  22. for (;;)
  23. {
  24. float m[6];
  25. // Matrix m looks like:
  26. //
  27. // [ m0 m1 m2 ] ===> [ A11 A12 b1 ]
  28. // [ m3 m4 m5 ] [ A21 A22 b2 ]
  29. //
  30. CvMat M = cvMat (2, 3, CV_32F, m);
  31. int w = src->width;
  32. int h = src->height;
  33. if (opt) // 旋转加缩放
  34. factor = (cos (angle * CV_PI / 180.) + 1.0) * 2;
  35. else // 仅仅旋转
  36. factor = 1;
  37. m[0] = (float) (factor * cos (-angle * 2 * CV_PI / 180.));
  38. m[1] = (float) (factor * sin (-angle * 2 * CV_PI / 180.));
  39. m[3] = -m[1];
  40. m[4] = m[0];
  41. // 将旋转中心移至图像中间
  42. m[2] = w * 0.5f;
  43. m[5] = h * 0.5f;
  44. // dst(x,y) = A * src(x,y) + b
  45. cvZero (dst);
  46. cvGetQuadrangleSubPix (src, dst, &M);
  47. cvNamedWindow ("dst", 1);
  48. cvShowImage ("dst", dst);
  49. if (cvWaitKey (1) == 27) //ESC
  50. break;
  51. angle = (int) (angle + delta) % 360;
  52. } // for-loop
  53. }
  54. return 0;
  55. }
  56.  

Python 版本

  1.  
  2. # -*- coding:utf-8 -*-
  3. ###########################################################
  4. # OpenCV example
  5. #
  6. # 图像旋转与缩放
  7. #
  8. # By ChaiShushan 2008
  9. ###########################################################
  10.  
  11. import sys
  12. import math
  13.  
  14. # 导入OpenCV模块
  15.  
  16. from opencv.cv import *
  17. from opencv.highgui import *
  18.  
  19. if __name__ == '__main__':
  20.  
  21. if len(sys.argv) == 2:
  22.  
  23. src = cvLoadImage(sys.argv[1], -1)
  24. if not src: sys.exit(-1)
  25.  
  26. delta = 1;
  27. angle = 90;
  28. opt = 0; # 1: 旋转加缩放, 0: 仅仅旋转
  29. factor = 1;
  30.  
  31. dst = cvCloneImage (src);
  32. cvNamedWindow ("src", 1);
  33. cvShowImage ("src", src);
  34.  
  35. M = cvCreateMat (2, 3, CV_32F)
  36.  
  37. while True:
  38.  
  39. w = src.width;
  40. h = src.height;
  41.  
  42. # factor大小未改变
  43.  
  44. M[0,0] = factor * math.cos (-angle * 2 * CV_PI / 180.0);
  45. M[0,1] = factor * math.sin (-angle * 2 * CV_PI / 180.0);
  46. M[1,0] = -M[0,1];
  47. M[1,1] = M[0,0];
  48.  
  49. # 将旋转中心移至图像中间
  50.  
  51. M[0,2] = w * 0.5;
  52. M[1,2] = h * 0.5;
  53.  
  54. # dst(x,y) = A * src(x,y) + b
  55.  
  56. cvZero (dst);
  57. cvGetQuadrangleSubPix (src, dst, M);
  58.  
  59. cvNamedWindow ("dst", 1);
  60. cvShowImage ("dst", dst);
  61.  
  62. # ESC
  63.  
  64. if cvWaitKey(10) == '\x1b':
  65. break
  66.  
  67. angle = (angle + delta) % 360
  68.  

注: Python版本由chai2010改写.

Views
Personal tools