1. 程式人生 > >幾個重要的函數opencv

幾個重要的函數opencv

問題: 符號 獲取 fps 元素 處理圖像 比例 結構體 采樣

1、CvCapture結構體: CvCapture是一個結構體,用來保存圖像捕獲的信息,就像一種數據類型(如int,char等)只是存放的內容不一樣,在OpenCv中,它最大的作用就是處理視頻時(程序是按一幀一幀讀取),讓程序讀下一幀的位置,CvCapture結構中,每獲取一幀後,這些信息都將被更新,獲取下一幀回復。 如CvCapture* pCapture = NULL;

2、cvCreateFileCapture(const char* mov) cvCreateFileCapture()通過參數設置確定要讀入的avi文件,返回一個指向CvCapture結構的指針。這個結構包括了所有關於要讀入avi文件的信息,其中包含狀態信息。調用這個函數之後,返回指針所指向的CvCapture結構唄初始化到對應的avi文件的開頭。 如pCapture=cvCreateFileCapture("d:\\xx.avi");

3、IplImage* cvCreateImage(CvSize size,int depth,int channels); cvCreateImage:創建首地址並且分配存儲空間:IplImage* cvCreateImage(CvSize size,int depth,int channels); //size:圖像的寬、高;depth:圖像元素的位深度,可以是一下其中之一: 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 - 雙精度浮點數

4、cvSetTrackbarPos("進度條名稱","窗口名稱",pos): 這個函數要和另外兩個函數配套使用,一個是回調函數,也就是響應鼠標的函數(即下面的CvTrackbarCallback on_change),這個是自定義的。第二個是創建函數cvCreateTrackbar(),這個函數的最後一個參數是前面回調函數,用來創建一個進度條。 關於cvSetTrackbarPos,他有3個參數cvSetTrackbarPos("進度條名稱","窗口名稱",pos)。第三個參數是當前進度條的位置,可以按照視頻幀數的比例來設置當前進度值,也可以用循環pos++來設置。

5、cvQueryFrame(CvCapture* capture): 表示從攝像頭或者文件中抓取並返回一幀。 IplImage* cvQueryFrame(CvCapture* capture);函數cvQueryFrame從攝像頭或者文件中抓取一幀,然後解壓並且返回這一幀。這個函數僅僅是函數cvGrabFrame和函數cvRetrieveFrame在一起調用的組合。返回的圖像不可以被用戶釋放或者修改。 cvQueryFrame的參數是CvCapture結構的指針。用來將下一幀視頻文件載入內存,返回一個對應當前幀的指針。與cvLoadImage不同的是cvLoadImage為圖像分配內存空間,而cvQueryFrame使用已經在cvCapture結構中分配好的內存,這樣就沒必要通過cvReleaseImage()對這個返回的圖像指針進行釋放,當CvCapture結構被釋放後,每一幀圖像對應的內存空間會被釋放。

6、CvCaptureFromCAM(int index): 初始化從攝像頭中獲取視頻:CvCapture* cvCaptureFromCAM(int index); index:要使用的攝像頭索引。如果只有一個攝像頭或者用哪個攝像頭也無所謂,那麽使用參數-1便可以。 函數給從攝像頭的視頻流分配和初始化CvCapture結構。

7、cvCreateTrackbar(const char* trackbar_name,const char* window_name,int* value,int count,CvTrackbarCallback on_change); 該函數為開放計算機視覺(OpenCV)庫庫函數,創建trackbar並將它添加到指定的窗口。 定義: CV_EXTERN_C_FUNCPTR(void (*CvTrackbarCallback)(int pos)); int cvCreateTrackbar(const char* trackbar_name,const char* window_name,int* value,int count,CvTrackbarCallback on_change); 參數: trackbar_name:被創建的trackbar名字 window_name:窗口名字,這個窗口將為被創建trackbar的父對象 value:整數指針,它的值將反映滑塊的位置,這個變量指定創建時的滑塊位置。 count:滑塊位置的最大值。最小值一直是0 on_change:每次滑塊位置被改變的時候,被調用函數的指針。這個函數應該被聲明為void Foo(int),如果沒有回調函數,這個值可以設置為NULL。 函數cvCreateTrackbar用指定的名字和範圍來創建trackbar(滑塊或者範圍控制),指定與trackbar位置同步的變量,並且指定當trackbar位置被改變的時候調用的回調函數。 被創建的trackbar默認顯示在指定窗口的頂端,可以通過cvGetTrackbarPos來獲取trackbar顯示的位置信息,以及通過函數cvSetTrackbarPos來重新設置trackbar的位置。

