《學習OpenCV》練習2-5

《學習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;																//獲取縮放比例
}


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