C++ 程序使用OpenCV實(shí)現(xiàn)視頻捕獲 (附源碼)
前言
這是一個(gè)使用 Visual C++ 窗口表單編寫的簡(jiǎn)單視頻捕捉應(yīng)用程序。這個(gè)工程既演示了窗口表單應(yīng)用程序的創(chuàng)建,又演示了 OpenCV 的 Visual C++ 配置。

OpenCV 是免費(fèi)的計(jì)算機(jī)視覺(jué)軟件,也是圖像處理的開源庫(kù)。本文幫助程序員配置 visual c++ 開發(fā)環(huán)境,從而運(yùn)行基于窗口控制的 OpenCV 應(yīng)用程序。
OpenCV 庫(kù)可以集成到開發(fā)環(huán)境中。它易于配置,如下六步展示了怎樣來(lái)配置 visual studio 2010。
這篇文章涉及一個(gè)視頻捕捉工程,它由 Visual Studio 2010 版本開發(fā)而成。
配置Visual C++
準(zhǔn)備Visual Studio 2010
步驟1:
在項(xiàng)目的屬性管理器中選擇“Debug|Win32”,右鍵點(diǎn)擊它,然后選擇屬性并繼續(xù)下一步。

步驟2:
從C/C++范疇中選擇通用的子范疇。選擇添加額外的文件夾,添加下面的路徑。
C:\opencv\build\include;
對(duì)于64位:
C:\opencv\build\x86\vc10\bin;
對(duì)于32位:
C:\opencv\build\x64\vc10\bin;

步驟3:
如果系統(tǒng)是64位的,選擇庫(kù)路徑“C:\opencv\build\x86\vc10\lib”,否則選擇庫(kù)文件“C:\opencv\build\x64\vc10\lib”,然后點(diǎn)擊Ok按鈕。

步驟4:
在這一步中,需要添加OpenCV庫(kù)。它們位于“C:\opencv\build\x86\vc10\lib”。
對(duì)于Debug版:
| opencv_calib3d248d.lib | opencv_contrib248d.lib | opencv_core248d.lib | 
| opencv_features2d248d.lib | 
             opencv_flann248d.lib  | 
            opencv_gpu248d.lib | 
| opencv_highgui248d.lib | opencv_imgproc248d.lib | opencv_legacy248d.lib | 
| opencv_ml248d.lib | opencv_nonfree248d.lib | opencv_objdetect248d.lib | 
| opencv_ocl248d.lib | opencv_photo248d.lib | opencv_stitching248d.lib | 
| opencv_superres248d.lib | opencv_video248d.lib | opencv_videostab248d.lib | 
發(fā)布準(zhǔn)備
在文件名中刪除最后的字母 d。如 opencv_calib3d248d.lib 到 opencv_calib3d248.lib 等等。
 
步驟5:
變換通用語(yǔ)言運(yùn)行支持,從純MSIL通用語(yǔ)言運(yùn)行支持(/clr:pure)換為通用語(yǔ)言運(yùn)行支持(/clr)。然后點(diǎn)擊“ok”完成配置。

步驟6:
添加下列環(huán)境地址:
64位:C:\opencv\build\x86\vc10\bin;
32位:C:\opencv\build\x64\vc10\bin;
#p#
使用代碼
在開始寫代碼之前,需要如下所示一樣包含頭文件。在頭文件之后的命名空間外,聲明capture和frame變量。這些變量是指針變量。
- #pragma once
 - #include "opencv/cv.h"
 - #include "opencv/highgui.h"
 - #include "opencv2/opencv.hpp"
 - #include "opencv2/core/core.hpp"
 - CvCapture* capture;
 - IplImage* frame;
 
cvCaptureFromCAM函數(shù)初始化第一個(gè)攝像頭的采集(索引為0)。如果索引傳入的為1,那么它初始化的是第二個(gè)攝像頭,以此類推。
- capture = cvCaptureFromCAM(0);
 
進(jìn)度條以視頻總幀數(shù)來(lái)初始化。CV_CAP_PROP_FRAME_COUNT是傳遞給cvGetCaptureProperty的一個(gè)常量,來(lái)得到視頻的總幀數(shù),而不是攝像頭的。
- trackBar1->Maximum = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);
 
從資源中釋放采集。
- cvReleaseCapture(&capture);
 
