admin 管理员组

文章数量: 887021

搞了下Win的USB相机今天来写写
1.记录日常
2.抛砖引玉献丑了,还有一些问题没有解决

Win 下 Usb相机视频流播放及查看属性

  • 相机视频流播放
    开始菜单->相机
    就可以获取实时视频流,上边有个转换按钮可以转换不同的摄像头

  • 相机属性查看
    连接上usb设备后,我的电脑-> 管理->设备管理器 ->照相机 ->对应的相机
    左键双击或者右键属性->详细信息就可以查看属性包括:
    {设备名称,硬件ID,设备实例路径,哈希ID,序列号(有的可能没有),…}

    属性含义

VID - 供应商标识
PID - 产品表识 
REV - 修订版本
IserialNumber - 序列号
设备路径 - Windows操作系统依赖一个唯一的设备路径来唯一地识别连接到系统的每个USB设备/接口。设备路径字符串用于与USB设备通信,被传递给Win32 API函数CreateFile()
容器ID - 系统提供的容器 ID 通过多种方式生成。 此决定基于设备中包含的信息。 此信息是从 ACPI 设置、USB 总线驱动程序和 USB 集线器检索的
GUID - 标志你安装的设备是属于一个什么类

理论上可以通过VID 和 PID 来唯一标识一个相机,但是在实际使用过程中同时使用同一厂家的同一型号相机而 绝大多数“山寨”【没用过贵的所以不知道情况】会出现 设备名称,VID/PID一致的情况而导致无法进行区分设备;如下图某宝的俩台一样的设备:名称VID/PID完成一样

获取相机视频流

通过 Opencv 获取获取还是比较简单方便,难点是不知道 index 和 usb相机的对应关系

#include <opencv2/opencv>
#include <iostream>
 
using namespace std;
using namespace cv;
 
int main()
{
   
    VideoCapture camera(0) // 从0开始有几个相机就到自然数几;调用可以依次打开不同的相机
 
    if(!camera.isOpened())
    {
    
       std::cout<<"The camera is not turned on!!!"<<std::endl;
       return 1;
    }   
    
    while (true)
    {
   
        Mat frame;
        camera >> frame;
 
	    if(frame.empty())
            break
        else
        {
   
            imshow("test",frame);
         }
        return 0;
 }

区分相同 Usb相机设备

先说结论:获取到设备实例路径 或 容器ID 来区分
1.设备实例路径不同
打开相机采用的opencv库之前有大佬看过opencv的源码定位到获取usb设备的代码:是采用directshow;代码如下

.h文件

#pragma once
#include<iostream>
#include<algorithm>
#include<vector>
#include<dshow.h>
#include<tuple>

#pragma   comment(lib,"Strmiids.lib")   
using namespace std;

class ListDivice
{
   
public:
	void Test(string usbpath);
	
	int listDevicesTuple(vector<tuple<string, string>>& list); // 这里获取了名称和设备路径ID,可以自己选择增删
};

.cpp文件

#include "ListDivice.h"

void ListDivice::Test(string usbpath)
{
   
    vector<tuple<string, string>> deviceName;
    int deviceNum = listDevicesTuple(deviceName);
    for (int i = 0; i < deviceNum; i++)
    {
   
        string tmp = get<0>(deviceName[i]);
        int a = tmp.find("usb");
        int b = tmp.find("{");
        tmp = tmp.substr(a, b - a - 1);

        while (tmp.find("#") != -1)
        {
   
            int postion = tmp.find("#");
            tmp.

本文标签: 相机 window USB