HDMI采集卡+Python+OpenCV实时显示画面_python hdmi_m0_51645163的博客-程序员资料

技术标签: python  vs2015  opencv  


前言

视频采集卡:用来截断并捕获并复制视频信号,直接采集硬件视频输出接口的信号,从硬件层面去获取视频信号,再把视频信号返回到系统内生成视频文件。
我们把原本输出到显示器的信号从中间截断,在中间复制一份,其中的一份照常输出给原来的显示设备,另一份通过一些特殊的手段拷贝下来,然后把这个拷贝的视频信号,重新编码成视频,输出到用来采集数据的机器上,就可以做到在显示器正常工作的情况下,我们依旧可以录制或者实时采集视频信号推流。
在使用USB视频采集卡将信号采集并传输到电脑上后,还需借助采集软件才可将信号储存下来。调用采集卡,选择好对应的视频和音频设备,存储分辨率、格式(MJPG)、码率等可以根据自己需求设置。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210604161009797.gif#pic_center)

提示:以下是本篇文章正文内容,下面案例可供参考

一、C+OpenCV获取采集卡索引号

使用c++获取USB采集卡的索引号,(一般为1)。

代码如下:

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include "windows.h"
#include "dshow.h"
#include <iostream>

#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "quartz.lib")

using namespace cv;
using namespace std;

int listDevices(vector<string>& list) {
    
	ICreateDevEnum *pDevEnum = NULL;
	IEnumMoniker *pEnum = NULL;
	int deviceCounter = 0;
	CoInitialize(NULL);
	HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
		CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,
		reinterpret_cast<void**>(&pDevEnum));
	if (SUCCEEDED(hr))
	{
    
		hr = pDevEnum->CreateClassEnumerator(
			CLSID_VideoInputDeviceCategory,
			&pEnum, 0);
		if (hr == S_OK) {
    
			printf("SETUP: Looking For Capture Devices\n");
			IMoniker *pMoniker = NULL;
			while (pEnum->Next(1, &pMoniker, NULL) == S_OK) {
    
				IPropertyBag *pPropBag;
				hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
					(void**)(&pPropBag));
				if (FAILED(hr)) {
    
					pMoniker->Release();
					continue;  // Skip this one, maybe the next one will work.
				}
				VARIANT varName;
				VariantInit(&varName);
				hr = pPropBag->Read(L"Description", &varName, 0);
				if (FAILED(hr)) hr = pPropBag->Read(L"FriendlyName", &varName, 0);
				if (SUCCEEDED(hr))
				{
    
					hr = pPropBag->Read(L"FriendlyName", &varName, 0);
					int count = 0;
					char tmp[255] = {
     0 };
					//int maxLen = sizeof(deviceNames[0]) / sizeof(deviceNames[0][0]) - 2;
					while (varName.bstrVal[count] != 0x00 && count < 255)
					{
    
						tmp[count] = (char)varName.bstrVal[count];
						count++;
					}
					list.push_back(tmp);
				}
				pPropBag->Release();
				pPropBag = NULL;
				pMoniker->Release();
				pMoniker = NULL;
				deviceCounter++;
			}
			pDevEnum->Release();
			pDevEnum = NULL;
			pEnum->Release();
			pEnum = NULL;
		}	
	}
	return deviceCounter;
}

int main()
{
    
	vector<string> list;
	listDevices(list);
	int capid0 = 0, capid1 = 0;
	cout << "dev_size =      " << list.size() << endl;
	for (int i = 0; i<list.size(); i++)
	{
    
		if (list[i] == "3D Camera")
			capid1 = i;
		if (list[i] == "USB2.0 HD UVC WebCam")
			capid0 = i;
		cout << "device lists:  " << list[i] << "     i =   " << i << endl;
	}
	getchar();
	return 0;
}

运行代码,得到下图。在这里插入图片描述
可见视频采集卡的索引号为1。
注:opencv的环境不用说自己配置还有两个系统库,需要额外的添加 #pragma comment(lib, “strmiids.lib”) #pragma comment(lib, “quartz.lib”)

参考: https://blog.csdn.net/Yancy_/article/details/107560034


二、Python+OpenCV使用步骤

1.引入库

代码如下:

#Python版本3.7.4
import cv2   #版本为4.5.2
import numpy as np

2.实时读取画面

代码如下:

cap0 = cv2.VideoCapture(1+ cv2.CAP_DSHOW)  # 视频流
#cap0.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))  #读取视频格式
# 设置分辨率
cap0.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)  
cap0.set(cv2.CAP_PROP_FRAME_HEIGHT, 1024)
while(cap0.isOpened()):
    ret,frame=cap0.read()
    if ret==True:
        cv2.imshow("frame", frame)
    pass
    if cv2.waitKey(1000)&0xFF==ord("q"):
        break
    pass
pass
cap0.release()
cv2.destroyAllWindows()

注意当cv2.VideoCapture(*)中取0时,调用的是本地的摄像头;取1时,调用外置的摄像头。USB采集卡实际上已经通过usb接口被识别为视频流设备,只不过需要设置分辨率来显示画面。


