使用opencv进行多路视频的播放

在监控领域,我们时常需要对多路视频进行实时的播放,这到底是怎么实现的呢?使用opencv的朋友可能会想:我可以先定义一个VideoCapture的数组,然后在一个for循环中,逐一读取各路视频并显示,但是这显然不是同步的,设想一下,如果有32路视频需要同时播放,而一般摄像机的帧率为25fps或30fps,那么按上述方法进行播放,第一路与第三十二路视频的延迟会有1秒多,如果我们需要在其间做一些图像处理,那么延迟将会更大。

有过多线程编程或多核编程经验的朋友会觉得这个问题很好解决,这就是一个简单的并行问题。本章节提供使用openMP多核编程的方法实现多路视频的播放:

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "omp.h"

using namespace cv;
using namespace std;

#define CAM_NUM 4

int _tmain(int argc, _TCHAR* argv[])
{

	VideoCapture cap[CAM_NUM];
	Mat img;
	string str = "scene_1//frame_%4d.jpg";
	int i;

	#pragma omp parallel for private(str)
	for (i=0;i<CAM_NUM;i++)
	{
		cap[i].open(str);
	}

	int width = cap[0].get(CV_CAP_PROP_FRAME_WIDTH);
	int height = cap[0].get(CV_CAP_PROP_FRAME_HEIGHT);
	int min_width = width/2;
	int min_height = height/2;

	Mat imageShow(height,width,CV_8UC3);
	int left,top;
	Mat temp;
	bool runflag = true;

	while (1)
	{
		#pragma omp parallel for private(img,temp, left, top)
		for (i=0;i<CAM_NUM;i++)
		{
			cap[i] >> img;
			if (img.empty())
			{
				runflag = false;
				break;
			}
			resize(img,temp,Size(min_width,min_height));
			left = i/2 *min_width;
			top = i%2 *min_height;
			temp.copyTo(imageShow(Rect(left,top,min_width,min_height)));
		}

		if (!runflag)
		{
			break;
		}
		namedWindow("Image");
		imshow("Image", imageShow);
		waitKey(33);
	}
	return 0;
}

一张截图如下:

是不是很有意思!你可以尝试修改一下视频通道的数量,如果仅是播放,一个核播放4路视频完全没有问题,一个四核的计算机可以尝试16路视频的同步播放。

本文中使用了多核编程的思想,因为现在多核计算机很普遍了,这也必将是以后的趋势,想更多的了解openMP与opencv的结合请继续关注本人博客!!会有大波新内容介绍给大家的!

时间: 2024-10-24 01:54:32

使用opencv进行多路视频的播放的相关文章

用OpenCV制作视频控制播放器(无声音)

申明:OpenCV是计算机视觉库,所以用在图片或视频处理上,故播放的视频暂时没有声音 软件:用OpenCV制作视频控制播放器(无声音) 功能说明:新建播放窗口,添加进度条可以拖动视频播放. 流程图: 功能说明: 1. 新建进度条 cvCreatTrackbar("","",&,frames,callback) 2.获取总帧数 cvGetCaptureProperty(&,id) double cvGetCaptureProperty( CvCaptu

OpenCV视频读取播放,视频转换为图片

转载请注明出处!!! http://blog.csdn.net/zhonghuan1992 OpenCV视频读取播放,视频转换为图片 介绍几个有关视频读取的函数: VideoCapture::VideoCapture VideoCapture能够从文件里或者摄像头中读取视频,这是提供给C++的接口的.C的接口是CvCapture结构.        <span style="white-space:pre"> </span>C++: VideoCapture::

【技术案例】Firefly-RK3399多路视频编解码

Firefly-RK3399开源板拥有强大的视像处理器(VPU),能够流畅的实现H.264编解码功能,可以同时进行两路视频编码和五路视频解码.在应用方面,多路编解码功能可以更优秀地应用于同时录像和播放多个视频的场景. 一.多路视频编解码演示需要准备: (1)一台Firefly-RK3399开源板 (2)两个MIPI摄像头 (3)一台LCD显示器 二.把两个摄像头连接到Firefly-RK3399开源板上 三.进入应用列表,打开多路视频编解码应用MultiCodecs 四.打开MultiCodec

在滚动列表中实现视频的播放(ListView &amp; RecyclerView)

英文原文:Implementing video playback in a scrolled list (ListView & RecyclerView) 本文将讲解如何在列表中实现视频播放.类似于诸如 Facebook, Instagram 或者 Magisto这些热门应用的效果: Facebook: Magisto: Instagram: 这片文章基于开源项目: VideoPlayerManager. 所有的代码和示例都在那里.本文将跳过许多东西.因此如果你要真正理解它是如何工作的,最好下载

配置 nginx 支持 f4v视频格式播放

Nginx默认不支持f4v视频格式播放,解决方法为编辑mime.types文件,在video/mp4加上f4v即可 types {   # Data interchange     application/atom+xml                  atom;     application/json                      json map topojson;     application/ld+json                   jsonld;     

利用VS C# 实现串口控制视频的播放 use VLC

开发环境:VS2013, C#, VLC播放器 实现的功能: 1.利用串口通信来控制视频的播放, 2.接收到"1"时播放第一个视频,若10s内没有接收到"1",自动播放第二个视频,期间忽略接受到的0: 3.若正在播放第二个视频,接收到"1",立马播放视频1, 整个功能的实现主要就用到了2个控件和1个VLC类,控件SerialPort和timer&&类VlcPlayer.cs 重要提示:项目必须使用.NET 2.0,并且电脑需要安装

手机影音第七天 视频的播放下一个视频功能实现,视频进度、电量变化的实现

先看下效果图: 在这里,视频进度条会根据视频播放变化,下方的按钮中,播放下一个,上一个都已实现. 代码已经托管到码云上,想下载看的小伙伴可以从下方地址中获取 https://git.oschina.net/joy_yuan/MobilePlayer 1.在这张图上,自定义的显示电量的那一列已经被系统自带的状态栏遮盖,下面就说一下实现方法: 系统电量变化时,系统会发送一个广播,所有对这个广播感兴趣的activity都可以注册广播来接收这个广播.在这里接收系统电量变化,屏幕锁屏.开屏的广播,只能使用

github视频录制播放相关功能-参考

lookingstars/JZVideoDemo  视频播放器 Updated on 11 Aug Objective-C 15 10 caoguoqing/VideoEditDemo  iOS video cut ,also can add blackgroundmusic iOS 视频剪辑,视频添加背景音乐 Updated on 13 Jun 2014 Objective-C 139 50 835239104/KrVideoPlayerPlus  根据36Kr开源的KRVideoPlayer

Android MediaStore检索视频并播放

该文章是为了检索手机上sd卡中的视频,然后将检索出来的相应视频的缩略图,名称等视频信息显示在ListView上.点击每个item后播放相应的视频. 源代码: 布局文件: activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:la