opencv基础
..\opencv\build\include\opencv目录下为旧版的头文件,为opencv1.0中最核心的,保留下来的头文件。
..\opencv\build\include\opencv2目录下为新版OpenCV2系列头文件。
OpenCV中的C++类和函数都位于命名空间cv中
OpenCV配置:
- 配置环境变量,系统变量PATH中添加opencv dll路径
- 设置头文件目录,VS属性管理器-->VC++目录-->包含目录添加opencv\build\include,opencv\build\include\opencv,opencv\build\include\opencv2
- 设置工程库lib目录,VS属性管理器-->VC++目录-->库目录添加opencv\build\x64\vc14\lib
- 设置链接库,VS属性管理器-->链接器-->输入-->附件依赖项 添加opencv_world331d.dll或者opencv_world331.dll
cv::Exception异常类,继承自标准std::Exception. CV_Error(errCode,description)宏抛出异常,CV_Assert(condition),CV_DbgAssert(condition)
opencv计时函数 cv::getTickCount(),cv::getTickFrequency()
double t = (double)getTickCount(); // do something ... t = ((double)getTickCount() - t)/getTickFrequency(); cout << "Times passed in seconds: " << t << endl;
Scalar类
Scalar类表示具有4个元素的数组,在OpenCV中被大量用于传递像素值,如RGB颜色值。如Scalar(a,b,c)分别制定蓝色分量为a,绿色分量为b,红色分量为c
typedef Scalar_<double> Scalar;
Size类
Size类可表示图片或者矩形的尺寸。
typedef Size_<int> Size2i;
typedef Size_<int64> Size2l;
typedef Size_<float> Size2f;
typedef Size_<double> Size2d;
typedef Size2i Size;
通道分离、混合
split() 用于将一个多通道数组分离为几个单通道数组
Mat srcImg = imread("1.jpg"); vector<Mat> channels; split(srcImg, channels);
merge() 将多个数组合并为一个多通道的数组
for (int i=0;i<g_srcImage.rows;++i) //图像对比度亮度调整 { for (int j=0;j<g_srcImage.cols;++j) { for (int c=0;c<3;++c) { g_dstImage.at<Vec3b>(i, j)[c] = saturate_cast<uchar>((g_ContrastValue*0.01)*g_srcImage.at<Vec3b>(i, j)[c]) + g_Brightness; } } }
imgproc组件
imgproc组件是Image和Process的缩写组合,即图像处理模块。包含图像滤波、几何变换、图像转换、直方图相关、结构分析和形状描述、运动分析和对象追踪、特征检测以及目标检测等内容。
线性滤波:
方框滤波boxFilter(),当normalize参数为true时,方框滤波即变为我们熟悉的均值滤波。
均值滤波 blur(),均值滤波存在固有的缺陷,不能很好的保护图像的细节,在图像去噪的同时也破坏了图像的细节成分。
高斯滤波 GaussianBlur(),支持就地过滤。
非线性滤波:
中值滤波medianBlur()
双边滤波bilateralFilter()
形态学操作
腐蚀erode(),膨胀dilate(),一般使用getStructuringElement()函数返回指定形状和尺寸的结构元,其中结构元形状可以为矩形MORPH_RECT,交叉型MORPH_CROSS和椭圆形MORPH_ELLIPSE
开运算open(),为先腐蚀后膨胀的过程。可以消除小物体,在纤细处分离物体,在平滑较大物体边界的同时不改变其面积。
闭运算close(),为先膨胀后腐蚀的过程。可以填充小孔洞。
形态学梯度是膨胀与腐蚀之差。
顶帽操作tophat(),为原图像与开运算结果之差。
黑帽操作blackhat(),为闭运算结果与原图像之差。
轮廓检测
findContours() 寻找轮廓,输入为二值图像,
drawContours() 绘制轮廓
vector<vector<Point>> g_vContours;
vector<Vec4i> g_vHierarchy;
// 用Canny算子检测边缘 Canny(g_grayImage, g_cannyMat_output, g_nThresh, g_nThresh * 2, 3); // 寻找轮廓 findContours(g_cannyMat_output, g_vContours, g_vHierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0)); // 绘出轮廓 Mat drawing = Mat::zeros(g_cannyMat_output.size(), CV_8UC3); for (int i = 0; i < g_vContours.size(); i++) { Scalar color = Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));//任意值 drawContours(drawing, g_vContours, i, color, 1, 8, g_vHierarchy, 0, Point()); }
反向投影
反向投影:opencv docs给出的概念是“一种记录给定图像中的像素点如何适应直方图模型像素分布的方式"。
backproject是直接取直方图中的值,即以灰度为例,某种灰度值在整幅图像中所占面积越大,其在直方图中的值越大,backproject时,其对应的像素的新值越大(越亮),反过来,某灰度值所占面积越小,其新值就越小。
反向投影常用的用途是:查找指定特征,backproject的基本过程是:
1. 拿到 特征图像 (或模板图像)
2. 得到 特征图像的直方图
3. 拿到源图像,依据源图像的每个像素的值,在特征图像的直方图中找到对应的值,然后将直方图的值赋给新的图像,backproject算法就完成了。
calcBackProject() 计算反向投影