三、C++OpenCV的配置

1.采用VS2015+OpenCV3.4.11的配置

1.采用VS2015+OpenCV3.4.11的配置
分别可在VS官网和opencv官网下载两款软件,OpenCV版本如下。
在这里插入图片描述

2.安装OpenCV

安装OpenCV,哪个盘均可,本人把他放到了E:\Program Files\opencv\opencv(本人安装时多放了一个文件夹,不要介意)文件夹下,如下图:
在这里插入图片描述

3.OpenCV环境变量的配置

3 提取之后进行环境变量的配置,此电脑-属性-高级系统设置-环境变量-系统变量-path中添加E:\Program Files\opencv\opencv\build\x64\vc14及E:\Program Files\opencv\opencv\build\x64\vc14\bin.添加之后确定,退出。

4.VC2015包含目录和库目录的配置

对VC2015属性页,进行包含目录和库目录的配置。
在这里插入图片描述

在这里插入图片描述

5.VC2015链接器-输入-附加依赖项的配置

对链接器-输入-附加依赖项并进行配置

在这里插入图片描述

这样就可以使用“一”中的代码了。
参考:https://blog.csdn.net/zhaojinzhi1992/article/details/108259296


总结

初次撰写,如有错误,尽请指正,不胜感谢。。。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_51645163/article/details/117561456

智能推荐

Fiddler安卓7.0以上HTTPS抓包及安卓9.0以上http抓包_Jasun的博客-程序员资料

Fiddler安卓7.0以上HTTPS抓包及安卓9.0以上http抓包问题:Android7.0及以上https无法抓包升级了 targetSdkVersion 到 28 后发现在 Android 7.0 以上机型 Fiddler 抓取 https 包时显示找不到证书问题原因Android 6.0 network配置文件&lt;!-- 默认允许所有明文通信 --&gt;&lt;base-config cleartextTrafficPermitted="true"&gt; &lt;tru

如何定位Android NDK开发中遇到的错误法_Lixby的博客-程序员资料

如何定位Android NDK开发中遇到的错误Android NDK是什么,为什么我们要用NDK?Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。众所周知,Android程序运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。NDK包括了

VirtualBox不能共享剪贴板,有两种情形_柳鲲鹏的博客-程序员资料

  正好这两种情形吾都碰到了:安装与系统问题。在有的机器上,安装了增强功能(参考吾博文)依然无法共享剪贴板。这个时候最好解决办法就是换一个机器安装。 软件不对。比如吾在UltraEdit中复制,在虚拟机上就不能粘贴;在记事本上复制,就可以。...

JAVA 中的设计模式(一)_方便资源相互通信的环境_zxy_go1的博客-程序员资料

JAVA 中的设计模式(一)1.1、创建型模式(5种)1.1.1、单列模式:在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。3、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了...

ASP.NET MVC 初学笔记.3 MVC5、EF、RDLC实现报表操作_asp.net mvc 报表_金虎大王的博客-程序员资料

在ASP.NET的研究学习中又要用到报表,比如在OA系统里实现凭证、文件等,报表是一个必不可少的东西,但百度了一圈,发现讲得最多的还是水晶报表等第三方报表,好像微软原装的RLDC报表随着MVC的升级渐渐淡出了报表圈?本着原装的就是最好的契合度的想法,于是开始了默默的研究使用配置RLDC报表。

随便推点

silverlight控件与HTML控件交互_kuaidi8的博客-程序员资料

======================================================注:重要!程序员如何有效的放松身心!下班后做什么?======================================================1、在您的asp.net网站添加silverlight特性。通常情况下,我们很少有用纯粹的silverlight项

LDD3阅读笔记-字符设备驱动_weixin_33701617的博客-程序员资料

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

VSCode中调试TypeScript (配置更新)_"program\": \"${workspacefolder}/${relativefile}\"_candyguy242的博客-程序员资料

网上搜了一下用VSCode调试TypeScript的资料,尝试后发现之前的配置方式已经失效,就连ts-node官方说明里的也过时了,一番搜索和尝试后,发现VSCode只要配置一下就可以运行和调试单个ts文件,方式如下:1、在VSCode中,点击菜单 调试-增加配置,在项目根目录的.vscode文件夹下会生成一个launch.json文件,在launch.json中输入如下内容,name可以随意...

html输入框怎么加逗号,JavaScript对INPUT输入的格式化显示 - 数字每隔3位加逗号_weixin_39836063的博客-程序员资料

functioncc(s){s=s.replace(/^(\d*)$/,"$1.");s=(s+"00").replace(/(\d*\.\d\d)\d*/,"$1");s=s.replace(".",",");varre=/(\d)(\d{3},)/;while(re.test(s))s=s.replace(re,"$1,$2");s=s.replace(/,(\d\d)$/,".$1");...

PAT -数据结构与算法题目集(中文)7-1_云森雨的博客-程序员资料

7-1 题目给定K个整数组成的序列{ N1 , N2, …, N​K },“连续子列”被定义为{ N​i, Ni+1, …, Nj},其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:数据1:与样例等价,测试基本正确性;数据2:102个