当前位置: 首页 > wzjs >正文

网站建设公司汕头的东莞知名企业排名

网站建设公司汕头的,东莞知名企业排名,网站中点击链接怎么做的,城市维护建设税在哪个网站申报在计算机视觉应用中,经常需要从特定的摄像头设备获取视频流。例如,在多摄像头环境中,当使用 OpenCV 的 cv::VideoCapture 类打开摄像头时,如果不指定摄像头的 ID,可能会随机打开系统中的某个摄像头,或者按照…

在计算机视觉应用中,经常需要从特定的摄像头设备获取视频流。例如,在多摄像头环境中,当使用 OpenCV 的 cv::VideoCapture 类打开摄像头时,如果不指定摄像头的 ID,可能会随机打开系统中的某个摄像头,或者按照设备连接的顺序打开第一个可用的摄像头。
比如:

    // 打开两个摄像头cv::VideoCapture cap0(0);if (!cap0.isOpened()) {cap0.open(0);}cv::VideoCapture cap1(1);if (!cap0.isOpened() || !cap1.isOpened()) {std::cerr << "Error: Cannot open camera" << std::endl;return;}

在多摄像头环境下,这种方式可能无法满足应用需求。此外,直接使用摄像头 ID 的方式可能不够稳定,因为设备的连接顺序或系统分配的 ID 可能会发生变化。

那如何使用 OpenCV 打开指定的摄像头呢?我们知道,摄像头都会在安装后,操作系统会生成一个设备ID信息,

操作系统就是根据摄像头的 PID(产品 ID)和 VID(供应商 ID)来精确识别并打开某个摄像头的。

Image

如图所示,对应关系分别如下:

VID_0BDA&PID_3787 (Front Camera)
VID_0BDA&PID_5846 (HBVCAM Camera)
VID_0BDA&PID_D567 (USB Camera)

解决办法

那OpenCV是否支持在打开摄像头时,根据个信息进行指定呢?当然可以。

在 Windows 系统中,摄像头设备通常通过 DirectShow API 进行管理和操作。而 OpenCV 是一个功能强大的开源计算机视觉库,提供了与摄像头交互的接口。结合两者的优势,可以方便地实现对指定摄像头的访问。

通过以下步骤实现对指定摄像头的打开:

  1. 1. 使用 DirectShow API 枚举系统中的摄像头设备,并获取每个设备的详细信息,包括设备路径、PID 和 VID 等。

  2. 2. 根据用户指定的 PID 和 VID,在设备列表中查找匹配的设备,并获取其对应的设备 ID。

  3. 3. 使用 OpenCV 的 cv::VideoCapture 类,结合设备 ID 和 DirectShow API,打开指定的摄像头设备。

以下是完整的 C++ 代码,展示了如何使用 OpenCV 和 DirectShow API 打开指定 PID 和 VID 的摄像头:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <opencv2/opencv.hpp>
#include <DShow.h>
#include <atlstr.h>
#pragma comment(lib,"Strmiids.lib")// 定义导出函数的宏
#ifdef _WIN32
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT
#endif// 获取摄像头ID的函数
DLL_EXPORT int getCamIDFromPidVid(const char* pidvid) {std::vector<std::string> devList; // 设备列表int iCameraNum = 0; // 设备个数ICreateDevEnum* pDevEnum = NULL;IEnumMoniker* pEnum = NULL;HRESULT hr = CoInitialize(NULL);if (FAILED(hr)) {std::cerr << "COM 初始化失败,错误码: " << hr << std::endl;return-1;}hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pDevEnum));if (FAILED(hr)) {std::cerr << "创建设备枚举器失败,错误码: " << hr << std::endl;CoUninitialize();return-1;}hr = pDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0);if (hr != S_OK && hr != S_FALSE) {std::cerr << "枚举视频输入设备类别失败,错误码: " << hr << std::endl;pDevEnum->Release();CoUninitialize();return-1;}if (hr == S_FALSE) {std::cerr << "没有找到视频输入设备" << std::endl;pDevEnum->Release();CoUninitialize();return-1;}IMoniker* pMoniker = NULL;ULONG cFetched;while (pEnum->Next(1, &pMoniker, &cFetched) == S_OK) {IPropertyBag* pPropBag;hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, reinterpret_cast<void**>(&pPropBag));if (SUCCEEDED(hr)) {VARIANT varName;VariantInit(&varName);varName.vt = VT_BSTR;hr = pPropBag->Read(L"DevicePath", &varName, NULL);if (SUCCEEDED(hr) && varName.vt == VT_BSTR && varName.bstrVal != nullptr) {std::wstring wstrDevicePath(varName.bstrVal);std::string strDevicePath(wstrDevicePath.begin(), wstrDevicePath.end());devList.push_back(strDevicePath);iCameraNum++;} else {std::cerr << "读取设备路径失败,错误码: " << hr << std::endl;}VariantClear(&varName);pPropBag->Release();}pMoniker->Release();}pEnum->Release();pDevEnum->Release();// 将输入的pidvid转换为小写std::string lowerPidvid = pidvid;std::transform(lowerPidvid.begin(), lowerPidvid.end(), lowerPidvid.begin(), ::tolower);int iRet = -1;for (int i = 0; i < devList.size(); i++) {// 将设备路径转换为小写std::string lowerDevicePath = devList[i];std::transform(lowerDevicePath.begin(), lowerDevicePath.end(), lowerDevicePath.begin(), ::tolower);if (lowerDevicePath.find(lowerPidvid) != std::string::npos) {iRet = i;break;}}CoUninitialize();return iRet;
}// 主函数示例
int main() {// 替换为你的摄像头的PID和VID,支持大写和小写std::string targetPidVid = "VID_XXXX&PID_XXXX"; // 例如:"VID_046D&PID_0825"int camId = getCamIDFromPidVid(targetPidVid.c_str());if (camId == -1) {std::cout << "未找到匹配的摄像头" << std::endl;return-1;}std::cout << "摄像头ID: " << camId << std::endl;// 使用OpenCV打开摄像头cv::VideoCapture cap;cap.open(camId, cv::CAP_DSHOW);if (!cap.isOpened()) {std::cerr << "无法打开摄像头,ID: " << camId << std::endl;return-1;}// 尝试读取一帧,验证摄像头是否真的可用cv::Mat frame;if (!cap.read(frame)) {std::cerr << "无法从摄像头读取帧,ID: " << camId << std::endl;cap.release();return-1;}std::cout << "摄像头已成功打开" << std::endl;while (true) {cap >> frame;if (frame.empty()) {std::cerr << "无法读取帧" << std::endl;break;}cv::imshow("Camera", frame);if (cv::waitKey(1) == 27) { // 按ESC键退出break;}}cap.release();cv::destroyAllWindows();return0;
}

