OpenCV中cvLoadImage()函数和cvCreateImage()函数的异同之处!

(1)cvLoadImage()函数

含义:是从磁盘中载入图像的函数;

函数原型:IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );

第一个参数:filename :要被读入的文件的文件名(包括后缀);

这里要特别注意(有三种读入方法)

1,直接从任意磁盘中读取图片,必须是是绝对路径,遇到反斜杠的时候变成两个反斜杠,例如“G:\\Image\\1.jpg”;

2,将图片直接放在工程文件夹下面即可,与debug文件同级,例如".\\face2.jpg";

3,可以利用命令行参数添加文件的路径引用(这里不详述)

第二个参数:指定读入图片的颜色和深度。这里的color有几个值可以选择

这里注意(有两种方法)

1,利用变量。

CV_LOAD_IMAGE_COLOR 默认情况下,图像是以8位,3个通道的形式被读入(默认也使得图像强制转换为3通道)

CV_LOAD_IMAGE_GRAYSCALE 强制转换为单通道

CV_LOAD_IMAGE_ANGCOLOR 则以保持原始图像通道数的方式读入

CV_LOAD_IMAGE_ANYDEPTH ???这个含义好像使读入的图像为16位图像

CV_LOAD_IMAGEUNCHANGED 使得读入图像的通道数和位数与原始图像保持一致

2,利用数字代替参变量。

-1 默认读入图像的原通道数

0 强制转换为灰度图

1 读入彩色图

(2)cvCreateImage()函数

含义 :创建首地址并分配存储空间

函数原型:IplImage* cvCreateImage( CvSize size, int depth, int channels );

第一个参数:size 图像的宽和高

这个参数的设置也有好几种方式

1 :IplImage* Image = cvLoadImage("G:\\Image\\1.jpg",1);//读入一张彩色图

CvSize grayImageSize;

grayImageSize.width = Image->width;

grayImageSize.height = Image->height;

IplImage*grayImage =cvCreateImage(grayImageSize,Image->depth,1); //开辟一个Image图像相同的内存

cvCvtColor(Image,grayImage,GRAY2RGB); //将彩色图Image,转换为灰度图grayImage

2 IplImage*grayImage =cvCreateImage(CvSize(Image->width,Image->height),Image->depth,1);

3: IplImage*grayImage =cvCreateImage(CvSize(cvGetSize(Image)),Image->depth,1);

第二个参数 :图像元素的深度,可以是下面的其中之一

IPL_DEPTH_8U - 无符号8位 整型
IPL_DEPTH_8S - 有符号8位整型
IPL_DEPTH_16U - 无符号16位整型
IPL_DEPTH_16S - 有符号16位整型
IPL_DEPTH_32S - 有符号32位整型
IPL_DEPTH_32F -  单精度浮点数
IPL_DEPTH_64F -  双精度浮点数

第三个参数:channels 每个元素(像素)通道数.可以是 1, 2, 3 或 4.通道是交叉存取的,

例如通常的彩色图像数据排列是:b0 g0 r0 b1 g1 r1 ... 虽然通常 IPL 图象格式可以存贮非交叉存取的图像,并且一些OpenCV 也能

处理他, 但是这个函数只能创建交叉存取图像.。

(3)一个简单的例子

#include
int main()
{
	IplImage* srcImage=cvLoadImage(".\\face2.jpg",1);				//注意第二个参数的值

	CvSize ImageSize;
	ImageSize.height=srcImage->height;
	ImageSize.width=srcImage->width;
	IplImage* Image = cvCreateImage( ImageSize,srcImage->depth,1); //注意第三个参数的值
	cvCvtColor(srcImage,Image,CV_RGB2GRAY);	  //这里的srcImage必须是指向三通道的彩色图片的指针,Image必须是单通道的灰度图片指针,不然会出现下面的错误
	cvCanny(srcImage,Image,3,9,3);            //进行简单的边缘检测

	cvNamedWindow("原图");
	cvNamedWindow("效果图");

	cvShowImage("原图",srcImage);
	cvShowImage("效果图",Image);

	cvWaitKey(0);
	cvReleaseImage(&srcImage);
	cvReleaseImage(&Image);
	cvDestroyWindow("原图");
	cvDestroyWindow("效果图");
	return 0;
}


显示结果:

OpenCV中cvLoadImage()函数和cvCreateImage()函数的异同之处!_第1张图片


注意 根据注释,若srcImage和grayImage指针所指向的图片通道数不正确,会出现下图的错误;(该错误可以称为数组越界)

OpenCV中cvLoadImage()函数和cvCreateImage()函数的异同之处!_第2张图片






你可能感兴趣的:(OpenCV笔记)