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<opencv2\opencv.hpp>
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;
}


顯示結果:



注意 根據註釋,若srcImage和grayImage指針所指向的圖片通道數不正確,會出現下圖的錯誤;(該錯誤可以稱爲數組越界)







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章