//时间:2015年6月22日
//功能:完成一个图形的几何变换
//函数:
//1、改变图像大小与输出图像大小相同
// void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );
// 参数说明: const CvArr* src 输入图像 CvArr* dst 输出图像 int interpolation 插值方式
//2、从图像中提取四边形,提取象素四边形,使用子象素精度
// void cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst, const CvMat* map_matrix );
// dst( x+width(dst)/2 , y+heigh(dst)/2 ) = src( A11x + A12y + b1 , A21x + A22y + b2 )
//收货:
//1、字母后边加f,表示单精度浮点型
//2、使用cvGetQuadrangleSubPix进行图像旋转等操作,及其使用方法。
#include <cv.h>
#include <highgui.h>
using namespace std;
int main()
{
const char * m_PicName = "华山论剑.jpg";
IplImage * mp_Pic = cvLoadImage( m_PicName , CV_LOAD_IMAGE_UNCHANGED );
//载入检测
if ( 0 == mp_Pic )
{
cout<<"载入图片失败!"<<endl;
return -1;
}
int m_Angle = 30; //旋转角度
int m_Opt = 1; //1:加缩放 0:不加缩放
double m_Factor; //缩放因子
IplImage * mp_Pic_Zoom = cvCreateImage( cvSize( mp_Pic->width/3 , mp_Pic->height/3 ) , mp_Pic->depth , mp_Pic->nChannels );
cvResize( mp_Pic , mp_Pic_Zoom , CV_INTER_NN );
float m_Member[6];
if ( 0 == m_Opt )
m_Factor = 1;
else
m_Factor = (cos(m_Angle * CV_PI/180.) + 1) / 2;
m_Member[0] = (float)( m_Factor * cos( -m_Angle * CV_PI/180. ) );
m_Member[1] = (float)( m_Factor * sin( -m_Angle * CV_PI/180. ) );
m_Member[3] = -m_Member[1];
m_Member[4] = -m_Member[0];
//将中心移动到中心
m_Member[2] = mp_Pic->width * 0.5f; //后边加f表示保存为单精度浮点型
m_Member[5] = mp_Pic->height * 0.5f;
CvMat m_M = cvMat( 2 , 3 , CV_32F , m_Member );
IplImage * mp_Pic_Rotate = cvCreateImage( cvSize( mp_Pic->width , mp_Pic->height ) , mp_Pic->depth , mp_Pic->nChannels );
cvZero( mp_Pic_Rotate );
cvGetQuadrangleSubPix( mp_Pic , mp_Pic_Rotate , &m_M);
cvNamedWindow(" 原图 " , 0);
cvShowImage( " 原图 " , mp_Pic );
cvNamedWindow(" 缩放图 " , 0);
cvShowImage( " 缩放图 " , mp_Pic_Zoom );
cvNamedWindow(" 旋转图 " , 0);
cvShowImage( " 旋转图 " , mp_Pic_Rotate );
cvWaitKey(0);
cvReleaseImage( &mp_Pic );
cvReleaseImage( &mp_Pic_Zoom );
cvReleaseImage( &mp_Pic_Rotate );
cvDestroyAllWindows;
return 0;
}
//功能:完成一个图形的几何变换
//函数:
//1、改变图像大小与输出图像大小相同
// void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );
// 参数说明: const CvArr* src 输入图像 CvArr* dst 输出图像 int interpolation 插值方式
//2、从图像中提取四边形,提取象素四边形,使用子象素精度
// void cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst, const CvMat* map_matrix );
// dst( x+width(dst)/2 , y+heigh(dst)/2 ) = src( A11x + A12y + b1 , A21x + A22y + b2 )
//收货:
//1、字母后边加f,表示单精度浮点型
//2、使用cvGetQuadrangleSubPix进行图像旋转等操作,及其使用方法。
#include <cv.h>
#include <highgui.h>
using namespace std;
int main()
{
const char * m_PicName = "华山论剑.jpg";
IplImage * mp_Pic = cvLoadImage( m_PicName , CV_LOAD_IMAGE_UNCHANGED );
//载入检测
if ( 0 == mp_Pic )
{
cout<<"载入图片失败!"<<endl;
return -1;
}
int m_Angle = 30; //旋转角度
int m_Opt = 1; //1:加缩放 0:不加缩放
double m_Factor; //缩放因子
IplImage * mp_Pic_Zoom = cvCreateImage( cvSize( mp_Pic->width/3 , mp_Pic->height/3 ) , mp_Pic->depth , mp_Pic->nChannels );
cvResize( mp_Pic , mp_Pic_Zoom , CV_INTER_NN );
float m_Member[6];
if ( 0 == m_Opt )
m_Factor = 1;
else
m_Factor = (cos(m_Angle * CV_PI/180.) + 1) / 2;
m_Member[0] = (float)( m_Factor * cos( -m_Angle * CV_PI/180. ) );
m_Member[1] = (float)( m_Factor * sin( -m_Angle * CV_PI/180. ) );
m_Member[3] = -m_Member[1];
m_Member[4] = -m_Member[0];
//将中心移动到中心
m_Member[2] = mp_Pic->width * 0.5f; //后边加f表示保存为单精度浮点型
m_Member[5] = mp_Pic->height * 0.5f;
CvMat m_M = cvMat( 2 , 3 , CV_32F , m_Member );
IplImage * mp_Pic_Rotate = cvCreateImage( cvSize( mp_Pic->width , mp_Pic->height ) , mp_Pic->depth , mp_Pic->nChannels );
cvZero( mp_Pic_Rotate );
cvGetQuadrangleSubPix( mp_Pic , mp_Pic_Rotate , &m_M);
cvNamedWindow(" 原图 " , 0);
cvShowImage( " 原图 " , mp_Pic );
cvNamedWindow(" 缩放图 " , 0);
cvShowImage( " 缩放图 " , mp_Pic_Zoom );
cvNamedWindow(" 旋转图 " , 0);
cvShowImage( " 旋转图 " , mp_Pic_Rotate );
cvWaitKey(0);
cvReleaseImage( &mp_Pic );
cvReleaseImage( &mp_Pic_Zoom );
cvReleaseImage( &mp_Pic_Rotate );
cvDestroyAllWindows;
return 0;
}