• 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()  计算反向投影

  • 相关阅读:
    Swift学习二
    Swift学习一
    iOS--点击地图上某一点获取该点的经纬度
    iOS--新特性一览
    搭建LNAMP环境(三)- 源码安装Apache2.4
    搭建LNAMP环境(四)- 源码安装PHP7
    搭建LNAMP环境(五)- PHP7源码安装Redis和Redis拓展
    搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展
    搭建LNAMP环境(七)- PHP7源码安装Memcached和Memcache拓展
    PHP安装mysql.so扩展
  • 原文地址:https://www.cnblogs.com/larry-xia/p/9614780.html
Copyright © 2020-2023  润新知