opencv基础

..opencvuildincludeopencv目录下为旧版的头文件,为opencv1.0中最核心的,保留下来的头文件。

..opencvuildincludeopencv2目录下为新版OpenCV2系列头文件。

OpenCV中的C++类和函数都位于命名空间cv中

OpenCV配置:

  1. 配置环境变量,系统变量PATH中添加opencv dll路径
  2. 设置头文件目录,VS属性管理器-->VC++目录-->包含目录添加opencvuildinclude,opencvuildincludeopencv,opencvuildincludeopencv2
  3. 设置工程库lib目录,VS属性管理器-->VC++目录-->库目录添加opencvuildx64vc14lib
  4. 设置链接库,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()  计算反向投影

原文地址:https://www.cnblogs.com/larry-xia/p/9614780.html