8、double cvGetCaptureProperty(CvCapture* capture,int property_id); double cvGetCaptureProperty(CvCapture* capture,int property_id)獲取視頻文件的一些屬性, //capture 視頻獲取結構;property_id 屬性標識。 以下是OpenCV屬性的一些宏定義: CV_CAP_PROP_POS_MSEC //影片目前位置,為毫秒數或者視頻獲取時間戳 CV_CAP_PROP_POS_FRAMES //將被下一步解壓/獲取的幀索引,以0為起點 CV_CAP_PROP_POS_AVI_RATIO //視頻文件的相對位置(0 - 影片的開始,1 - 影片的結尾) CV_CAP_PROP_FRAME_WIDTH //視頻流中的幀寬度 CV_CAP_PROP_FRAME_HEIGHT //視頻流中的幀高度 CV_CAP_PROP_FPS //幀率 CV_CAP_PROP_FOURCC //表示codec的四個字符 CV_CAP_PROP_FRAME_COUNT // 視頻文件中幀的總數 CV_CAP_PROP_FORMAT CV_CAP_PROP_MODE CV_CAP_PROP_BRIGHTNESS CV_CAP_PROP_CONTRAST CV_CAP_PROP_SATURATION CV_CAP_PROP_HUE CV_CAP_PROP_GAIN CV_CAP_PROP_EXPOSURE CV_CAP_PROP_CONVERT_RGB CV_CAP_PROP_WHITE_BALANCE CV_CAP_PROP_RECTIFICATION 通過創建一個Capture對象的指針後,調用cvGetCaptureProperty即可獲取上述任何相關屬性;但是我們不能太依賴這個函數;比如我們想獲取一段視頻的幀數,我們就不能太依賴於CV_CAP_PROP_FRAME_COUNT這個屬性;因為cvGetCaptureProperty對屬性的訪問,其實訪問的是關聯視頻文件的文件頭信息,並不是真正去訪問了視頻的圖像數據,這就帶來一個問題:我們在講其他視頻格式轉換為AVI格式的時候,圖像幀數並沒改變,只是視頻文件頭改變了,這時直接通過get函數讀取的信息就可能不準確;最好的辦法是叠代從視頻中取出一幀,檢查是否有數據,來確定該視頻文件的總共幀數~~~ 例如: 示例1: CvCapture* cap = cvCaptureFromFile(videoName);//獲取視頻 int numFrames = (int) cvGetCaptureProperty(cap,CV_CAP_PROP_FRAME_COUNT);//得到視頻幀數, //得到的幀數是148幀 示例2:[較好的方法] IplImage* pImg = NULL; int count = 0; while((pImg = cvQueryFrame(cap))!=NULL){ count++; }//得到的幀數只有60幀

9、cvSetCaptureProperty int cvSetCaptureProperty(CvCapture* capture,int property_id,double value); 註意此方法定位並不準確 capture:視頻獲取結構 property_id:屬性識別,可以是下面之一: CV_CAP_PROP_POS_MSEC //從文件開始的位置,單位為毫秒 CV_CAP_PROP_POS_FRAMES //單位為幀數的位置(只對視頻文件有效) CV_CAP_PROP_POS_AVI_RATIO // 視頻文件的相對位置(0 - 影片的開始,1 - 影片的結尾) CV_CAP_PROP_FRAME_WIDTH //視頻流的幀寬度(只對攝像頭有效) CV_CAP_PROP_FRAME_HEIGHT //視頻流的幀高度(只對攝像頭有效) CV_CAP_PROP_FPS //幀率(只對攝像頭有效) CV_CAP_PROP_FOURCC //表示codec的四個字符(只對攝像頭有效) value表示的是屬性的值