下面的函數(shù)從攝像頭中采集視頻,也可以從像*.avi,*.mp4的視頻文件中采集視頻。
- private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) 
 - {
 -    if(comboBox1->Text == "")
 -    {
 -     MessageBox::Show(this,"Select Capture Method","Error!!!");
 -    }
 -    if(button2->Text == "Start")
 -    {
 -     if (comboBox1->Text == "Capture From Camera")
 -     {                    
 -         capture = cvCaptureFromCAM(0);
 -         trackBar1->Minimum = 0;
 -         trackBar1->Maximum = 0;
 -         button2->Text = "Stop";
 -         timer1->Start();
 -     }
 -     else if (comboBox1->Text == "Capture From File")
 -     {    
 -         openFileDialog1->Filter = "AVI files (*.avi)|*.txt|All files (*.*)|*.*";
 -         openFileDialog1->FilterIndex = 2;
 -         openFileDialog1->RestoreDirectory = true;
 -         openFileDialog1->FileName ="";
 -         if ( openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK )
 -         {        
 -          char *fileName = (char*) Marshal::StringToHGlobalAnsi(openFileDialog1->FileName).ToPointer();                    
 -          capture = cvCaptureFromFile(fileName);
 -          trackBar1->Minimum = 0;
 -          trackBar1->Maximum = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);
 -          button2->Text = "Stop";
 -          timer1->Start();
 -        }                
 -     }
 -    }
 -    else if(button2->Text == "Stop")
 -    {
 -      cvReleaseCapture(&capture);        
 -      button2->Text = "Start";
 -      timer1->Stop();
 -    }
 - }
 
cvQueryFrame函數(shù)查詢當(dāng)前視頻采集的幀數(shù),分配給frame變量。
- frame = cvQueryFrame(capture);
 
下面的聲明是OpenCV中imshow("windowname",frame)函數(shù)的一個(gè)替換,用來(lái)顯示圖像。
- pictureBox1->Image  = gcnew System::Drawing::Bitmap(frame->width,frame->height,frame->widthStep,System::Drawing::Imaging::PixelFormat::Format24bppRgb,(System::IntPtr) frame->imageData);
 - pictureBox1->Refresh();
 
定時(shí)器初始化為30個(gè)時(shí)間間隔。30個(gè)時(shí)間間隔之后將執(zhí)行此函數(shù)。下面的函數(shù)將查詢幀,并提取出視頻的屬性。以下常量用于提取視頻屬性:
CV_CAP_PROP_POS_FRAMES : 獲得視頻當(dāng)前幀位置。
CV_CAP_PROP_FOURCC : 獲得視頻信息。
CV_CAP_PROP_POS_MSEC : 獲得時(shí)間信息。
CV_CAP_PROP_FRAME_HEIGHT : 獲得視頻幀高。
CV_CAP_PROP_FRAME_WIDTH : 獲得視頻幀寬。
CV_CAP_PROP_FPS : 獲得視頻幀率(每秒多少幀)。.
- private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) 
 - {
 -     try
 -     {        
 -         frame = cvQueryFrame(capture);    
 -         if(frame != NULL)
 -         {
 -             pictureBox1->Image  = gcnew System::Drawing::Bitmap(frame->width,frame->height,frame->widthStep,System::Drawing::Imaging::PixelFormat::Format24bppRgb,(System::IntPtr) frame->imageData);
 -             pictureBox1->Refresh();
 -     
 -             trackBar1->Value = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES);            
 -             double codec_double = cvGetCaptureProperty(capture,CV_CAP_PROP_FOURCC);
 -             label6->Text = "Codec: " + System::Text::Encoding::UTF8->GetString(BitConverter::GetBytes((int)codec_double));
 -             label7->Text = "Time: " + (TimeSpan::FromMilliseconds( cvGetCaptureProperty(capture,CV_CAP_PROP_POS_MSEC) ).ToString())->Substring(0, 8);
 -             label8->Text = "Frame No.: " + (int)cvGetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES);
 -             label9->Text = "Video Resolution: " + (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT) + " X " + (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH);
 -             label11->Text = "Video Frame Rate: " + (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FPS);
 -         }
 -     }catch(...){}
 - }
 
播放進(jìn)度條初始化以當(dāng)前視頻幀位置(譯者加:,并在拖動(dòng)進(jìn)度條時(shí)用進(jìn)度條的進(jìn)度值設(shè)置當(dāng)前視頻幀位置)。CV_CAP_PROP_POS_FRAMES 是一個(gè)用來(lái)得到視頻幀當(dāng)前位置的常量:
- private: System::Void trackBar1_Scroll(System::Object^  sender, System::EventArgs^  e) 
 - {
 -     cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES, trackBar1->Value);
 - }
 
興趣點(diǎn)
學(xué)習(xí)如何配置 visual c++。
學(xué)習(xí)如何從視頻文件中捕獲視頻。
學(xué)習(xí)如何提取視頻屬性。
參考:
[1] http://opencv.org/
[2] http://en.wikipedia.org/wiki/OpenCV
[3] http://docs.opencv.org/
[4] http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html
英文原文:Video Capture using OpenCV with VC++
譯文鏈接:http://www.oschina.net/translate/video-capture-using-opencv-with-vcplusplus















 
 
 




 
 
 
 