2011年09月29日
来源:互联网 发布:新疆大学网络管理系统 编辑:程序博客网 时间:2024/06/05 11:46
转载自(http://www.cnblogs.com/HappyXie/archive/2011/03/02/1969434.html)
//OpenCV 4 下的图像任意角度的旋转
//需要inter公司的OpenCV的支持.
//OpenCV 4下的图像任意角度的旋转
//待旋转的图像IplImage* Img_old
//返回的旋转后图像 IplImage* Img_tmp.
//旋转的角度,单位度.
//三种不同的方法.其中方法二没有完全测试,方法一可以满足大部分需要
IplImage * FitRotate (IplImage* Img_old, double angle,intmethod)
{
IplImage* Img_tmp = NULL;
double anglerad = (CV_PI* (angle/180)) ;
int newheight =int (fabs((sin(anglerad)*Img_old->width )) + fabs((cos(anglerad)*Img_old->height )) );
int newwidth =int (fabs((sin(anglerad)*Img_old->height)) + fabs((cos(anglerad)*Img_old->width)) );
Img_tmp =cvCreateImage(cvSize(newwidth,newheight), IPL_DEPTH_8U, 3);
cvFillImage(Img_tmp,0);//目的图像 使用扩展的大小
IplImage* dst = cvCloneImage( Img_old );//目的图像与原图像等大
floatm[6];
CvMat M = cvMat( 2, 3, CV_32F, m );
if(1==method)
{
//方法一 提取象素四边形,使用子象素精度
int w =Img_old->width;
int h = Img_old->height;
m[0] = (float)(cos(angle*CV_PI/180.));
m[1] = (float)(sin(angle*CV_PI/180.));
m[2] = w*0.5f;
m[3] = -m[1];
m[4] = m[0];
m[5] = h*0.5f;
cvGetQuadrangleSubPix( Img_old, dst, &M, 1,cvScalarAll(0));
cvGetQuadrangleSubPix( Img_old, Img_tmp, &M,CV_INTER_LINEAR, cvScalarAll(0));//+CV_WARP_FILL_OUTLIERS
//方法一 提取象素四边形,使用子象素精度
}
if(2==method)
{
//方法二 使用 二维旋转的仿射变换矩阵 存在问题要求输入和输出图像一样大 旋转中心不对
CvPoint2D32f center;
center.x=float(Img_old->width/2.0+0.5);//float(Img_tmp->width/2.0+0.5);
center.y=float(Img_old->height/2.0+0.5);//float(Img_tmp->height/2.0+0.5);
cv2DRotationMatrix( center,angle,1, &M);
cvWarpAffine( Img_old, dst,&M,CV_INTER_LINEAR,cvScalarAll(0) );//小图
//小目标图像
//对图像进行扩展
// 只能一定角度以内 不同象限的不同对待
int dx=int((newwidth -Img_old->width )/2+0.5);
int dy=int((newheight-Img_old->height)/2+0.5);
uchar* old_ptr,*temp_ptr;
//需要inter公司的OpenCV的支持.
//OpenCV 4下的图像任意角度的旋转
//待旋转的图像IplImage* Img_old
//返回的旋转后图像 IplImage* Img_tmp.
//旋转的角度,单位度.
//三种不同的方法.其中方法二没有完全测试,方法一可以满足大部分需要
IplImage * FitRotate (IplImage* Img_old, double angle,intmethod)
{
IplImage* Img_tmp = NULL;
double anglerad
int newheight =int (fabs((sin(anglerad)*Img_old->width )) + fabs((cos(anglerad)*Img_old->height )) );
int newwidth
cvFillImage(Img_tmp,0);//目的图像 使用扩展的大小
IplImage* dst = cvCloneImage( Img_old );//目的图像与原图像等大