opencv获取摄像头的个数及名字

最近需要使用多个摄像头来进行视频分析,有一个问题就是如何获取目前主机上有多少个摄像头。网上看了下,用VideoInput这个开源库的居多,但是还要引入这个库以及一些附加的依赖库,显得较为麻烦。其实在opencv中已经封装了这个库,但是封装的比较厉害,我需要的获取摄像头个数的接口就在里面。最后就只能改源码了。做个笔记,以防下次再次使用。

测试平台:win7(32)+vs2010+opencv2.4.9

使用前提:opencv2.4.9可以正常在vs2010上运行(即原先的配置是正确的)

工程以及编译好的头文件和库的下载地址在文章的末尾。

下面是修改过程:

步骤一:在源文件cap_dshow.cpp中的类CvCaptureCAM_DShow中增加两个函数,分别为:

virtual intreDeviceCount();//返回摄像头为数量

virtual std::string reDeviceName(intdeviceId);//返回摄像头ID对应的名字

class CvCaptureCAM_DShow : public CvCapture
{
public:
	CvCaptureCAM_DShow();
	virtual ~CvCaptureCAM_DShow();
...
	virtual int reDeviceCount();//返回摄像头的数量
	virtual std::string reDeviceName(int deviceId);//返回摄像头ID对应的名字
...
};
实现这两个函数:

int CvCaptureCAM_DShow::reDeviceCount()
{
	int deviceNumber = VI.listDevices(true);
	return deviceNumber;
}
std::string CvCaptureCAM_DShow::reDeviceName(int deviceId)
{
	int deviceNumber = VI.listDevices(true);
	if (deviceId < deviceNumber)
	{
		char * deviceName = VI.getDeviceName(deviceId);
		std::string str(deviceName);
		return str;
	}
	else
	{
		std::string str("Default Camera");
		return str;
	}
}

步骤二:在头文件precomp.hpp中增加两个函数,分别为:

intretrieveDeviceCount_DShow();返回摄像头的数量

std::string retrieveDeviceName_DShow(int deviceId);返回摄像头对应名字。

CvCapture* cvCreateCameraCapture_DShow( int index );
int retrieveDeviceCount_DShow();//增加的函数
std::string  retrieveDeviceName_DShow(int deviceId);//增加的函数
CvCapture* cvCreateCameraCapture_MSMF( int index );
CvCapture* cvCreateFileCapture_MSMF (const char* filename);

步骤三:在源文件cap_dshow.cpp的最后实现步骤二中的两个函数,这两个函数分别调用了步骤一中的两个函数。

int  retrieveDeviceCount_DShow()
{
	CvCaptureCAM_DShow* capture = new CvCaptureCAM_DShow;
	int deviceCount = capture->reDeviceCount();
	delete capture;
	return deviceCount;
}
std::string  retrieveDeviceName_DShow(int deviceId)
{
	CvCaptureCAM_DShow* capture = new CvCaptureCAM_DShow;
	std:: string deviceName = capture->reDeviceName(deviceId);
	delete capture;
	return deviceName;
}
步骤四:在源文件cap.cpp中分别增加两个函数并实现。这两个函数分别调用了步骤三中的两个函数。

CV_IMPL int retrieveDeviceCount()
{
	int deviceCount = retrieveDeviceCount_DShow();
	return deviceCount;
}

CV_IMPL	std::string retrieveDeviceName(int deviceId)
{
	std::string deviceName = retrieveDeviceName_DShow(deviceId);
	return deviceName;
}

步骤五:在头文件highgui.hpp中的类VideoCapture中增加两个函数,分别为:

CV_WRAP virtual int getDeviceCount();获取摄像头的数量

CV_WRAP virtualstd::string getDeviceName(int deviceId);获取对应摄像头的名字。

class CV_EXPORTS_W VideoCapture
{
public:
   	CV_WRAP VideoCapture();
...
    	CV_WRAP virtual bool open(int device);
	CV_WRAP virtual int getDeviceCount();//增加的函数
	CV_WRAP virtual std::string getDeviceName(int deviceId);//增加的函数
...
};
步骤六:在源文件cap.cpp中实现步骤五中增加的两个函数,这两个函数分别调用了步骤四中的两个函数。

int VideoCapture::getDeviceCount()
{
	int deviceCount = retrieveDeviceCount();
	return deviceCount;
}
std::string VideoCapture::getDeviceName(int deviceId)
{
	std::string deviceName = retrieveDeviceName(deviceId);
	return deviceName;
}
步骤七:至此,源码修改完毕。

步骤八:在Debug模式下,右键opencv_highgui工程选择Set as StartUp Project,然后右键opencv_highgui工程选择Build,开始构建。构建完成后会生成所需的动态库和静态库。

Release模式下重复此操作,会生成release模式下的动态库和静态库。

opencv获取摄像头的个数及名字_第1张图片


步骤九:到源码工程(opencv.sln)所在文件夹中的bin和lib文件夹中的Debug和Release文件夹中拷贝出

opencv_highgui249.dll、

opencv_highgui249d.dll、

opencv_highgui249.lib、

opencv_highgui249d.lib、

opencv_ffmpeg249.dll(没有测试是不是必须的)。

以及..\sources\modules\highgui\include\opencv2\highgui路径下的highgui.hpp(这个就是在步骤五中修改的那个头文件)。

将这六个文件分别替换掉原始配置的文件。

即:将*.dll文件替换掉配置路径..\opencv\build\x86\vc10\bin中重复的文件(替换前先备份)。

将*.lib文件替换掉配置路径..\opencv\build\x86\vc10\lib中重复的文件(替换前先备份)。

将highgui.hpp替换掉路径..\opencv\build\include\opencv2\highgui中重复的文件(替换前先备份)。

步骤十:至此就可以进行测试了。

测试源码:

#include 
#include 
using namespace std;
int main()
{
	cv::VideoCapture cap;
	int devicenumber = 0;
	std::vector devicename;
	int deviceCount = cap.getDeviceCount();
	std::cout<

输出结果:(摄像头的名字中文显示会出现乱码,那位有精力的大神在帮忙改一下)

opencv获取摄像头的个数及名字_第2张图片



工程及编译好的库和头文件下载地址:就在这里


你可能感兴趣的:(OpenCV学习记录)