1. 程式人生 > >影象拼接(二):OpenCV同時開啟兩個攝像頭捕獲視訊

影象拼接(二):OpenCV同時開啟兩個攝像頭捕獲視訊

使用OpenCV實現同時開啟兩個USB攝像頭,並實時顯示視訊。如果未檢測有兩個攝像頭,程式會結束併發出“攝像頭未安裝好”的警告。這裡推薦一個小巧的攝像頭視訊捕捉軟體:amcap,使用它可以方便的檢查每個攝像頭是否能正常工作。 
捕獲視訊: 

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include<iostream>

using namespace cv;
using namespace std;

int main()
{
    VideoCapture cap1(2);
    VideoCapture cap2(1);

    bool stop(false);
    Mat frame1;
    Mat frame2;

    namedWindow("cam1", CV_WINDOW_AUTOSIZE);
    namedWindow("cam2", CV_WINDOW_AUTOSIZE);

    if (cap1.isOpened() && cap2.isOpened())
    {
        cout << "*** ***" << endl;
        cout << "攝像頭已啟動!" << endl;
    }
    else
    {
        cout << "*** ***" << endl;
        cout << "警告:請檢查攝像頭是否安裝好!" << endl;
        cout << "程式結束!" << endl << "*** ***" << endl;
        return -1;
    }

    //cap1.set(CV_CAP_PROP_FRAME_WIDTH, 640);
    //cap1.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
    //cap2.set(CV_CAP_PROP_FRAME_WIDTH, 640);
    //cap2.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
    cap1.set(CV_CAP_PROP_FOCUS, 0);
    cap2.set(CV_CAP_PROP_FOCUS, 0);

    while (!stop)
    {
        if (cap1.read(frame1) && cap2.read(frame2))
        {
            imshow("cam1", frame1);
            imshow("cam2", frame2);
            imwrite("frame1.bmp", frame1);
            imwrite("frame2.bmp", frame2);
            //彩色幀轉灰度
            cvtColor(frame1, frame1, CV_RGB2GRAY);
            cvtColor(frame2, frame2, CV_RGB2GRAY);


            if (waitKey(1) == 27)//按ESC鍵
            {
                stop = true;
                cout << "程式結束!" << endl;
                cout << "*** ***" << endl;
            }
        }
    }
    return 0;
} 

程式碼說明: 
1、VideoCapture cap1(2);這句定義了一個視訊捕獲物件,引數為攝像頭的ID,0是第1個攝像頭,請確認每個攝像頭的ID。 
2、下面兩句設定了捕獲視訊每幀影象的解析度和焦距,呼叫的是bool VideoCapture::set(int propId, double value)方法。此外,該方法還可設定視訊捕獲的幀率、亮度、對比度、飽和度、白平衡等各種資訊。可參考OpenCV線上文件。

cap1.set(CV_CAP_PROP_FRAME_WIDTH, 640);
cap1.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
cap1.set(CV_CAP_PROP_FOCUS, 0);
cap2.set(CV_CAP_PROP_FOCUS, 0); 
3、if (cap1.read(frame1) && cap2.read(frame2)){}中read()方法的引數代表捕獲的幀影象,如果捕獲成功,則返回True。