0.介绍opencv之前先了解下visual studio和opencv之间的版本对应关系
- VS版本与VC版本对应关系
Visual Studio 6 : vc6
Visual Studio 2003 : vc7
Visual Studio 2005 : vc8
Visual Studio 2008 : vc9
Visual Studio 2010 : vc10
Visual Studio 2012 : vc11
Visual Studio 2013 : vc12
Visual Studio 2015 : vc14
Visual Studio 2017 : vc15
- opencv 对 VC版本 的支持情况
opencv 2.4.10 == vc10、vc11、vc12
opencv 2.4.13 == vc11、vc12
opencv 3.4.0 == vc14、vc15
opencv 3.4.1 == vc14、vc15
所以大家查看自己的vs版本,选择相应的opencv版本,不要搞错了,如果非要vs2017下配置opencv2.4.10,好像会报缺少mfc动态库的错,所以建议版本匹配。
本篇选择版本的opencv2.4.9+vs2010,都比较老,但这并不影响功能。主要实现摄像头的打开关闭操作,并实现简单的纸张检测算法。主要用于高拍仪文档识别、扫描等场景。
1.环境准备
- opencv2.4.9下载
可以从官网下载,速度慢;
也可以从百度网盘下载,https://pan.baidu.com/s/1o7WoC7S,下载好之后解压安装,设置d盘根目录。
解压安装好后,目录如下:
2.打开vs2010,新建对话框工程OpenCVCam,配置项目属性。
2.1)包含目录
2.2)库目录
2.3)链接库
opencv_ml249d.lib
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_objdetect249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_nonfree249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_videostab249d.lib
经过这3步,vs2010下opencv249的环境已经配置完毕,下面就可以编写代码。
3.编写CVCamera类,主要包括摄像头打开,关闭,拍照和自动识别纸张的算法,和裁减出纸张的功能。
头文件如下:
//************************************
// Method: OpenCamera 打开摄像头
// FullName: CVCamera::OpenCamera
// Access: public
// Returns: bool
// Qualifier:
// Parameter: int indexDevice 摄像头索引
// Parameter: int width 像素宽
// Parameter: int height 像素高
//************************************
bool OpenCamera(int indexDevice, int width, int height);
//************************************
// Method: CloseCamera 关闭摄像头
// FullName: CVCamera::CloseCamera
// Access: public
// Returns: void
// Qualifier:
//************************************
void CloseCamera();
//************************************
// Method: Grab 拍照,是否自动识别图片中纸张并裁减
// FullName: CVCamera::Grab
// Access: public
// Returns: int
// Qualifier:
// Parameter: const char * fileName 文件名,需要后缀
// Parameter: int angle 旋转角度 0,90,180,270
// Parameter: bool beCut 是否自动识别图片中纸张并裁减
// Parameter: POINT & p1 识别到的纸张的像素点p1
// Parameter: POINT & p2 识别到的纸张的像素点p2
// Parameter: POINT & p3 识别到的纸张的像素点p3
// Parameter: POINT & p4 识别到的纸张的像素点p4
//************************************
int Grab(const char* fileName, int angle, bool beCut, POINT& p1, POINT& p2, POINT& p3, POINT& p4);
//************************************
// Method: GrabFixed 拍照固定裁减
// FullName: CVCamera::GrabFixed
// Access: public
// Returns: int
// Qualifier:
// Parameter: string dstImageFile
// Parameter: int angle
// Parameter: POINT p1
// Parameter: POINT p2
// Parameter: POINT p3
// Parameter: POINT p4
//************************************
int GrabFixed(string dstImageFile, int angle, POINT p1, POINT p2, POINT p3, POINT p4);
//************************************
// Method: IsOpen 标识摄像头是否打开
// FullName: CVCamera::IsOpen
// Access: public
// Returns: bool
// Qualifier:
//************************************
bool IsOpen();
因为最近手上没有摄像头,所以不能贴出运行效果图,等后期补上。
另打开摄像头目前是通过索引来打开的,后面我会加上通过摄像头名称或者摄像头设备的pid,vid来打开。vid pid
USB(Universal Serial BUS,通用串行总线);
VID(Vender ID供应商识别码)和PID(Product ID产品识别码);
每一个USB设备都有VID和PID;
其中,VID是由供应商向USB-IF(Implementers Forum 应用者论坛)申请。每一个供应商的VID是唯一,PID是由供应商自行决定;
主机通过VID和PID来识别不同的设备,根据他们(以及设备的版本号),可以给设备加载或安装相应的驱动程序。
VID和PID的长度都是两个字节。