图像旋转以及C代码实现 您所在的位置:网站首页 函数图像旋转怎么画视频 图像旋转以及C代码实现

图像旋转以及C代码实现

2024-07-10 04:18| 来源: 网络整理| 查看: 265

    图像旋转就是将图像按一定角度旋转,依据当前点坐标计算出来的旋转后的坐标往不是整数,因此需要进行插值。常用的插值方法有最近邻插值法、线性插值法和样条插值法(这个我也不懂)。最近邻插值速度快,效果差;双向性插值法效果较好,速度还行。这里只讨论使用反向映射和双线性插值的图像旋转。

旋转原理:

反向映射就是依据旋转后图像中的坐标,求出其在原图像中的坐标。

如图,将图像逆时针旋转一个角度

 

    计算旋转后图像时就可以利用(3)式用旋转后的坐标计算其在原图中的坐标,并利用附近的像素插值的到当前的像素值。

    图像的原点一般在左上角,这样计算出来的坐标会有负值,一般将图像原点平移到图像中心。记原图像的宽高为srcW、srcH,旋转后图像宽高为dstW、dstH,那么(3)式就变为:

 

双线性插值

    由旋转后图像坐标计算出来的原图像坐标往往不是整数,为了保证旋转效果,进行双线性插值。双线性插值就是对两个变量的线性插值,分别对每个变量线性插值就得到最终的插值结果。

详细资料参考

http://www.cnblogs.com/linkr/p/3630902.html

 

代码如下,使用opencv加载图像。

调用方法

void main(int argc, char** argv) { IplImage* iplOrg=cvLoadImage(argv[1]); //加载图像 unsigned char* pColorImg=NULL; int width=iplOrg->width; int height=iplOrg->height; pColorImg=(unsigned char*)malloc(width*height*3*sizeof(unsigned char)); cvCvtColor(iplOrg,iplOrg,CV_BGR2RGB); IplToUchar(iplOrg,pColorImg); //用数组表示图像 cvReleaseImage(&iplOrg); double degree=15; //逆时针旋转角度0~180 int tempLength=sqrt((double)width * width + (double)height *height) + 10;//保证原图可以任意角度旋转的最小尺寸 unsigned char* pTemp=(unsigned char*)malloc(tempLength*tempLength*3*sizeof(unsigned char)); //旋转 myImgRotate(pColorImg,width,height,pTemp,tempLength,tempLength,degree,3); DisplayPicture(tempLength,tempLength,pTemp,"rotate.bmp",3); //保存图像 free(pTemp); pTemp=NULL; free(pColorImg); pColorImg=NULL; }

 

旋转函数

//逆时针旋转到pdst的中心,其它用0填充 //pSrc,srcW,srcH原图及其尺寸 //pDst,dstW,dstH旋转后图像及其尺寸 //旋转角度 //通道数 void myImgRotate(unsigned char* pSrc,int srcW,int srcH, unsigned char* pDst,int dstW,int dstH, double degree,int nchannel) { int k; double angle = degree * 3.1415926 / 180.; //旋转角度 double co=cos(angle); //余弦 double si=sin(angle); //正弦 int rotateW,rotateH; //旋转后图像的高宽 int srcWidthStep=srcW*nchannel;//宽度步长 int dstWisthStep=dstW*nchannel; int x,y; int xMin,xMax,yMin,yMax; int xOff,yOff; //偏移 double xSrc=0.; double ySrc=0.; //变换后图像的坐标在原图中的坐标 //临时变量 float valueTemp=0.; float a1,a2,a3,a4; memset(pDst,0,dstWisthStep*dstH*sizeof(unsigned char)); //计算旋转后的坐标范围 rotateH=srcW*fabs(si)+srcH*fabs(co); rotateW=srcW*fabs(co)+srcH*fabs(si); //计算偏移 xOff=dstW/2; yOff=dstH/2; yMin=(dstH-rotateH)/2.; yMax=yMin+rotateH+1; //加1 xMin=(dstW-rotateW)/2.; xMax=xMin+rotateW+1; for (y=yMin;y=0 && yBig


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有