测试平台: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.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<
工程及编译好的库和头文件下载地址:就在这里