OPENCV中常见算法之三 图像比例旋转

最关键的设置是:cvMat 2行3列的矩阵的值,这是就是计算机图形学里面的变换矩阵。具体见帮助手册
cvGetQuadrangleSubPix 词条

void CCannyDoc::OnConvert() 
{
 //声明IplImage指针
 IplImage * src = NULL;
 IplImage * dst = NULL;
 
 src = cvLoadImage(i,-1);
 int delta = 1;
 int angle = 0;
 int opt = 1;  // 1:旋转加缩放,0:  仅仅旋转
 double factor;
 dst = cvCloneImage (src);  //这里是通过函数来对dst初始化,直接“dst=src”可能导致浅拷贝
 cvNamedWindow ("src", 1);
 cvShowImage ("src", src);
 
 for (;;)
 {
  float m[6];
  // Matrix m looks like:
  //
  // [ m0  m1  m2 ] ===>  [ A11  A12   b1 ]
  // [ m3  m4  m5 ]       [ A21  A22   b2 ]
  //
  CvMat M = cvMat (2, 3, CV_32F, m);   //
  int w = src->width;
  int h = src->height;
  if (opt)  // 旋转加缩放,用到了cos肯定是循环变化
   factor = (cos (angle * CV_PI / 180.) + 1.0) * 2; 
  else   //  仅仅旋转,每次增加一个angle值
   factor = 1;
  m[0] = (float) (factor * cos (-angle * 2 * CV_PI / 180.));
  m[1] = (float) (factor * sin (-angle * 2 * CV_PI / 180.));
  m[3] = -m[1];
  m[4] = m[0];
  // 将旋转中心移至图像中间
  m[2] = w * 0.5f;
  m[5] = h * 0.5f;
  //  dst(x,y) = A * src(x,y) + b
  cvZero (dst);                                  //将dst区域全部赋给空值
  cvGetQuadrangleSubPix (src, dst, &M);
  cvNamedWindow ("dst", 1);
  cvShowImage ("dst", dst);
  
  if (cvWaitKey (1) == 27) //ESC
   break;
  angle = (int) (angle + delta) % 360;
 }   
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这是很早以前已经看过的,最近无意中又把保存的文章翻出来时,想起很多朋友问过矩阵,虽对矩阵似懂非懂,但却很想弄懂它,...
    dechuan阅读 11,265评论 4 57
  • 孟岩 理解矩阵一、二, 三 转 理解矩阵(一) 前不久chensh出于不可告人的目的,要充当老师,教别人线性代数。...
    颐真阅读 838评论 0 1
  • 理解矩阵一:转载自:http://blog.csdn.net/myan/article/details/64751...
    jiandanjinxin阅读 5,482评论 1 15
  • 最原始出处:http://blog.csdn.net/myan/article/details/647511 (C...
    IIGEOywq阅读 9,312评论 2 62
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 12,182评论 16 22