在本篇前兩節中,我們學習了對圖像進行簡單的高斯模糊處理以及Canny邊緣檢測,它們處理的都是從其他地方載入的固定圖像。而在更多的情況下,我們需要處理從錄影機或某視訊檔案中實時讀入的視訊流。HighGUI做了很多工作才使得錄影機圖像序列看起來像一個視訊檔案,當我們需要處理錄影機或視訊檔案中的圖像序列時我們隻需要簡單地從錄影機或視訊檔案獲得圖像,像圖像一樣處理。
接下來,我們将程式設計實作讀入一個彩色視訊檔案,并以灰階格式輸出這個視訊檔案,同時将每一幀圖像轉換為對數極坐标格式,輸出并寫入新的視訊檔案中。
源程式:
// 作者:GongchuangSu ( http://blog.csdn.net/gongchuangsu )
// 時間:2015.07.05
// 說明:打開一個視訊檔案,讀取檔案内容,将每一幀圖像轉換為
// 對數極坐标格式和灰階格式,并将轉換後的圖像序列寫入
// 新的視訊檔案中,并輸出。
#include "cv.h"
#include "highgui.h"
//#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") //用于屏蔽控制台應用程式的視窗
int main(){
/* 定義視訊輸入輸出名稱 */
const char *VideoName_Input = "MV.mp4";
const char *VideoName_Output = "logpolar.mp4";
/* 建立視窗 */
cvNamedWindow( "原視訊", CV_WINDOW_AUTOSIZE );
cvNamedWindow( "logpolar", CV_WINDOW_AUTOSIZE );
cvNamedWindow( "gray", CV_WINDOW_AUTOSIZE );
/* 讀取檔案 */
CvCapture* capture = ;
capture = cvCreateFileCapture( VideoName_Input );
if(!capture){
return -;
}
IplImage* bgr_frame = cvQueryFrame(capture);
/* 取得視訊檔案的幀數并輸出 */
double fps = cvGetCaptureProperty(
capture,
CV_CAP_PROP_FPS
);
printf("fps=%d\n",(int)fps);
/* 取得視訊檔案的大小并輸出 */
CvSize size = cvSize(
(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),
(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT)
);
printf("frame (w, h) = (%d, %d)\n",size.width,size.height);
/* 建立視訊檔案讀入器 */
CvVideoWriter* writer = cvCreateVideoWriter(
VideoName_Output,
CV_FOURCC('M','J','P','G'),
fps,
size
);
/* 為logpolar建立圖像 */
IplImage* logpolar_frame = cvCreateImage(
size,
IPL_DEPTH_8U,
);
/* 為gray建立圖像 */
IplImage* gray_frame = cvCreateImage(
size,
IPL_DEPTH_8U,
);
/* 圖像轉換并顯示 */
while( (bgr_frame = cvQueryFrame(capture)) != NULL ){
cvShowImage("原視訊", bgr_frame );
/* 将原圖像格式轉換為灰階格式并顯示 */
cvConvertImage(
bgr_frame,
gray_frame
);
cvShowImage("gray", gray_frame );
/* 将原圖像格式轉換為對數極坐标格式并顯示 */
cvLogPolar(
bgr_frame,
logpolar_frame,
cvPoint2D32f(bgr_frame->width/,bgr_frame->height/),
,
CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS
);
cvShowImage("logpolar", logpolar_frame );
/* 将對數極坐标格式的圖像寫入指定視訊檔案中 */
cvWriteFrame( writer, logpolar_frame );
/* 等待按鍵觸發 */
char c = cvWaitKey();
if( c == ) break;
}
/* 釋放資源 */
cvReleaseVideoWriter( &writer );
cvReleaseImage( &gray_frame );
cvReleaseImage( &logpolar_frame );
cvReleaseCapture( &capture );
return();
}
1. cvCreateVideoWriter
函數原型:
CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps, CvSize frame_size,int is_color=1 )
函數說明:建立視訊檔案寫入器結構。
filename:輸出視訊檔案名稱。
fourcc:四個字元用來表示壓縮幀的codec 例如,CV_FOURCC(‘P’,’I’,’M’,’1’)是MPEG-1 codec, CV_FOURCC(‘M’,’J’,’P’,’G’)是motion-jpeg codec等。 在Win32下,如果傳入參數-1,可以從一個對話框中選擇壓縮方法和壓縮參數。具體可參考http://www.fourcc.org/codecs.php
fps:被建立視訊流的幀率。
frame_size:視訊流的大小。
is_color:如果非零,編碼器将希望得到彩色幀并進行編碼;否則,是灰階幀(隻有在Windows下支援這個标志)。 預設為1。
2. cvConvertImage
函數原型:
void cvConvertImage( const CvArr* src, CvArr* dst, int flags=0 )
函數說明:把一幅圖像轉換為另外一幅圖像,并可以選擇同時對其進行垂直翻轉 。
src:輸入圖像。
dst:目标圖像。必須為單通道或者3通道8位圖像。
flags:操作标志。
CV_CVTIMG_FLIP : 垂直翻轉圖像。
CV_CVTIMG_SWAP_RB :交換紅藍通道。在OpenCV中,彩色圖像的通道順序是 BGR 然而在一些系統中,在顯示圖像之前通道順序應該被翻轉(cvShowImage能夠自動轉換)。
3. cvLogPolar
函數原型:
void cvLogPolar(const CvArr* src, CvArr* dst, CvPoint2D32f center, double M, int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS )
函數說明:把圖像映射到對數極坐标空間。此函數模仿人類視網膜中央凹視力,并且對于目标跟蹤等可用于快速尺度和旋轉變換不變模闆比對。
src:輸入圖像。
dst:輸出圖像。
center:變換的中心,輸出圖像在此處最精确。
M:幅度的尺度參數。
flags:插值方法。
4. cvWriteFrame
函數原型:
int cvWriteFrame(CvVideoWriter* writer, const IplImage* image)
函數說明:寫入一幀到一個視訊檔案中
writer:視訊檔案寫入器結構。
image:被寫入的幀。
5. 運作結果

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。
轉載于:https://www.cnblogs.com/gongchuangsu/p/4850217.html