《學習OpenCV》練習2-5:從攝像頭讀入視頻數據,創建滾動條,操作滾動條可以動態調節縮放比例。
#include "cv.h"
#include "highgui.h"
/*函數聲明*/
IplImage *doPyrDown( IplImage *input, int filter = CV_GAUSSIAN_5x5 ); //doPyrDown函數,slider的回調函數聲明
void MyTrackbarCallback( int pos ); //滑動條回調函數
/*全局變量*/
int decrease; //根據slider的當前位置,確定縮放比例
//*****************************************************
//主函數
//*****************************************************
int main()
{
CvCapture* capture = cvCreateCameraCapture(0); //創建一個從攝像頭中獲取圖像的capture指針(參數爲1時打開USB外接攝像頭)
assert( capture!=NULL );
IplImage* image = cvQueryFrame( capture ); //從capture中獲取圖像
assert( image!=NULL );
// int frames = (int)cvGetCaptureProperty( capture, CV_CAP_PROP_POS_FRAMES ); //獲得圖像的總幀數,該參數在此處沒有使用,可註釋掉,因爲從攝像頭獲取的幀數爲0
cvNamedWindow( "show", CV_WINDOW_AUTOSIZE ); //創建圖像顯示窗口
cvCreateTrackbar( "scalar", "show", &decrease, 4, MyTrackbarCallback ); //創建TrackBar,可以控制縮小1,2,3,4倍
while ((image = cvQueryFrame(capture))!=NULL) //當從攝像頭中獲取圖像成功後,進入循環
{
if (decrease==0) //如果縮放比例爲0時顯示原圖像
{
cvShowImage( "show", image );
}
else
{
IplImage* convert_image = image; //convert_image指向原圖像
for (int i=0; i<decrease; i++) //如果縮放比例大於0進入循環進行等比縮小
{
convert_image = doPyrDown( convert_image );
}
cvShowImage( "show", convert_image );
}
char c = cvWaitKey(30);
if (c==27) //如果按下ESC鍵則退出
break;
}
cvReleaseCapture( &capture );
cvDestroyWindow( "show" );
}
//*****************************************************
//圖像向下金字塔函數:執行圖形的向下圖像金字塔
//input :輸入圖像
//filter :cvPyrDown()的濾波參數
//返回值 :指向經過縮小處理的圖像的指針
//*****************************************************
IplImage *doPyrDown( IplImage *input, int filter )
{
assert( input->width%2==0 && input->height%2==0 ); //確保圖像寬度和高度能被2整除
IplImage *output = cvCreateImage( cvSize( input->width/2, input->height/2 ),
input->depth,
input->nChannels );
assert( output!=NULL );
cvPyrDown( input, output, CV_GAUSSIAN_5x5); //對圖像進行縮放處理
return(output);
}
//*****************************************************
//滑動條回調函數:顯示視頻的進度
//pos :滑動條當前位置
//*****************************************************
void MyTrackbarCallback( int pos )
{
decrease = pos; //獲取縮放比例
}