OpenCV指定pid和vid通過MSMF打開攝像頭

在基于OpenCV的項目中,實際開發過程會面臨設備上存在多個攝像頭,需要指定攝像頭的pid和vid打開攝像頭。在OpenCV通過MSMF打開攝像頭時,需要傳入攝像頭的index,因此需要在打開該攝像頭前需要找出攝像頭的index,下面給出通過微軟的MF API找出MSMF枚舉攝像頭index的代碼:

#include <windows.h>
#include <mfapi.h>
#include <mfidl.h>
#include <mfreadwrite.h>
#include <string>
#include <vector>
#include <iostream>
#include <opencv2/opencv.hpp>#pragma comment(lib, "mf.lib")
#pragma comment(lib, "mfplat.lib")
#pragma comment(lib, "mfreadwrite.lib")
#pragma comment(lib, "mfuuid.lib")struct CameraInfo {int index;      // OpenCV 攝像頭索引int vid;        // Vendor ID (e.g., 0x046D for Logitech)int pid;        // Product ID (e.g., 0x0825 for C920)std::string symbolicLink; // 設備符號鏈接
};// 獲取所有 Media Foundation 攝像頭的 PID/VID
std::vector<CameraInfo> getMFCameraList() {std::vector<CameraInfo> cameras;IMFAttributes* pAttributes = nullptr;IMFActivate** ppDevices = nullptr;UINT32 count = 0;// 初始化 Media FoundationMFStartup(MF_VERSION);// 配置設備枚舉參數(僅視頻采集設備)MFCreateAttributes(&pAttributes, 1);pAttributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID);// 枚舉設備MFEnumDeviceSources(pAttributes, &ppDevices, &count);for (UINT32 i = 0; i < count; i++) {WCHAR* symbolicLink = nullptr;UINT32 length = 0;// 獲取設備 Symbolic Link(包含 VID/PID)ppDevices[i]->GetAllocatedString(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK,&symbolicLink,&length);if (symbolicLink) {std::wstring ws(symbolicLink);std::string devicePath(ws.begin(), ws.end());// 解析 VID/PID(格式:\\?\usb#vid_xxxx&pid_xxxx...)size_t vidPos = devicePath.find("vid_");size_t pidPos = devicePath.find("pid_");if (vidPos != std::string::npos && pidPos != std::string::npos) {std::string vidStr = devicePath.substr(vidPos + 4, 4);std::string pidStr = devicePath.substr(pidPos + 4, 4);int vid = std::stoi(vidStr, nullptr, 16);int pid = std::stoi(pidStr, nullptr, 16);cameras.push_back({-1, vid, pid, devicePath});}CoTaskMemFree(symbolicLink);}ppDevices[i]->Release();}if (pAttributes) pAttributes->Release();if (ppDevices) CoTaskMemFree(ppDevices);MFShutdown();return cameras;
}// 匹配 OpenCV 攝像頭索引
int findOpenCVCameraIndex(int targetVid, int targetPid) {auto cameras = getMFCameraList();int opencvIndex = 0;while (true) {cv::VideoCapture cap(opencvIndex, cv::CAP_MSMF);if (!cap.isOpened()) {break; // 沒有更多攝像頭}// 檢查當前攝像頭是否匹配目標 PID/VIDfor (const auto& cam : cameras) {if (cam.vid == targetVid && cam.pid == targetPid) {std::cout << "Found camera at OpenCV index: " << opencvIndex << std::endl;cap.release();return opencvIndex;}}cap.release();opencvIndex++;}return -1; // 未找到
}int main() {// 示例:查找 Logitech C920(VID=0x046D, PID=0x0825)int targetVid = 0x046D;int targetPid = 0x0825;int cameraIndex = findOpenCVCameraIndex(targetVid, targetPid);if (cameraIndex != -1) {cv::VideoCapture cap(cameraIndex, cv::CAP_MSMF);if (cap.isOpened()) {std::cout << "Successfully opened target camera!" << std::endl;// 進行視頻捕獲...}} else {std::cerr << "Target camera not found." << std::endl;}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85384.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85384.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85384.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32F103ZET6系統啟動過程

STM32F103ZET6系統啟動過程 一、概述 STM32F103ZET6啟動過程指硬件選擇啟動模式后,執行固件程序之前的一系列動作。對于系統存儲器模式,系統執行Bootloader程序升級狀態,檢測數據進行串口升級;對于內部Flash模式,系統執行啟動文件,設置堆棧大小,配置系統時鐘,最終調用…

[Data Pipeline] Kafka消息 | Redis緩存 | Docker部署(Lambda架構)

第七章&#xff1a;Kafka消息系統&#xff08;實時流處理&#xff09; 歡迎回到數據探索之旅&#xff01; 在前六章中&#xff0c;我們構建了強大的**批量處理流水線**。 通過Airflow DAG&#xff08;批量任務編排&#xff09;協調Spark作業&#xff08;數據處理&#xff09;…

jquery 賦值時不觸發change事件解決——仙盟創夢IDE

一、傳統方法jquey change $(#village_id).trigger(change);$("#village_id").val(99);$("#village_id").change(); 不生效 二、傳統方法jquey $(#village_id).trigger(change); 四、傳統方法jquey <input type"text" /> <button…

Android | 簽名安全

檢驗和簽名 校驗開發者在數據傳送時采用的一種校正數據的一種方式&#xff0c; 常見的校驗有:簽名校驗(最常見)、dexcrc校驗、apk完整性校驗、路徑文件校驗等。 通過對 Apk 進行簽名&#xff0c;開發者可以證明對 Apk 的所有權和控制權&#xff0c;可用于安裝和更新其應用。…

Android14 耳機按鍵拍照

在相機拍照預覽界面 通過耳機按鍵實現拍照功能 耳機按鍵定義 frameworks/base/core/java/android/view/KeyEvent.java public static final int KEYCODE_HEADSETHOOK 79;相機界面 拍照邏輯 DreamCamera2\src\com\android\camera\PhotoModule.java Override public bool…

【AI作畫】第2章comfy ui的一般輸入節點,文本框的類型和輸入形式

目錄 CLIP文本編碼器 條件輸出和文本輸出 轉換某一變量為輸入 展示作品集 在默認的工作流之外&#xff0c;我們如何自己添加節點呢&#xff1f; 一般我們用到的sampler采樣器在“鼠標右鍵——添加節點——采樣——K采樣器” 我們用的clip文本編碼器在“鼠標右鍵——添加節…

vue3仿高德地圖官網路況預測時間選擇器

<template><div class"time-axis-container"><div class"time-axis" ref"axisRef"><!-- 刻度線 - 共25個刻度(0-24) --><divv-for"hour in 25":key"hour - 1"class"tick-mark":class&…

ZArchiver:高效解壓縮,輕松管理文件

在數字時代&#xff0c;文件的壓縮與解壓已成為我們日常操作中不可或缺的一部分。無論是接收朋友分享的大文件&#xff0c;還是下載網絡資源&#xff0c;壓縮包的處理都極為常見。ZArchiver正是一款為安卓用戶精心打造的解壓縮軟件&#xff0c;它以強大的功能、簡潔的界面和高效…

1432.改變一個整數能得到的最大差值

貪心思想&#xff0c;為了得到最大差&#xff0c;想辦法變成一個最大的數和一個最小的數。 這里有規則&#xff0c;從最高位開始&#xff0c; 變成最大&#xff0c;如果<9&#xff0c;則將該數位代表的數都變成9&#xff0c;如果該數位已經是9了&#xff0c;則將下一個數位…

前端跨域解決方案(4):postMessage

1 postMessage 核心 postMessage 是現代瀏覽器提供的跨域通信標準 API&#xff0c;允許不同源的窗口&#xff08;如主頁面與 iframe、彈出窗口、Web Worker&#xff09;安全交換數據。相比其他跨域方案&#xff0c;它的核心優勢在于&#xff1a; 雙向通信能力&#xff1a;支持…

大語言模型指令集全解析

在大語言模型的訓練與優化流程中&#xff0c;指令集扮演著關鍵角色&#xff0c;它直接影響模型對任務的理解與執行能力。以下對常見指令集展開詳細介紹&#xff0c;涵蓋構建方式、規模及適用場景&#xff0c;助力開發者精準選用 為降低指令數據構建成本&#xff0c;學術界和工…

OpenCV CUDA模塊設備層-----用于封裝CUDA紋理對象+ROI偏移量的一個輕量級指針類TextureOffPtr()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 TextureOffPtr<T, R> 是 OpenCV 的 CUDA 模塊&#xff08;opencv_cudev&#xff09;中用于封裝 CUDA 紋理對象 ROI 偏移量 的一個輕量級指…

Python 數據分析10

2.3.3其他 除了前面所介紹的常用語數據挖掘建模的庫之外&#xff0c;還有許多庫也運用于數據挖掘建模&#xff0c;如jieba、SciPy、OpenCV、Pillow等。 1.jieba jieba是一個被廣泛使用的Python第三方中文分詞庫。jieba使用簡單&#xff0c;并且支持Python、R、C等多種編程語言的…

css 制作一個可以旋轉的水泵效果

如圖&#xff0c;項目里面有一個小圖片可以旋轉&#xff0c;達到看起來像是一個在工作的水泵。我使用css旋轉動畫實現。 一、HTML結構部分 <div className"ceshixuanzhuan"><img src{lunkuo} className"lunkuo"/><img src{yepian} classN…

數據結構期末程序題型

一、 隊列 1、簡單模擬隊列排列 #include<bits/stdc.h> using namespace std; int main(){int n;cin>>n;queue<int>q;string str;while(true){cin>>str;if(str"#")break;if(str"In"){int t;cin>>t;if(q.size()<n){q.pu…

SpringCloud+Vue汽車、單車充電樁源碼實現:從架構設計到核心模塊解析

智慧充電管理平臺技術實現&#xff1a;從架構設計到核心模塊解析 智慧充電管理平臺作為新能源汽車生態的核心基礎設施&#xff0c;需要實現充電設備管理、訂單處理、數據統計分析等復雜功能。本文將從技術架構、核心模塊設計、關鍵技術實現三個維度&#xff0c;深度解析平臺的…

Kafka入門及實戰應用指南

1、Kafka概述 Apache Kafka是由LinkedIn公司于2010年開發的一款分布式消息系統&#xff0c;旨在解決當時傳統消息隊列&#xff08;如ActiveMQ、RabbitMQ&#xff09;在高吞吐量和實時性場景下的性能瓶頸。隨著LinkedIn內部對實時日志處理、用戶行為追蹤等需求的激增&#xff0…

智能指針 c++

C 智能指針詳解 智能指針是 C11 引入的內存管理工具&#xff0c;位于 <memory> 頭文件中&#xff0c;用于自動管理動態分配的內存&#xff0c;防止內存泄漏。主要類型如下&#xff1a; 1. std::unique_ptr (獨占所有權) 特點&#xff1a;唯一擁有所指對象&#xff0c;不…

Python應用八股文

大家好!在 Python 學習的道路上&#xff0c;掌握一些基礎知識要點至關重要&#xff0c;這些要點常被稱為“Python 八股”。以下是對它們的簡易總結&#xff0c;幫助你快速回顧和鞏固 Python 的核心概念。 一、數據結構 列表&#xff08;List&#xff09;&#xff1a;有序可變序…

【技術深度】領碼SPARK破解微服務數據依賴困局:架構設計與實踐指南

——深度解析分布式數據冗余與異步消息機制&#xff0c;驅動企業數字化轉型加速 ? 核心摘要 本文從技術架構與工程實現的角度&#xff0c;系統講解領碼SPARK融合平臺如何精準解決微服務架構下數據依賴“卡脖子”問題。通過設計高效的數據冗余模型和完善的異步消息更新機制&am…