织梦CMS - 轻松建站从此开始!

罗索

图像旋转公式及opencv中cvGetQuadrangleSubPix 的用法

落鹤生 发布于 2013-12-10 20:33 点击:次 
首先根据旋转的角度、图象对角线的长度计算旋转后的图像的最大宽度、高度,根据旋转后图象最大的宽度、高度生成新的缓冲区,假设图像的左上角为 (left, top),右下角为(right, bottom),则图像上任意点(x, y)绕其中心(xcenter, ycenter)逆时针旋转angle
TAG: OpenCV  图像旋转  

图像任意角度的旋转公式

图像旋转是指把定义的图像绕某一点以逆时针或顺时针方向旋转一定的角度,通常是指绕图像的中心以逆时针方向旋转。

首先根据旋转的角度、图象对角线的长度计算旋转后的图像的最大宽度、高度,根据旋转后图象最大的宽度、高度生成新的缓冲区,假设图像的左上角为 (left,   top),右下角为(right,   bottom),则图像上任意点(x,   y)绕其中心(xcenter,   ycenter)逆时针旋转angle角度后,新的坐标位置(x1,   y1)的计算公式为:

  1. xcenter   =   (width+1)/2+left;   
  2. ycenter   =   (height+1)/2+top;   
  3. x1   =   (x-xcenter)   cosθ-   (y   -   ycenter)   sinθ+xcenter;   
  4. y1   =   (x-xcenter)   sinθ+   (y-   ycenter)   cosθ+   ycenter; 

与图像的镜像变换相类似,把原图中的象素值读入新缓冲区的(x1,y1)点处。注意在新缓冲区中与原图没有对应的象素点的值用白色代替。

GetQuadrangleSubPix

提取象素四边形,使用子象素精度

void cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst, const CvMat* map_matrix ); 
src
输入图像.
dst
提取的四边形.
map_matrix
3 × 2 变换矩阵 [A|b] (见讨论).

函数 cvGetQuadrangleSubPix 以子象素精度从图像 src 中提取四边形,使用子象素精度,并且将结果存储于 dst ,计算公式是:  

dst(x +
width(dst) / 2,y
+ height(dst) /
2) = src(A11x +
A12y + b1,A21x +
A22y + b2)

其中 A和 b 均来自映射矩阵(译者注:A, b为几何形变参数) ,映射矩阵为:

其中在非整数坐标的象素点值通过双线性变换得到。当函数需要图像边界外的像素点时,使用重复边界模式(replication border mode)恢复出所需的值。多通道图像的每一个通道都单独计算。

例子:使用 cvGetQuadrangleSubPix 进行图像旋转

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

 

 

(xiangge2009)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201312/16848.html]
本文出处:搜狐博客 作者:xiangge2009
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容