opencv實現多路播放

個人電腦自帶一個攝像頭,另爲我又插了一個攝像頭,在這實現兩個攝像頭的同時播放,實現代碼以下ios

#include <iostream>
#include <opencv/cv.h>
#include <opencv/highgui.h>

using namespace std;
using namespace cv;

#define ESC 27

struct FrameInfo
{
    friend ostream& operator<<(ostream& out_, const FrameInfo& frameInfo_)
    {
        out_ << "Height: " << frameInfo_.m_height
             << " wight: " << frameInfo_.m_width << endl;
        return out_;
    }

    int m_height;
    int m_width;
};

CvCapture* g_camera0 = NULL;
CvCapture* g_camera1 = NULL;

FrameInfo g_camera0Info;
FrameInfo g_camera1Info;

int main()
{
    g_camera0 = cvCreateCameraCapture(0);
    if (g_camera0 != NULL)
    {
        g_camera0Info.m_height = cvGetCaptureProperty(g_camera0, CV_CAP_PROP_FRAME_HEIGHT);
        g_camera0Info.m_width = cvGetCaptureProperty(g_camera0, CV_CAP_PROP_FRAME_WIDTH);
        cout << g_camera0Info;
    }
    g_camera1 = cvCreateCameraCapture(1);
    if (g_camera1 != NULL)
    {
        g_camera1Info.m_height = cvGetCaptureProperty(g_camera1, CV_CAP_PROP_FRAME_HEIGHT);
        g_camera1Info.m_width = cvGetCaptureProperty(g_camera1, CV_CAP_PROP_FRAME_WIDTH);
        cout << g_camera1Info;
    }

    IplImage* _parentIamge = cvCreateImage(cvSize(g_camera0Info.m_width + g_camera1Info.m_width,
                                                  g_camera0Info.m_height + g_camera1Info.m_height),
                                           IPL_DEPTH_8U, 3);
    IplImage* _camera0Image = cvCreateImageHeader(cvSize(g_camera0Info.m_width, g_camera0Info.m_height),
                                                  IPL_DEPTH_8U, 3);
    _camera0Image->widthStep = _parentIamge->widthStep;
    _camera0Image->imageData = _parentIamge->imageData;

    IplImage* _camera1Image = cvCreateImageHeader(cvSize(g_camera1Info.m_width, g_camera1Info.m_height),
                                                  IPL_DEPTH_8U, 3);

    //關鍵所在
    _camera1Image->widthStep = _parentIamge->widthStep;
    _camera1Image->imageData = (_parentIamge->imageData
                                + ((_parentIamge->height - g_camera1Info.m_height) * _parentIamge->widthStep))
            + ((_parentIamge->width - g_camera1Info.m_width) * _parentIamge->nChannels);



    cvNamedWindow("ShowWidget");
    cvMoveWindow("ShowWidget", 100 ,100);

    while(1)
    {
        cvCopy(cvQueryFrame(g_camera0), _camera0Image);
        cvCopy(cvQueryFrame(g_camera1), _camera1Image);

        cvShowImage("ShowWidget", _parentIamge);

        if (waitKey(1000 / 25) == ESC)
        {
            break;
        }

    }

    cvDestroyWindow("ShowWidget");
    cvReleaseImage(&_parentIamge);
    cvReleaseCapture(&g_camera0);
    cvReleaseCapture(&g_camera1);


    return 0;
}
效果:

實現的原理就是使用一個大的IplImage,在其中填補相應的塊就ok,關鍵在塊的選中,由圖可知,我使用了1和4區域,對於輸入幀長寬不等的攝像頭,使用1和4或者2和3,對於相同的那就沒有什麼特殊的區別。ui

咱們的區域我使用了兩個cvCreateImageHeader,就是這個是空的,而後咱們將其綁定帶大的IplImage的數據區,對兩個塊區域的操做就是對大的IplImage中部分的操做,而後咱們將大的IplImage顯示,那麼就能夠同時播放了。咱們的關鍵代碼就是對兩個塊的指針的賦值,以下spa

  _camera0Image->widthStep = _parentIamge->widthStep;
    _camera0Image->imageData = _parentIamge->imageData;
.net

 _camera1Image->widthStep = _parentIamge->widthStep;
    _camera1Image->imageData = (_parentIamge->imageData
                                + ((_parentIamge->height - g_camera1Info.m_height) * _parentIamge->widthStep))
            + ((_parentIamge->width - g_camera1Info.m_width) * _parentIamge->nChannels);
第一個咱們選擇是1區域,那麼其imageData就是大區的imageData,widthStep參數的設定很重要,需然咱們直接操做的是小區,可是直接體如今大區上,因此一行的字節數仍是大區的。如圖所示
指針

####@@@@code

####@@@@
####@@@@
@@@@####
@@@@####
@@@@####
get

#是兩個小區,整個爲大區,咱們雖然局部寫,可是咱們須要的是大換行,這樣才能將數據寫到咱們指望的地方,而不是寫到@的地方 ,好比小區自身的爲4,當height爲1是,仍是寫在第一行。it

如今你也能夠作一個多路監控了,或者多屏播放了。
io

相關文章
相關標籤/搜索