1. 程式人生 > >opencv自學之旅 視訊讀取,攝像頭讀取

opencv自學之旅 視訊讀取,攝像頭讀取

opencv 可以很方便的讀取攝像頭,他有一個CvCapture結構體,可以用來操作攝像頭。
首先我們先了解下這個結構體。
1.讀取視訊檔案
cvCreateFileCapture(“檔案路徑”); 返回指標 CvCapture型別。
這個函式是讀取一個視訊檔案,他的返回類似是 CvCapture 型別。讀取的時候是一幀一幀的讀取,如果返回值型別 空,那麼安裝解碼器(解碼器就是看你電腦能不能正確的把各種檔案格式的視訊解析, 不然 avi格式,mp4格式等等), 或者 看路徑對不對。

1.1獲取一幀資料
cvQueryFrame(capture);
輸入一個CVCapture 型別的指標,該函式主要功能是將視訊下一個幀載入到記憶體,與cvLoadImage 不同,該函式不重新分配記憶體。

1.2
cvReleaseCapture()
釋放視訊空間鎮。

那麼來看看一個都去視訊的原始碼

int main()
{
       CvCapture *capture = cvCreateFileCapture("1.mp4");
       IplImage *frame = nullptr;
       cvNamedWindow("mp4", 1);
       while (1)
       {
             frame = cvQueryFrame(capture);
             if (!frame)
             {
                    break
; } cvShowImage("mp4", frame); char c = cvWaitKey(1); if (c == 27) { break; } } cvReleaseCapture(&capture); cvDestroyWindow("mp4"); return 0; }

這個就是讀取一個mp4格式的視訊,然後顯示出來。 這個 cvWaitKey() 可以控制播放的速度。

2讀取視像頭操作

讀攝像頭

cvCreateCameraCapture(int id)
這個函式是讀取攝像頭操作, 裡面的id 代表你電腦連線的外設攝像頭id。

#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;

int main()
{
    VideoCapture cap(0);
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920); //設定解析度
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
    CvVideoWriter* video = NULL;
    IplImage* frame = NULL; 
    if (!cap.isOpened()) //如果不能開啟攝像頭給出警告
    {
        cout << "Can not open the camera." << endl;
        return -1;
    }
    else
    {
        cap.read(imgOriginal); //首先取得攝像頭中的一幀

        if (video) //如果能建立CvVideoWriter物件則表明成功
        {
            cout << "VideoWriter has created." << endl;
        }
        cvNamedWindow("Camera Video", 1); //新建一個視窗
        while (1)
        {
            bool bSuccess = cap.read(imgOriginal);
            if (!bSuccess) //if not success, break loop 
            {
                cout << "Cannot read a frame from video stream" << endl;
                break;
            }
            frame = &IplImage(imgOriginal);

            if (!frame)
            {
                cout << "Can not get frame from the capture." << endl;
                break;
            }
            cvShowImage("Camera Video", frame); //顯示視訊內容的圖片

            if (cvWaitKey(1) > 0) break; //有其他鍵盤響應,則退出
        }
        cvReleaseVideoWriter(&video);       
        cvDestroyWindow("Camera Video");
    }
    return 0;
}

其實原理和讀取視訊一樣, 都是一幀幀的獲取,然後顯示。