HDMI采集卡+Python+OpenCV实时显示画面_m0_51645163的博客-程序员秘密_python 采集卡

技术标签: 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

智能推荐

手把手教你在Linux(Deepin)通过you-get下载网页视频_发呆哥o_o ....的博客-程序员资料_linux 下载视频

you-get简介下载you-get如何使用you-get简介you-get是一款开源的视频网站下载工具(一般都是1080P的)。使用You-Get可以很轻松的下载到网络上的视频、图片及音乐。(算了,直男说不出来花里胡哨的东西,直接下载吧)you-get下载百度搜索会显示需要下载各种环境,配置各种文件,这里在Deepin只需要几个简单的命令更新sudo apt-get update安装 pipsudo apt-get install python3-pip安装 you-get.

大数据这点事 - 认识大数据_chouou6850的博客-程序员资料

Volume:数据体量巨大。从TB级别,跃升到PB级别; Variety:数据类型繁多。日常的网络日志、视频、图片、地理位置信息等等; Value:价值密度低。如连续不间断监控视频,可能有用的数据仅仅有一两秒; Velocity:处理速度快,“1秒”定律。 大数据来源非常...

C语言快速排序函数qsort_qq_38191717的博客-程序员资料

快速排序库函数qsort的函数原型     void qsort(void *a,int nelem,unsigned int width,int(*pfCompare)(const void* e1,const void* e2));依次是  要排序数组的首地址     元素个数    元素的字节    比较的函数#includeint Compare(const void* e1,

如何保存token-localStorage存储_大浪淘沙胡的博客-程序员资料_localstorage存储token

1、原理原理是通过vue-router的beforeEach钩子,在每次路由到一个地址的时候先判断该路由是否携带了meta信息,且该信息中的requireAuth是否为true,如果为true表示该路由是需要身份验证的。则去localStorage找token,若token不存在则表示用户无认证,去登录请求token。若token存在则拿着token去请求。2、token保存login.vu...

python爬虫实战(九) B站热门视频信息爬取(复杂版)| scrapy+selenium组合爬取_皖渝的博客-程序员资料

目录一、scrapy基本介绍二、爬虫分析三、各部分代码一、scrapy基本介绍二、爬虫分析三、各部分代码

flutter小记(3)_qq_44592406的博客-程序员资料

RangeError (index): Invalid value: Valid value range is empty: 0用data.isNotEmpty或者isEmpty改正

随便推点

安卓Spinner下拉列表的代码_chengxian6892的博客-程序员资料

XML布局: &lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" androi...

SFML从入门到放弃(1) 窗口和交互_weixin_30404405的博客-程序员资料

SFML从入门到放弃(1) 窗口和交互创建一个新窗口:sf::RenderWindow window(sf::VideoMode(500,500),"new window");但是光创建一个窗口并不能显示还要加一个循环 while (window.isOpen()){ sf::Event event; //接受窗口事件 w...

javascript中onclick(this)用法和onclick(this.value)用法介绍_只在朝暮间的博客-程序员资料_onclick(this)

onclick(this.value)代码详解<html> <head> <script language="javascript"> function test(value){ if(value=='1') { alert("11111111"); }else{ alert

通过公式计算圆周率_Arrogant_95的博客-程序员资料

’ 计算pi的值 ’ # step 1: 创建一个奇数序列: 1, 3, 5, 7, 9, …# step 2: 取该序列的前N项: 1, 3, 5, 7, 9, ..., 2*N-1.# step 3: 添加正负符号并用4除: 4/1, -4/3, 4/5, -4/7, 4/9, ...# step 4: 求和: 函数先声明符号以及和(s),通过itertools生成一串数列,限制

完成端口教程_茶向的博客-程序员资料

http://wenku.baidu.com/view/6197a98ecc22bcd126ff0c7b.htmlhttp://wenku.baidu.com/view/9743f92758fb770bf78a5515.html高伸缩性的应用的一个原则:1.      创建更少的线程消耗的资源少,每个线程会存储用户栈,线程上下文,内核栈等信息。线程多占用cpu的调度,线程多会造

ES6学习笔记——默认函数,箭头函数,剩余函数_一个程序媛。的博客-程序员资料

1.默认函数例1:结果:welcome代码解释:当a,b没有传值的时候,默认a='欢迎',b='mmr',当参数传的值是' ',也是传了值的。例2:结果:0 0代码解释:{x=0,y=0}={} 解构赋值的结果 0 0 作为函数的参数2. 函数参数默认已经定义了,不能再用let const 再定义例3:如下代码会报错3.扩展运算符,剩余运算符(即...)例4:结果:代码解释: ...意思是将...