C++ 程序使用 OpenCV 實現視頻捕獲
-
</li>
</ul>
前言
這是一個使用 Visual C++ 窗口表單編寫的簡單視頻捕捉應用程序。這個工程既演示了窗口表單應用程序的創建,又演示了 OpenCV 的 Visual C++ 配置。
OpenCV 是免費的計算機視覺軟件,也是圖像處理的開源庫。本文幫助程序員配置 visual c++ 開發環境,從而運行基于窗口控制的 OpenCV 應用程序。
OpenCV 庫可以集成到開發環境中。它易于配置,如下六步展示了怎樣來配置 visual studio 2010。
這篇文章涉及一個視頻捕捉工程,它由 Visual Studio 2010 版本開發而成。
配置Visual C++
準備Visual Studio 2010
步驟1:
在項目的屬性管理器中選擇“Debug|Win32”,右鍵點擊它,然后選擇屬性并繼續下一步。
步驟2:
從C/C++范疇中選擇通用的子范疇。選擇添加額外的文件夾,添加下面的路徑。
C:\opencv\build\include;
對于64位:
C:\opencv\build\x86\vc10\bin;
對于32位:
C:\opencv\build\x64\vc10\bin;
步驟3:
如果系統是64位的,選擇庫路徑“C:\opencv\build\x86\vc10\lib”,否則選擇庫文件“C:\opencv\build\x64\vc10\lib”,然后點擊Ok按鈕。
步驟4:
在這一步中,需要添加OpenCV庫。它們位于“C:\opencv\build\x86\vc10\lib”。
對于Debug版:
opencv_calib3d248d.lib opencv_contrib248d.lib opencv_core248d.lib </tr>opencv_features2d248d.lib opencv_flann248d.lib
</td>opencv_gpu248d.lib </tr>opencv_highgui248d.lib opencv_imgproc248d.lib opencv_legacy248d.lib </tr>opencv_ml248d.lib opencv_nonfree248d.lib opencv_objdetect248d.lib </tr>opencv_ocl248d.lib opencv_photo248d.lib opencv_stitching248d.lib </tr>opencv_superres248d.lib opencv_video248d.lib opencv_videostab248d.lib </tr> </tbody> </table>發布準備
在文件名中刪除最后的字母 d。如 opencv_calib3d248d.lib 到 opencv_calib3d248.lib 等等。
步驟5:
變換通用語言運行支持,從純MSIL通用語言運行支持(/clr:pure)換為通用語言運行支持(/clr)。然后點擊“ok”完成配置。
步驟6:
添加下列環境地址:
64位:C:\opencv\build\x86\vc10\bin;
32位:C:\opencv\build\x64\vc10\bin;
使用代碼
在開始寫代碼之前,需要如下所示一樣包含頭文件。在頭文件之后的命名空間外,聲明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;</pre>
cvCaptureFromCAM函數初始化第一個攝像頭的采集(索引為0)。如果索引傳入的為1,那么它初始化的是第二個攝像頭,以此類推。
capture = cvCaptureFromCAM(0);
進度條以視頻總幀數來初始化。CV_CAP_PROP_FRAME_COUNT是傳遞給cvGetCaptureProperty的一個常量,來得到視頻的總幀數,而不是攝像頭的。
trackBar1->Maximum = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);
從資源中釋放采集。
cvReleaseCapture(&capture);
下面的函數從攝像頭中采集視頻,也可以從像*.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函數查詢當前視頻采集的幀數,分配給frame變量。
frame = cvQueryFrame(capture);
下面的聲明是OpenCV中imshow("windowname",frame)函數的一個替換,用來顯示圖像。
pictureBox1->Image = gcnew System::Drawing::Bitmap(frame->width,frame->height,frame->widthStep,System::Drawing::Imaging::PixelFormat::Format24bppRgb,(System::IntPtr) frame->imageData); pictureBox1->Refresh();
定時器初始化為30個時間間隔。30個時間間隔之后將執行此函數。下面的函數將查詢幀,并提取出視頻的屬性。以下常量用于提取視頻屬性:
CV_CAP_PROP_POS_FRAMES : 獲得視頻當前幀位置。
CV_CAP_PROP_FOURCC : 獲得視頻信息。
CV_CAP_PROP_POS_MSEC : 獲得時間信息。
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(...){} }
播放進度條初始化以當前視頻幀位置(譯者加:,并在拖動進度條時用進度條的進度值設置當前視頻幀位置)。CV_CAP_PROP_POS_FRAMES 是一個用來得到視頻幀當前位置的常量:
private: System::Void trackBar1_Scroll(System::Object^ sender, System::EventArgs^ e) { cvSetCaptureProperty(capture,CV_CAP_PROP_POS_FRAMES, trackBar1->Value); }
興趣點
-
學習如何配置 visual c++。
</li> -
學習如何從視頻文件中捕獲視頻。
</li> -
學習如何提取視頻屬性。
</li> </ul>參考:
[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
</blockquote>致歉
作者母語非英語,文章用英語表述得可能不好或存在錯誤,歡迎批評指正。
本文地址:http://www.oschina.net/translate/video-capture-using-opencv-with-vcplusplus
原文地址:http://www.codeproject.com/Articles/741055/Video-Capture-using-OpenCV-with-VCplusplus
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!相關經驗
相關資訊
sesese色
-