10、cvSmooth 函數cvSmooth可以使用簡單模糊、簡單無縮放變換的模糊、中值模糊、高斯模糊、雙邊濾波的任何一種方法平滑圖像。每一種方法都有自己的特點和局限。沒有縮放的圖像平滑僅支持單通道圖像,並且支持8位到16位的轉換和32位浮點數到32為浮點數的變換格式。簡單模糊和高斯模糊支持1-或3-通道,8-比特和32-比特浮點圖像。這兩種方法可以(in-place)方式處理圖像。中值和雙向濾波工作於1-或3-通道,8-位圖像,但是不能以in-place方式處理圖像。 void cvSmooth(const CvArr* src,CvArr* dst,int smoothtype=CV_GAUSSIAN,int param1=3,int param2=0,double param3=0,double param4=0); //src:輸入圖像 //dst:輸出圖像 //smoothtype:平滑方法 平滑方法如下: CV_BLUR_NO_SCALE (簡單不帶尺度變換的模糊) - 對每個象素的 param1×param2 領域求和。如果鄰域大小是變化的,可以事先利用函數 cvIntegral 計算積分圖像。 CV_BLUR (simple blur) - 對每個象素param1×param2鄰域 求和並做尺度變換 1/(param1.param2). CV_GAUSSIAN (gaussian blur) - 對圖像進行核大小為 param1×param2 的高斯卷積 CV_MEDIAN (median blur) - 對圖像進行核大小為param1×param1 的中值濾波(i.e. 鄰域是方的). CV_BILATERAL (雙向濾波) - 應用雙向 3x3 濾波,彩色sigma=param1,空間 sigma=param2. 平滑操作的第一個參數. param2: 平滑操作的第二個參數. 對於簡單/非尺度變換的高斯模糊的情況,如果param2的值 為零,則表示其被設定為param1。 param3: 對應高斯參數的 Gaussian sigma (標準差). 如果為零,則標準差由下面的核尺寸計算: sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 對應水平核, n=param2 對應垂直核. 對小的卷積核 (3×3 to 7×7) 使用如上公式所示的標準 sigma 速度會快。如果 param3 不為零,而 param1 和 param2 為零,則核大小有 sigma 計算 (以保證足夠精確的操作). 函數 cvSmooth 可使用上面任何一種方法平滑圖像。每一種方法都有自己的特點以及局限。 沒有縮放的圖像平滑僅支持單通道圖像,並且支持8位到16位的轉換(與cvSobel和cvLaplace相似)和32位浮點數到32位浮點數的變換格式。 簡單模糊和高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮點圖像。這兩種方法可以(in-place)方式處理圖像。 中值和雙向濾波工作於 1- 或 3-通道, 8-位圖像,但是不能以 in-place 方式處理圖像.

11、cvGetSize cvGetSize是Opencv提供的一種操作矩陣圖像的函數 得到二維的數組的尺寸,以CvSize返回。 CvSize cvGetSize(const CvArr* arr); 它與cvGetDims()密切相關,cvGetDim()返回一個數組的大小。主要的不同是cvGetSize()是專為矩陣和圖像設計的,這兩種對象的維數總是2。其尺寸可以以CvSize結構的形式返回,例如當創建一個新的大小相同的矩陣或圖像時,使用此函數就很方便。

12、cvSize cvSize是OpenCV的基本數據類型之一。表示矩陣框大小,以像素為精度。與CvPoint結構類似,但數據成員是integer類型的width和heigh 原型: typedef struct CvSize { int width; /* 矩形寬 */ int height; /* 矩形高 */ } CvSize;

13、cvPyrDown 功能:函數cvPyrDown使用Gaussian金字塔分解對輸入圖像向下采樣 格式:void cvPyrDown(const CvArr* src,CvArr* dst,int filter = CV_GAUSSIAN_5x5); 參數:src:輸入圖像、dst:輸出圖像,其寬度和高度應是輸入圖像的一半;filter:卷積濾波器類型,目前僅支持CV_GAUSSIAN_5x5。

幾個重要的函數opencv