文档章节

opencv实现多路播放

首席吹牛官
 首席吹牛官
发布于 2015/05/22 12:57
字数 600
阅读 1
收藏 0

我的电脑自带一个摄像头,另为我又插了一个摄像头,在这实现两个摄像头的同时播放,实现代码如下

#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,对于相同的那就没有什么特殊的区别。

我们的区域我使用了两个cvCreateImageHeader,就是这个是空的,然后我们将其绑定带大的IplImage的数据区,对两个块区域的操作就是对大的IplImage中部分的操作,然后我们将大的IplImage显示,那么就可以同时播放了。我们的关键代码就是对两个块的指针的赋值,如下

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

 _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参数的设定很重要,需然我们直接操作的是小区,但是直接体现在大区上,所以一行的字节数还是大区的。如图所示

####@@@@

####@@@@
####@@@@
@@@@####
@@@@####
@@@@####

#是两个小区,整个为大区,我们虽然局部写,但是我们需要的是大换行,这样才能将数据写到我们期望的地方,而不是写到@的地方 ,比如小区自身的为4,当height为1是,还是写在第一行。

现在你也可以做一个多路监控了,或者多屏播放了。

© 著作权归作者所有

首席吹牛官
粉丝 9
博文 368
码字总数 191938
作品 0
闵行
程序员
私信 提问
C++ 程序使用 OpenCV 实现视频捕获

下载 Capture.zip - 14.1 KB 前言 这是一个使用 Visual C++ 窗口表单编写的简单视频捕捉应用程序。这个工程既演示了窗口表单应用程序的创建,又演示了 OpenCV 的 Visual C++ 配置。 OpenCV 是...

oschina
2014/03/10
9.4K
6
使用OpenCV通过摄像头捕获实时视频并探测人脸

在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,视频可以看作是一帧一帧的图片,因此图片操作其实是视频操作的基础,这篇手记就来讲讲OpenCV中的视频操作,并实现一...

种子_fe
2018/08/16
0
0
OpenCV 4.0.1 和 3.4.5 发布,Intel 开源的计算机视觉库

OpenCV 4.0.1 和 3.4.5 已发布,OpenCV 是 Intel 开源的计算机视觉库。它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV 拥有包括 300 多个 C 函...

王练
2018/12/23
2.9K
0
OpenCV学习笔记(09):opencv3.2+cmake3.8+VS2013,编译opencv_contrib

版权声明:假装这里有个版权声明…… https://blog.csdn.net/CV_Jason/article/details/70037545 Cmake编译opencv contrib部分 1. 前言 最近才知道,在OpenCV3.0 之后,OpenCV算法包被拆分成...

CodeLike
2017/04/10
0
0
OPenCV 的安装,环境配置(Windows平台)

1、在官网下载opencv,链接:http://opencv.org/,下载至某盘(推荐D),下载后点击,如下: 随后弹出一个提示框,可不用管它,等一段时间,会解压出一个OpenCV文件夹,其中有如下几个文件: ...

weixin_40647819
2018/04/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
1K
12
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
22
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
17
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
27
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部