目录
二、使用vector容器时提示“error C2065:"vector":未声明的标识符”系列错误
第一章、认识OpenCV
-
1.1、周边概念认知
-
1.2、基本架构分析
- 【calib3d】----相机校准和三维重建相关内容,包括基本的多视角几何算法、单个立体摄像头标定、物体姿态估计、立体相似性算法、3D信息重建。
- 【contrib】----新增了新型人脸识别、立体匹配、人工视网膜模型等技术
- 【core】----核心功能
- OpenCV基本数据结构
- 动态数据结构
- 绘图函数
- 数组操作相关函数
- 辅助功能与系统函数和宏
- 与OpenGL的互操作
- 【imgproc】----图像处理模块
- 线性和非线性的图像滤波
- 图像的几何变换
- 其他图像变换
- 直方图相关
- 结构分析和形状描述
- 运动分析和对象跟踪
- 特征检测
- 目标检测等
- 【features2d】----2D功能模块
- 特征检测和描述
- 特征检测器通用接口
- 描述符提取器通用接口
- 描述符匹配器通用接口
- 通用描述符匹配器通用接口
- 关键点绘制函数和匹配功能绘制函数
- 【flam】----高危的近似近邻快速搜索算法库
- 快速近似最近邻搜索
- 聚类
- 【gpu】----运用GPU加速的计算机视觉模块
- 【highgui】----高层GUI图像用户界面,包含媒体的输入输出、视频捕捉、图像和视频的编码解码、图像交互界面的接口
- 【legacy】----一些已经废弃的代码库,向下兼容
- 运动分析
- 期望最大化
- 直方图
- 平面细分
- 特征检测和描述
- 描述符提取器
- 通用描述符
- 匹配器
- 【ml】----机器学习模块
- 统计模型
- 一般贝叶斯分类器
- K-近邻
- 支持向量机
- 决策树
- 提升
- 梯度提高树
- 随机树
- 超随机树
- 期望最大化
- 神经网络
- MLData
- 【nonfree】----一些具有专利的算法模块,包含特征检测和GPU相关的内容,不要商用
- 【objdetect】----目标检测模块,级联分类和Latent SVM
- 【ocl】----运用OpenCL加速的计算机视觉组件模块
- 【photo】----图像修复和图像去噪
- 【stitching】----图像拼接模块
- 拼接流水线
- 特点寻找和匹配图像
- 估计旋转
- 自动校准
- 图片歪斜
- 接缝估测
- 曝光补偿
- 图片混合
- 【superres】----超分辨率技术的相关功能
- 【ts】----测试相关代码,不用去管
- 【video】----视频分析组件,包括运动估计、背景分离、对象跟踪等视频处理相关内容
- 【videostab】----视频稳定相关的组件,不用管
-
1.3、常见异常
- opencv3加入了一个名为opencvcontrib的仓库,脸部识别、文本检测、文本识别、新的边缘检测器、图像修复、深度地图处理、新的光流和追踪算法
- opencv2到opencv3代码升级的错误
-
一、由于宏名称的变更造成的“未声明的标识符”:
- 有时候可以加一句"#include<cv.h>"。
- 症状:error C2065:'CVWIDOWAUTOSIZE':未声明的标识符系列错误。
- 分析:opencv3取消了opencv1中残留的CV,式的宏前缀命名规范,有几种情况讨论
- 1、直接去掉:CV前缀。
- namedWindow函数中,将CVWINDOWAUTOSIZE改为WINDOWAUTOSIZE
- threshold函数中,将CVTHRESHBINARY 改为THRESHBINARY
- line函数等一系列绘图函数中,CVFILLED改为FILLED
- remap函数中。CVINTERLINEAR改为INTERLINEAR
- 在鼠标操作函数SetMouseCallback中,将CVEVENTLBUTTONUP改为EVENTLBUTTONUP、CVEVENTLBUTTONDOWN 改为 EVENTLBUTTONDOWN、CVEVENTFLAGLBUTTON改为EVENTFLAGLBUTTON、CVEVENTMOUSEMOVE改为EVENTMOUSEMOVE
- HoughCircles函数中,将CVINPAINTTELEA改为INPAINTTELEA、CVINPAINTNS写作INPAINTNS
- inpaint函数中,将 CVINPAINTTELEA改为 INPAINTTELEA、CVINPAINTNS写作 INPAINTNS。
- 9) matchTemplate函数中,将CVTMSQDIFF改为TMSQDIFF、CVTMSQDIFFNORMED改为TMSQDIFFNORMED。
- 10)在imwrite函数相关使用中,将CVIMWRITEPNGCOMPRESSION改成IMWRITEPNGCOMPRESSION。
- 11)设置摄像头尺寸的时候,将 CVCAPPROPFRAMEWIDTH 改为CAPPROPFRAMEWIDTH、CVCAPPROPFRAMEHEIGHT改为CAPPROP FRAME HEIGHT。
- 2、需要使用新的前缀替换
- 1) line函数等一系列绘图函数中,CVAA改为LINEAA
- 2 ) cvtColor函数中颜色空间转换系的宏,全替换为“COLOR”前缀,如CVBGR2HSV 改为COLORBGR2HSV
- 3)normalize函数中,将CV MINMAX改为NORMMINMAX。
- 4) morphologyEx函数中的宏,全部替换为“MORPH”前缀,如CVMOPOPEN改为MORPHOPEN。
- 5 ) threshold 函数中的宏,全部替换为“THRESH”前缀,如将CVTHRESHBINARY 改THRESH BINARY
- 3、需要在新的命名空间中使用宏
- 1) TermCriteria函数中,CVTERMCRITEPS 改为TermCriteriaEPS、CVTERMCRITITER改为TermCriteria:MAXITER
- 2) CascadeClassifier.:.detectMultiScale函数中,CVHAARSCALEIMAGE改为CASCADESCALEIMAGE。
- 1、直接去掉:CV前缀。
-
二、使用vector容器时提示“error C2065:"vector":未声明的标识符”系列错误
- 症状:在opencv3的环境下运行opencv2的程序,使用了vector容器,而未包含STD命名空间,于是会报此错误
- 分析:opencv3中并没有在头文件使用标准程序库std的命名空间。在开头加一句"using namespace std"
-
三、其他问题解决方案
- 1)features2d. hpp头文件路径的更改。将#include <opencv2/nonfree/features2d.hpp>改为#include<opencv2/features2d.hpp>
- 2) core.hpp头文件路径更改。将#include<opencv2/core/core.hpp>改为#include<opencv2/core.hpp>
- 3)用format进行格式化输出时,将 format(r,"python")改成format(r,FormatterFMTPYTHON)。
- 4)定义尺寸时,将cvSize(-1,-1)改为Size(-1,-1)。
- 5)在表示颜色时,将CVRGB改为Scalar。
-
-
1.4、安装
- 运行测试代码可能遇到的问题
- 找不到core.hinclude的时候包含错误
- 无法解析的外部命令编译器和配置文件要一致
- 形如--error LNK2005:xxx已经在msvcrtd.lib(MSVCR9OD.dIl)中定义把静态库不包含就好了
- 应用程序无法正常启动0xc000007b这是Lib包含的问题
- 图片路径是对的加载不出来,指针越界,有未经处理的异常是lib文件带d和不带d的附加依赖项的问题,
- 无法打开文件“opencvml249d.lib”系列的错误包含的库目录和附加依赖项不能相互对应造成的
- 修改包含目录
- D:\opencv3\opencv\build\include
D:\opencv3\opencv\build\include\opencv
D:\opencv3\opencv\build\include\opencv2
- D:\opencv3\opencv\build\include
- 修改库目录
- D:\opencv3\opencv\build\x64\vc14\lib
- 修改附加依赖项
- opencv安装目录下build\x64\vc14\lib文件夹下的opencv_world346d.lib
- 运行测试代码可能遇到的问题
-
1.5、上手opencv
- 图像显示
-
#include<opencv2/opencv.hpp> #include<iostream> using namespace cv; int main(int argc, char** argv) { Mat src = imread("D:/photo/1.png"); if (src.empty()) { printf("没有读取到图片。"); return -1; } namedWindow("测试opencv", CV_WINDOW_AUTOSIZE); imshow("测试opencv", src); waitKey(0); return 0; }
-
- 图像腐蚀
-
#include<opencv2/opencv.hpp>//模块头文件 #include<opencv2/imgproc/imgproc.hpp>//图像处理头文件 using namespace cv; int main() { Mat srcImage = imread("D:/photo/2.png"); imshow("【原图】腐蚀操作", srcImage); //进行腐蚀操作 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); Mat dstImage; erode(srcImage, dstImage, element); imshow("【效果图】", dstImage); waitKey(0); return 0; }
-
- 图像模糊
-
#include"opencv2/highgui/highgui.hpp" #include"opencv2/imgproc/imgproc.hpp" using namespace cv; int main() { Mat srcImage = imread("D:/photo/2.png"); imshow("【原图】均值滤波", srcImage); //进行模糊操作 Mat dstImage; blur(srcImage, dstImage, Size(7,7)); imshow("【效果图】", dstImage); waitKey(0); return 0; }
-
- canny边缘检测
-
#include<opencv2/opencv.hpp>//模块头文件 #include<opencv2/imgproc/imgproc.hpp>//图像处理头文件 using namespace cv; int main() { Mat srcImage = imread("D:/photo/5.png"); imshow("【原图】canny边缘检测", srcImage); Mat dstImage, edge, grayImage;//参数定义 //1、创建与src同类型和大小的矩阵(dst) dstImage.create(srcImage.size(), srcImage.type()); //2、将原图转换为灰度图 cvtColor(srcImage, grayImage, COLOR_BGR2GRAY); //3、先使用3x3内核来降噪 blur(grayImage, edge, Size(3, 3)); //4、运行canny算子 Canny(edge, edge, 3, 9, 3); //5、显示效果图 imshow("【效果图】canny边缘 检测", edge); waitKey(0); return 0; }
-
- 图像显示
- 1.6、视频操作基础
- 读取并播放视频
-
#include<opencv2/opencv.hpp> using namespace cv; int main() { VideoCapture capture("D:/photo/1.mp4"); //循环显示每一帧 while (1) { Mat frame;//定义一个mat变量,用于存储每一帧的图像 capture >> frame;//读取当前帧 imshow("读取视频", frame); waitKey(30);//延时30ms } return 0; }
-
- 调用摄像头采集图像
-
#include<opencv2/opencv.hpp> using namespace cv; int main() { //从摄像头读入视频 VideoCapture capture(0); //循环显示每一帧 while (1) { Mat frame; //定义一个Mat变量,用于存储每一帧的图像 capture >> frame;//读取当前帧 imshow("读取视频", frame);//显示当前帧 waitKey(30); } return 0; }
-
- 读取并播放视频