Opencv学习手册(三)---图像坐标变换

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/daocaorencrl/article/details/49745025
/**************************************************************
//
//	功  能:使用OpenCV函数实现图像的旋转(平移和缩放)
//
***************************************************************/
#include <opencv2/opencv.hpp>
using namespace cv;


void myRotate(IplImage* src, int angle); //声明自定义的图像旋转函数

int main()
{
	IplImage *src;
	src=cvLoadImage("test.jpg");
	if(!src) 
	{
		printf("加载图片失败!\n");
		return -1;
	}

	cvNamedWindow("src",1);//窗口固定大小
	cvMoveWindow("src",200,80);//设定窗口左上角坐标位置
	cvShowImage("src", src);
    
	int ang=45;
	myRotate(src, ang);//调用自定义的函数,旋转图像

	cvWaitKey(0);
	cvReleaseImage(&src);
	cvDestroyWindow("src");
	return 0;
}

void myRotate(IplImage* src, int angle)//自定义图像旋转函数
{ 
    IplImage *dst=0;
    dst = cvCloneImage (src);

    float m[6];
	int w = src->width;
	int h = src->height;
	m[0] = cos(angle * CV_PI/180);
	m[1] = sin(angle * CV_PI/180);
	m[2] = w*0.5f;
	m[3] = -m[1];
	m[4] = m[0];
	m[5] = h*0.5f;
	CvMat M = cvMat( 2, 3, CV_32F, m );//初始化一个2行3列的矩阵M(矩阵元素的数据类型为32位float型)
	cvGetQuadrangleSubPix( src, dst, &M);//以M矩阵变换src图像为dst图像

    cvNamedWindow("dst",1); 
	cvMoveWindow("dst",500,80);
	cvShowImage("dst", dst);
}


函数说明:

 

cvCloneImage复制图像函数

语法:IplImage* cvCloneImage(const IplImage*image)

输入参数为源图像IplImage指针,返回值为目标IplImage指针。

说明:该函数非常直接地对源图像进行拷贝,也是一种快捷的图像指针初始化方法,但是与cvCreateImage的灵活性相比,本函数局限于生成一个与源图像尺寸、通道数一模一样的图像。

 

cvMat初始化矩阵函数

语法:CvMat cvMat(int rows, int cols, int type,void *data=NULL)

参数:rows矩阵行数,cols矩阵列数,type元素类型,data可选项,指向分配给矩阵头的数据指针。

 

OpenCV中重要的矩阵变换函数,使用方法为:

cvMat* cvCreateMat ( int rows, int cols,int type );

这里type可以是任何预定义类型,预定义类型的结构如下:CV_<bit_depth>(S|U|F)C<number_of_channels>。于是,矩阵的元素可以是32位浮点型数据(CV_32FC1),或者是无符号的8位三元组的整型数据(CV_8UC3),或者是无数的其他类型的元素。一个CvMat的元素不一定就是个单一的数字。在矩阵中可以通过单一(简单)的输入来表示多值,这样我们可以在一个三原色图像上描绘多重色彩通道。对于一个包含RGB通道的简单图像,大多数的图像操作将分别应用于每一个通道(除非另有说明)。

 

cvGetQuadrangleSubPix

使用子像素精度提取像素四边形。该函数通过指定的变换矩阵对原图像进行相应的变换。

语法:void cvGetQuadrangleSubPix( const CvArr*src, CvArr *dst, const CvMat *map_matrix)

参数:src 输入图像

      dst提取的四边形

      map_matrix 为2*3的变换矩阵[A | b]

说明:此函数以子像素精度从图像src中提取四边形,并将结果存储于dst,计算公式如下:

 dst[x + width(dst)/2, y+height(dst)/2] = src(,)

其中,A和b为几何形变参数,均来自映射矩阵map_matrix。映射矩阵为:

map_matrix=

此处,非整数坐标的像素点值通过双线性插值得到。多通道图像的每一个通道都单独计算。

这个函数旋转图像后,超出原图像部分,默认的是重复边界模式

 

 

cvResize图像尺寸变换(缩放)函数

功能:函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小。若设定 ROI,函数将按常规支持ROI.

语法:void cvResize( const CvArr* src, CvArr*dst, int interpolation= CV_INTER_LINEAR );

参数:src 输入图像

dst 输出图像

interpolation 插值方法,包括:

(1) CV_INTER_NN - 最近邻插值

(2)CV_INTER_LINEAR - 双线性插值(默认时使用)

(3)CV_INTER_AREA - 使用像素关系重采样。当图像缩小时,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法。

(4)CV_INTER_CUBIC - 立方插值

 

 

cvFlip垂直,水平或既垂直又水平地翻转二维数组

语法:voidcvFlip( const CvArr* src, CvArr* dst=NULL, int flip_mode=0)

参数:src输入数组

dst 输出数组,若dst = NULL,则翻转是在内部替换。

flip_mode 指定怎样翻转数组。若=0,则绕x轴翻转;若>0,则绕y轴翻转;若<0,则绕x轴和y轴翻转。

说明:函数cvFlip以下面三种方式之一翻转数组(行和列下标是以0为基点的):

if flip_mode = 0,则dst(i,j)=src(rows(src)-i-1,j),绕x轴旋转

if flip_mode > 0,则dst(i,j)=src(i,cols(src1)-j-1),绕y轴旋转

if flip_mode < 0,则dst(i,j)=src(rows(src)-i-1,cols(src)-j-1),绕x轴和y轴旋转






展开阅读全文

没有更多推荐了,返回首页