1. 程式人生 > >OpenCV 學習日記(二)---牛刀小試:輸入輸出影象和視訊

OpenCV 學習日記(二)---牛刀小試:輸入輸出影象和視訊

作者:teeyohuang

本文系交流學習使用,轉載請註明出處,謝謝

  於 2016/6/15

Visual studio2010 + openCV 2.4.9

這一部分主要是舉了幾個簡單的例子,以便大家對openCV有個初步的瞭解。宣告一下,這幾個例子,包括以後舉得一些例子及其程式程式碼都是來自於:

清華大學出版社的《學習openCV》,Gary Bradski & Adrian Kaehler 著,於仕琪 劉瑞禎 譯。

只做學習交流使用,不以牟利為目的。

一、顯示影象

既然你已經在學習OpenCV了,那肯定知道它主要是用來幹什麼。所以我們最基礎的一個例子,自然就是顯示影象了。

#include<highgui.h>
int main(int argc, char** argv){
IplImage* img= cvLoadImage ("曉月.jpg");
cvNamedWindow("image1",CV_WINDOW_AUTOSIZE);
cvShowImage("image1",img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("image1");
}
注意:圖片 “曉月.jpg”我已經提前放到了有源程式cpp那個資料夾裡面,

其實在源程式中也可以直接引用圖片存放的路徑,比如我還在其他位置放了一張 曉月.jpg,

我的路徑為:D:\Documents\C_Language\視訊和圖片庫,裡面有張圖片叫做 曉月.jpg

在往vs裡面寫的時候,要注意是這麼寫 IplImage* img= cvLoadImage ("D:/Documents/C_Language/視訊和圖片庫/曉月.jpg");

!!!!!注意程式裡那個斜線的傾斜方向哦!!!!直接copy路徑是往左傾斜,但是要改成往右傾斜才正確。

程式的解釋:

①cvLoadImage:很明顯,load+image,字面意思就是載入影象,此函式返回一個指標值,如這裡面定義的指標 img;

②IplImage:拆分看ipl + image,ipl是xx的縮寫,所以他的意思也好理解。其實IplImage就是一類結構體的名稱,是我們經常用到的資料結構。

③cvNamewindow:就是生成一個視窗,雙引號中的內容就是這個視窗名字,可以試著把cvShowImage(“example1”,img)這一行註釋掉,然後再看執行結果,你就會發現它確實只出現了一個視窗。這個東西就是由#include<highgui.h>引進來的。

然後是後面的CV_WINDOW_AUTOSIZE這句話,這個其實是定義了視窗的屬性。Auto+size,字面意思就是自動大小,就是說這個視窗會適應圖片的大小,圖片有多大,視窗就有多大,感興趣的可以拿大小不同的圖片進行試驗。一般設定為0,設定為0之後,視窗的大小不會自動適應圖片大小,但是你此時可以進行拉伸,可以自己去試驗。

④cvShowImage:不用多說

⑤cvWaiKey(0):等待你觸發一個按鍵程式才結束

⑥cvReleaseImage、cvDestroyWindow都是釋放類存的作用,簡單的程式可以不用這兩步。

注意:新手有幾個常犯的錯誤,一定要區分開上面程式裡的大小寫,大小寫不對是不能正確執行的,所以以後一定要區分開大小寫!然後就是cvNamedWindow,注意是Name d  Window!中間有個d,漏掉這個當然就是錯的。

上面幾行程式其實是openCV1.x裡面的了,時C語言的介面,一般在OpenCV2.x以上版本,都是下面這麼顯示影象,方便快捷,
#include<highgui.h>
#include<opencv2\core\core.hpp>
#include<opencv2\opencv.hpp>
using namespace cv;
int main(){
Mat img1 = imread("D:/Documents/C_Language/experiment1_showImage/experiment1_showImage/曉月.jpg");//注意這個斜線往右邊倒
namedWindow("img1",0);
imshow("img1",img1);
cvWaitKey(0);
cvDestroyWindow("img1");
return 0;
}
這是基於C++介面的2.x版本都這麼寫,詳細情況後面的文章會有介紹

二、播放AVI視訊

#include<highgui.h>
#include<opencv.hpp>
int main( int argc, char ** argv){
cvNamedWindow("example",0);
CvCapture* capture= cvCreateFileCapture("D:/Documents/C_Language/Experiment2_playvideo/shipin.avi");
IplImage * frame;
while(1){
      frame = cvQueryFrame(capture);
      if ( !frame) break;
cvShowImage("example",frame);
char c= cvWaitKey(30);
if  (c==27) break;}
cvReleaseCapture(&capture);
cvDestroyWindow("example");

return 0;
}
視訊結果就不顯示了,下面是程式分析:

①cvCreateFileCapture,和cvLoadImage功能上類似,只不過這裡是讀入AVI檔案,然後返回一個指標,返回指標所指向的Cvcapture結構被初始化到所對應檔案的開頭。

②frame =cvQueryFrame(capture);這句話其實就是把剛剛AVI視訊,按照一幀一幀的影象的形式,複製給frame,然後再用cvShowImage顯示出來,這裡需要理解的就是,視訊其實就是由很多幀影象構成的,聯絡一下電影和電影膠捲,你就明白了。

③char c=cvWaitKey(40)每幀之間停頓40ms,你可以之後隨意更改此處的值,看看視訊播放起來有什麼區別。

④if  (c==27) break;播放期間如果你按了一按鍵,c就會被賦值為這個按鍵對應的ASCII碼,而Esc的ASCII碼是27,所以當你按了Esc之後,會退出播放介面。


常用的基於C介面的OpenCV1.x的六個函式(I/O)

 1. 影象載入函式

函式cvLoadImage載入指定影象檔案,並返回指向該檔案的IplImage指標。函式支援bmp、jpg、 png、 tiff等格式的影象。其函式原型如下: IplImage* cvLoadImage( const char* filename, int iscolor); 其中,filename 是待載入影象的名稱,包括影象的副檔名;iscolor是一個輔助引數項,可選正數、零和負數三種值,正數表示作為三通道影象載入,零表示該影象作為單通道影象,負數表示載入影象的通道數由影象檔案自身決定。

 2. 視窗定義函式 函式

cvNamedWindow定義一個視窗,用於顯示影象。其函式原型如下: int cvNamedWindow( const char* name, unsigned long flags ); 其中,name是視窗名,flags是視窗屬性指標值,可以選擇CV_WINDOW_AUTOSIZE和0兩種值。CV_WINDOW_AUTOSIZE表示視窗尺寸與影象原始尺寸相同,0表示以固定的視窗尺寸顯示影象。

3. 影象顯示函式 函式cvShowImage

是在指定的視窗中顯示影象,其函式原型如下: void cvShowImage( const char* name, const CvArr* image ); 其中,name是視窗名稱,image是影象型別指標,一般是IplImage指標。

 4. 影象儲存函式 函式cvSaveImage

以指定的檔名儲存IplImage型別的指標變數,其函式原型如下: int cvSaveImage( const char*filename, const CvArr* image ); 其中,filename是影象儲存路徑和名稱,image是IplImage指標變數。

 5. 影象銷燬函式 函式cvReleaseImage

銷燬已定義的IplImage指標變數,釋放佔用記憶體空間。其函式原型如下: void cvReleaseImage(IplImage** image ); 其中,image為已定義的IplImage指標。

6. 影象轉換函式 cvGetImage( const CvArr* arr, IplImage* image_header )