我的程序使用OpenCV库从网络摄像头捕获单个图像,然后将其保存到本地文件系统中。
目前它在我的桌面上工作正常;我的程序开发的地方。但是当我在笔记本电脑(不同设备)上测试时,它无法检测到网络摄像头。
我继续在另一台笔记本电脑上测试它,但仍然出现同样的问题。 当我执行程序时,笔记本电脑的两个网络摄像头都没有被使用,而且两台笔记本电脑只有一个集成的网络摄像头。
以下是设备的规格和OpenCV的CMake选项。
- 的桌面
- Windows 10 64位
- 通过USB连接的外部网络摄像头
- 网络摄像头存在于“设备管理器”
中- 网络摄像头存在于设备和打印机
中- 笔记本电脑1
- Windows 10 64位
- 板载网络摄像头(集成)
- 网络摄像头存在于“设备管理器”
中- 网络摄像头存在于设备和打印机
中- 能够在笔记本电脑的“相机”应用上访问网络摄像头
- 笔记本电脑2
- Windows 10 64位
- 板载网络摄像头(集成)
- 网络摄像头存在于“设备管理器”
中- 设备和打印机中不存在网络摄像头
- 能够在笔记本电脑的“相机”应用上访问网络摄像头
- OpenCV CMake
- V3.30
- BUILD_SHARED_LIBS OFF(静态图书馆)
- WITH_MSMF ON(媒体基金会支持)
- WITH_DSHOW OFF(试过,不起作用,读到它已经过时了)
- BUILD_opencv_world ON
以下显示的是我的代码:
计划标题
#include <opencv2/opencv.hpp>
void GetDevID();
void OpenDevice(int);
cv::Mat frame;
主要
int main()
{
// Initially I tried cv::VideoCapture cap.open(0) for default webcam.
// Unfortunately it only works on my desktop, so I tried opening
// from -1 to 254, hence GetDevID(). Still does not work.
GetDevID();
}
GetDevID - 获取第一个打开的设备
void GetDevID()
{
int MaxTested = 254;
int DevID = -2;
for (int i = -1; i < MaxTested; i++)
{
cv::VideoCapture TestDev(i);
bool IsDevOpen = TestDev.isOpened();
TestDev.release();
if (IsDevOpen)
{
DevID = i;
break;
}
}
OpenDevice(DevID);
}
OpenDevice - 打开经过测试的设备
void OpenDevice(int DevID)
{
cv::VideoCapture cap;
cap.open(DevID);
if (!cap.isOpen())
{
// This is where it fails when the program is executed on the laptop
// Which means the ID from -1 to 254 is not valid
}
else
{
// Capture 20th frame, for best clarity
for (int i = 0; i < 20; i++)
{
cap.read(frame);
}
cap.release();
if (frame.empty())
{
// Error handling occurs here
}
else
{
// Continues to save file
}
}
}
我在Google上运气不好,看起来OpenCV相关问题非常独特。
因此,如果有人能够建议我,我将非常感激。
如果我错过了关于这个问题的任何内容,请告诉我。
修改
正如DaveS所提到的,似乎我可能错过了一些事情。
该程序在台式机和笔记本电脑上运行良好,只是当它在笔记本电脑上运行时,它没有检测到任何网络摄像头设备,也没有丢失任何错误代码。
对于该程序,就好像没有连接的网络摄像头设备,但实际上有。
我还通过连接笔记本电脑上的外部网络摄像头进行了测试,程序仍无法找到任何网络摄像头设备。