注意细节

  1. 1. 确保安装了 OpenCV 库,并正确配置了开发环境。

  2. 2. 根据实际摄像头的 PID 和 VID 修改代码中的 targetPidVid 变量值。

  3. 3. 在编译代码时,链接必要的库文件,如 Strmiids.lib 和 OpenCV 相关的库。

  4. 4. 在选择摄像头时,我们要确保多个摄像头要各不一样(这样即可保证通过VID/PID来区分摄像头),但每一种都要采购统一(保证在不同电脑上VID/PID都一样)。

  5. 5. 上述相关思想也可以在 *nix 等系统中使用。

通过上述代码和方法,可以实现根据摄像头的 PID 和 VID 精确打开指定的摄像头设备,适用于多摄像头环境和需要精确设备识别的场景。


文章转载自:

http://WtmqWXom.ffdyy.cn
http://UkqK6p8y.ffdyy.cn
http://y839nZC6.ffdyy.cn
http://vfUAy9Bq.ffdyy.cn
http://mOL4LFC5.ffdyy.cn
http://2Cx6gHNz.ffdyy.cn
http://fFxyyZrp.ffdyy.cn
http://CoSZTP7f.ffdyy.cn
http://OUtAu7rd.ffdyy.cn
http://mBwkjFDQ.ffdyy.cn
http://ru17CkdF.ffdyy.cn
http://zwWzaGHI.ffdyy.cn
http://SMa4PjHB.ffdyy.cn
http://b3loX9zl.ffdyy.cn
http://xd3kY6oQ.ffdyy.cn
http://8l9QpXNS.ffdyy.cn
http://v87g733f.ffdyy.cn
http://kRlFBpAZ.ffdyy.cn
http://9u8eZlbE.ffdyy.cn
http://qA5l6PfG.ffdyy.cn
http://71E8Io09.ffdyy.cn
http://A73oMwLt.ffdyy.cn
http://n4XhGmHC.ffdyy.cn
http://gKWsZM5K.ffdyy.cn
http://H84tTe9Y.ffdyy.cn
http://ZQVKsq8a.ffdyy.cn
http://S9S3Et7C.ffdyy.cn
http://ce10ndCb.ffdyy.cn
http://5T7Cd8Kp.ffdyy.cn
http://E8SXAEhy.ffdyy.cn
http://www.dtcms.com/wzjs/690969.html

相关文章:

  • 图列说明网站开发的流程关于网站集约化建设的意见
  • 创建个人主页网站网站首页模板图片
  • 别样网站建设黑龙江省住房和城乡建设信息网
  • 给孩子做衣服的网站工信局网站备案查询
  • 界面官方网站网站开发与发布
  • 浏阳网站制作公司wordpress游戏小程序
  • 滕州网站架设wordpress主题 电影
  • 山东专业网站建设wordpress导购主题免费
  • js实现网站浮动窗口优秀的ui设计案例分析
  • 厦门自助网站建设报价建的企业网站如何在百度搜到
  • 高埗镇网站建设公司投资网站网站源码
  • 上海网站开发企业深圳福田专业网站推广
  • 一个公司做两个网站宁波网站建设开发公司
  • 网站有哪些费用多少钱购票网站模板
  • 网站什么也没动怎么不收录啦凡客陈年
  • 网站开发哪家好wordpress黄聪文件上传
  • 微信网站模板免费下载百度app智能小程序
  • apache多网站配置wordpress淘宝客网站运营
  • 优秀国外设计网站app做网站的行情
  • 云畅网站建设涉县住房和城乡规划建设局网站
  • 用asp做网站需要准备什么木疙瘩h5制作
  • 深圳 企业网站建设制作网站公司价格
  • 东昌府区建设局网站php网站开发 pdf
  • 小型企业建设网站河南金建建设有限公司网站
  • .net做网站的优缺点企业可以做哪些网站有哪些内容
  • 网站维护开发合同深圳网络优化有限公司
  • 网站方案建设书怎么写巨久科技网站建设
  • 网站开发流程 ppt建设银行网站用户名怎么查
  • 我想找个郑州做网站的网站产品推广制作
  • 顺义区做网站的公司网页设计用到的技术