如何区分两个摄像头,这两个摄像头有同样的PID和VID?

cnchery 2009-10-26 11:12:52
我做个系统又两个摄像头,如何每次机器关过后,我能打开我想要的摄像头,譬如这两个摄像头一个是左,一个是右。如果我用displayname来区分,我保存了左,右摄像头的displayname,然后用这个displayname打开,大部分情况都可以正确的打开左右摄像头,但是有时候,windows重启了,displayname改变了,我就不能通过区分哪个是左,哪个是右了。所以想问问有什么别的标示来表示一个独立的摄像头,这个标示不会改变,或者说不换插得USB接口就不变,不管是不是电脑重启。
...全文
1012 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zs229 2011-08-15
  • 打赏
  • 举报
回复
hahs
MoXiaoRab 2009-10-27
  • 打赏
  • 举报
回复
枚举GUID示例源代码


void CGetUDiskDriverDlg::SearchUDISK()
{
int nCount, len;//标记同一设备个数
HDEVINFO hDevInfoSet;
BOOL bResult;
char * devicename;
char volume[MAX_PATH];
char ch[100];

memset(volume, 0, MAX_PATH);

PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail =NULL;

// 取得一个该GUID相关的设备信息集句柄
hDevInfoSet = ::SetupDiGetClassDevs((LPGUID)&HARDDISK_GUID,//GUID_CLASS_USB_DEVICE, // class GUID
NULL, // 无关键字
NULL, // 不指定父窗口句柄
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的设备

// 失败...
if (hDevInfoSet == INVALID_HANDLE_VALUE)
{
return;
}

// 申请设备接口数据空间

nCount = 0;
bResult = TRUE;

SP_DEVICE_INTERFACE_DATA ifdata;
// 设备序号=0,1,2... 逐一测试设备接口,到失败为止
while (bResult)
{

ifdata.cbSize = sizeof(ifdata);
// 枚举符合该GUID的设备接口
bResult = ::SetupDiEnumDeviceInterfaces(
hDevInfoSet, // 设备信息集句柄
NULL, // 不需额外的设备描述
(LPGUID)&HARDDISK_GUID,//GUID_CLASS_USB_DEVICE, // GUID
(ULONG)nCount, // 设备信息集里的设备序号
&ifdata); // 设备接口信息

if (bResult)
{
ULONG predictedLength = 0;
ULONG requiredLength = 0;
// 取得该设备接口的细节(设备路径)
bResult = SetupDiGetInterfaceDeviceDetail(
hDevInfoSet, // 设备信息集句柄
&ifdata, // 设备接口信息
NULL, // 设备接口细节(设备路径)
0, // 输出缓冲区大小
&requiredLength, // 不需计算输出缓冲区大小(直接用设定值)
NULL); // 不需额外的设备描述
// 取得该设备接口的细节(设备路径)
predictedLength=requiredLength;

// if(pDetail)
// {
// pDetail =NULL;
// }
pDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, predictedLength);
pDetail-> cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
bResult = SetupDiGetInterfaceDeviceDetail(
hDevInfoSet, // 设备信息集句柄
&ifdata, // 设备接口信息
pDetail, // 设备接口细节(设备路径)
predictedLength, // 输出缓冲区大小
&requiredLength, // 不需计算输出缓冲区大小(直接用设定值)
NULL); // 不需额外的设备描述

if (bResult)
{
// 复制设备路径到输出缓冲区
for(int i=0;i <17;i++){
ch[i]=*(pDetail-> DevicePath+8+i);
}
ch[17]= '\0 ';
if (strcmp(ch, "vid_11dd&pid_0101 ")==0 ||
strcmp(ch, "vid_11dd&pid_11dd ")==0 ||
strcmp(ch, "vid_0101&pid_0101 ")==0 ||
strcmp(ch, "vid_0101&pid_11dd ")==0) //比较版本号,防止意外出错
{
len = strlen(pDetail-> DevicePath);
devicename = new char[len];
memset(devicename, 0, len);
for(int i=0;i <(len-38);i++)
{
ch[i]=*(pDetail-> DevicePath+i);
}
ch[len-38]= '\0 ';
memset(volume, 0, MAX_PATH);
}
}
}
nCount++;
}
// 释放设备接口数据空间
::GlobalFree(pDetail);

// 关闭设备信息集句柄
::SetupDiDestroyDeviceInfoList(hDevInfoSet);
}

cnchery 2009-10-26
  • 打赏
  • 举报
回复
能稍微说的详细点吗?谢谢
MoXiaoRab 2009-10-26
  • 打赏
  • 举报
回复
可以在PID和VID相同的情况下使用GUID进行判断
cnchery 2009-10-26
  • 打赏
  • 举报
回复
但是我能保存什么信息,下次以这个信息打开摄像头,就能知道左边的信息打开的是左摄像头了?总不能保存句柄吧
cnchery 2009-10-26
  • 打赏
  • 举报
回复
能解释下displayname怎么产生的吗?
jtujtujtu 2009-10-26
  • 打赏
  • 举报
回复
应该有很多方法的
可以通过directshow、ioctl等来获取摄像头的完整path
此path可以通过createfile来创建对应摄像头的handle
是可以区分不同摄像头的
只需要你指定某一个为左,另一个为右
应该可以满足你的要求
cnchery 2009-10-26
  • 打赏
  • 举报
回复
directshow中能获取guid吗?
cnchery 2009-10-26
  • 打赏
  • 举报
回复
真不知道怎么获取,百度也没有
MoXiaoRab 2009-10-26
  • 打赏
  • 举报
回复
怎么获得GUID不用我教你把?
cnchery 2009-10-26
  • 打赏
  • 举报
回复
没人给我稍微详细点的方法吗?

19,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