C++ 程序使用 OpenCV 實現視頻捕獲

jopen 10年前發布 | 49K 次閱讀 圖形/圖像處理 OpenCV

  • 下載 Capture.zip - 14.1 KB

    </li> </ul>

    前言

    這是一個使用 Visual C++ 窗口表單編寫的簡單視頻捕捉應用程序。這個工程既演示了窗口表單應用程序的創建,又演示了 OpenCV 的 Visual C++ 配置。

    C++ 程序使用 OpenCV 實現視頻捕獲

    OpenCV 是免費的計算機視覺軟件,也是圖像處理的開源庫。本文幫助程序員配置 visual c++ 開發環境,從而運行基于窗口控制的 OpenCV 應用程序。

    OpenCV 庫可以集成到開發環境中。它易于配置,如下六步展示了怎樣來配置 visual studio 2010。

    這篇文章涉及一個視頻捕捉工程,它由  Visual Studio 2010 版本開發而成。

    配置Visual C++

    準備Visual Studio 2010

    步驟1:

    在項目的屬性管理器中選擇“Debug|Win32”,右鍵點擊它,然后選擇屬性并繼續下一步。

    C++ 程序使用 OpenCV 實現視頻捕獲

    步驟2:

    從C/C++范疇中選擇通用的子范疇。選擇添加額外的文件夾,添加下面的路徑。

    C:\opencv\build\include;

    對于64位:

    C:\opencv\build\x86\vc10\bin;

    對于32位:

    C:\opencv\build\x64\vc10\bin;

    C++ 程序使用 OpenCV 實現視頻捕獲

    步驟3:

    如果系統是64位的,選擇庫路徑“C:\opencv\build\x86\vc10\lib”,否則選擇庫文件“C:\opencv\build\x64\vc10\lib”,然后點擊Ok按鈕。

    C++ 程序使用 OpenCV 實現視頻捕獲

    步驟4:

    在這一步中,需要添加OpenCV庫。它們位于“C:\opencv\build\x86\vc10\lib”。

    對于Debug版:

    </tr>

    </tr>

    </tr>

    </tr>

    </tr>

    </tr> </tbody> </table>

    發布準備

    在文件名中刪除最后的字母  d。如 opencv_calib3d248d.lib 到 opencv_calib3d248.lib 等等。

    C++ 程序使用 OpenCV 實現視頻捕獲

    步驟5:

    變換通用語言運行支持,從純MSIL通用語言運行支持(/clr:pure)換為通用語言運行支持(/clr)。然后點擊“ok”完成配置。

    C++ 程序使用 OpenCV 實現視頻捕獲

    步驟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);
    }

    興趣點

    opencv_calib3d248d.lib opencv_contrib248d.lib opencv_core248d.lib
    opencv_features2d248d.lib

    opencv_flann248d.lib

    </td>

    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
sesese色