• openCV第一个lena程序新建运行与详细解说


    openCV第一个lena程序新建运行与详细解说

    作者:吴甜甜 文字配套视频见B站:https://www.bilibili.com/video/av67293028

    完整复制文字请到我的github仓库下载markdown文档 https://github.com/wutiantian/wutiantian.github.io/tree/master/_posts
    博客主页 https://wutiantian.github.io/

    欢迎转载,请注明本处地址与我(吴甜甜)的名字!

    请结合视频再看此文档细节会更清晰


    读懂代码

    头文件

    includeopencv2opencv.hpp

    opencv库的头文件地址:opencvuildincludeopencv2

    该地址下有个特别的文件“opencv.hpp”,包含了openCV各模块的头文件,转到定义

    各种库头文件简介

    【calib3d】——其实就是就是Calibration(校准)加3D这两个词的组合缩写。这个模块主要是相机校准和三维重建相关的内容。基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D信息的重建等等。

    【contrib】——也就是Contributed/Experimental Stuf的缩写, 该模块包含了一些最近添加的不太稳定的可选功能,不用去多管。2.4.8里的这个模块有新型人脸识别,立体匹配,人工视网膜模型等技术。

    【core】——核心功能模块,包含如下内容:
    OpenCV基本数据结构(CvPoint,CvSize,CvScalar等);动态数据结构(CvMemStorage,CvMemBlock等);绘图函数(cvLine,cvRectangle等);数组操作相关函数(cvCreateImage,cvCreateMat等);辅助功能(数据保存和运行时类型信息:CvFileStorage,cvOpenFileStorage等;错误处理和系统函数:cvGetErrStatus,cvAlloc,cvFree等
    )与系统函数和宏;与OpenGL的互操作

    【imgproc】——Image和Processing这两个单词的缩写组合。图像处理模块,这个模块包含了如下内容:
    线性和非线性的图像滤波;图像的几何变换;其它(Miscellaneous)图像转换;直方图相关;结构分析和形状描述;运动分析和对象跟踪;特征检测;目标检测等内容。

    【features2d】 ——也就是Features2D, 2D功能框架 ,包含如下内容:
    特征检测和描述;特征检测器(Feature Detectors)通用接口;描述符提取器(Descriptor Extractors)通用接口;描述符匹配器(Descriptor Matchers)通用接口;通用描述符(Generic Descriptor)匹配器通用接口;
    关键点绘制函数和匹配功能绘制函数

    【flann】—— Fast Library for Approximate Nearest Neighbors,高维的近似近邻快速搜索算法库,包含两个部分:快速近似最近邻搜索;聚类

    【gpu】——运用GPU加速的计算机视觉模块

    【highgui】——也就是high gui,高层GUI图形用户界面,包含媒体的I / O输入输出,视频捕捉、图像和视频的编码解码、图形交互界面的接口等内容。

    【legacy】——一些已经废弃的代码库,保留下来作为向下兼容,包含如下相关的内容:
    运动分析;期望最大化;直方图;平面细分(C API);特征检测和描述(Feature Detection and escription);描述符提取器(Descriptor Extractors)的通用接口;通用描述符(Generic Descriptor Matchers)的常用接口;匹配器

    【ml】——Machine Learning,机器学习模块, 基本上是统计模型和分类算法,包含如下内容:
    统计模型 (Statistical Models);一般贝叶斯分类器 (Normal Bayes Classifier);K-近邻 K-NearestNeighbors);支持向量机 (Support Vector Machines);决策树 (Decision Trees);提升(Boosting);梯度提高树(Gradient Boosted Trees);随机树 (Random Trees);超随机树 (Extremely randomized trees);期望最大化 (Expectation Maximization);神经网络 (Neural Networks)
    MLData

    【nonfree】,也就是一些具有专利的算法模块 ,包含特征检测和GPU相关的内容。最好不要商用,可能会被告哦。

    【objdetect】——目标检测模块,包含Cascade Classification(级联分类)和Latent SVM这两个部分。

    【ocl】——即OpenCL-accelerated Computer Vision,运用OpenCL加速的计算机视觉组件模块

    【photo】——也就是Computational Photography,包含图像修复和图像去噪两部分

    【stitching】——images stitching,图像拼接模块,包含如下部分:
    拼接流水线;特点寻找和匹配图像;估计旋转;自动校准;图片歪斜;接缝估测;曝光补偿;图片混合

    【superres】——SuperResolution,超分辨率技术的相关功能模块

    【ts】——opencv测试相关代码,不用去管他

    【video】——视频分析组件,该模块包括运动估计,背景分离,对象跟踪等视频处理相关内容。

    【Videostab】——Video stabilization,视频稳定相关的组件,官方文档中没有多作介绍,不管它了。

    include

    iostream 是标准输入输出流,如果你的程序中没有输入也没有输出的话,就没有必要加上 #include ,但是对于初学者,输入和输出可以让你明显感觉到在与程序交互。对于高手,也需要标准出错处理,所以输入输出是相当重要的,但不是必须的。

    stdafx.h 到底有什么用

    在新建一个项目的时候,很多时候有stdafx.h,我就在想这个文件究竟是干什么的?

    stdafx.h : 标准系统包含文件的包含文件,或是经常使用但不常更改的;特定于项目的包含文件。

    1.预编译头

    头文件夹下会默认有头文件stdafx.h,而源文件夹下则默认有源文件stdafx.cpp,手动将这些文件删除后,编译时系统还会报错

    stdafx.h并不是标准C++头文件,也就是说,该文件本质上相当于自定义的一个头文件( 这里是VS默认自定义的文件),与项目的源代码文件存放在同一个文件文件夹下,通过#include"stdafx.h"引用;

      从内容上来说,头文件stdafx.h是

      1.包含标准头文件 ,就是这个头文件包含标准C的头文件,例如:stdio.h、string.h这些,这种做法实际在我们项目中很常见,把大部分.c文件需要的头文件,放在一个头文件中,这样只有include这一个头文件就行,省事

      2.包含项目中的不会轻易改动的头文件

    2.预编译头设置

    在项目->属性->c/c++->预编译头,进行设置,

    1.开启、关闭预编译头

    2.改变预编译头的名字,所以并一定用stdafx名字

    3.修改预编译头输出文件的路径

    3.预编译头的原理

    每一次的预编译宏展开和不同的源文件需要包含一些相同头文件,只要某个源文件发生变化,都要重新做一次宏展开,浪费了很多时间,所以引入了预编译头,预编译头一次编译,重复使用,除非有修改

    在编译过程中,stdafx.cpp和stdafx.h文件用于生成一个预编译头文件 project.pch和预编译类型文件stdafx.obj。

    但是预编译头文件包含有众多头文件的处理信息,故而其本身会占用较大的存储空间,故而可以注意清理不需要的预编译头。

    4.关于报错

    1. 无法打开预编译头文件"xxx.pch":no such file or directory 的问题

    分析:根据上面的原理解释,可能是由于编译器无法通过stdafx.cpp创建一个预编译文件,从而其他文件没有办法去引用该pch文件。

    解决方案:选中源文件stdafx.cpp,右键 -> 属性 -> C/C++ -> 预编译头,出现上述问题一般是由于预编译头的选项从 创建 变为了 使用 ,通过将选项重新改为创建可解决问题。

    1. 在查找预编译头文件时遇到意外的文件结尾

    需要将指令#include"stdafx.h" 放在每个文件的开始位置,以供处理。

    命名空间

    OpenCV 中的 C++ 类和函数都是定义在命名空间 CV 之内的,有两种方法可以访问。

    方法 内容
    推荐 代码开头的适当位置加上 using namespace cv;
    麻烦 使用 OpenCV类和函数时,都加入 cv:: 命名空间,这4个字符

    using namespace cv;

    详细包含头文件见“各种库头文件简介”章节

    命名规范

    命名基本原则:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。

    变量命名规则

    前缀写法 类型 描述 实例
    ch char 8位字符 chGrade
    ch TCHAR 如果_UNICODE 定义,则为16位字符 chName
    b BOOL 布尔值 bEnable
    n int 整形(大小依赖于操作系统) nLength
    n UINT 无符号值(大小依赖于操作系统) nHeight
    w WORD 16位无符号值 wPos
    l LONG 32位有符号整形 IOffset
    dw DWORD 32位无符号整形 dwRange
    P * 指针 pDoc
    lp FAR* 远指针 lpszName
    lpsz LPSTR 32位字符串指针 lpszName
    lpsz LPCTSTR 如果_UNICODE定义,则为32位常量字符串指针 lpszName
    h handle Windows对象句柄 hWnd
    lpfn callback 指向CALLBACK函数的远指针 LpfnName

    关键字字母组合

    描述内容 使用的关键字母组合
    最大值 Max
    最小值 Min
    初始化 Init
    临时变量 T(或Temp)
    源对象 Src
    目的对象 Dst

    函数与参数

    函数命名规则

    cvActionTargeMod()

    Action 核心函数
    Targe 目标图像区域(轮廓、多边形)
    Mod 可选变种(变量类型)

    main 函数

    C/C++的main 函数标准写法:

    int main(int argc,char** argv)
    
    

    所以OpenCV 开源视觉库代码中,常有argc和argv的出现。

    arg 指的是“参数”,例如:arguments,argument counter和argument vector.

    argc 和 argv 这两个参数一般在命令行编译程序时有用

    main 函数中 的参数
    参数 argc argv
    表示 argc为整数 *argv[] 字符串数组
    含义 统计运行程序时送给main函数
    命令行参数的个数
    存放指向字符串参数的指针数组
    每一个元素指向一个参数
    默认值为1 各成员含义:
    argv[0]指向程序运行的全路径名
    argv[0]指向在DOS命令行中执行程序名后的第一个字符串
    argv[2]指向执行程序名后的第二个字符串
    argv[argc]为NULL
    • 各个版本的 Visual studio 编译器中,函数体中是否使用 argc 和argv,返回值为 void 或不为 void ,都是合法的

    在 Visual studio 中如果使用 argc 和argv,且没有在 【项目属性】-【配置属性】-【调试】-【命令参数】中指定参数的值,就会报错。这是研究OpenCV官方提供的示例程序时经常碰到的错误。例如:

    Mat srcImage=imread(argv[1],1); //读取字符串名为 argv[1]的图片
    
    替换为
    
    Mat srcImage=imread("1.jpg",1); //工程目录下有一张名为“1.jpg”的图片
    
    

    格式输出 printf() 函数

    printf 函数并非 OpenCV 中的函数,而是标准 C 语言函数,包含在 studio.h 之中。

    只不过 OpenCV 对其也有包含,只需要包含头文件如 opencv.hpp 就可以使用它

    格式字符串 作用
    %d 将整数转成十进制
    %f 将整数转成浮点数
    %u 十进制无符号整数
    %o 将整数转成八进制
    %c 将整数转成对应的 ASCII 字符
    %s 将整数转成字符串
    %x 整数转成小写十六进制
    %X 整数转成大写十六进制
    %p 输出地址符
    %% 输出百分比符号,不进行转换
    规定字符 作用
    换行操作
    f 清屏并换页
    回车
    Tab 符

    官方资料

    官方地址

    官方主页 openCV Github主页 官方论坛 中文openCV论坛,于仕琪
    http://opencv.org https://github.com/opencv https://answers.opencv.org/questions/ http://www.opencv.org.cn

    我的学习书籍

    2014年-2016年 学习的 纸质书
    《学习OpenCV》于仕琪 译 《OpenCV3编程入门》毛星云 《数字图像处理》冈萨雷斯

    随着时间推移,更多版本迭代,电子与纸质资源增加,请观看者以自身实时状况选择合适资料。

    学习资料的使用

    书籍的使用

    • 《OpenCV3编程入门》毛星云,这本书的前半部分是能够帮助新手快速把程序跑起来,到中后期的话,基本没什么用,内容不多。【短期浏览】

    • 《学习OpenCV》于仕琪 译,这本书像砖头的大小,刚开始不要硬啃。拿到手看看目录,随意翻翻。到中后期,遇到原理性问题(非实际程序运行的非具体问题),需要查看原理,需要研读。【中期阅读】

    • 《数字图像处理》冈萨雷斯,这本书前期老师上课讲一讲,学生随便听一听。后期关于业务的本质,解决问题思路的锤炼,需要仔细明白现象本质时需要研读。 【长期阅读】

    书是让我们缩短做笔记的时间,可以将自己的笔记直接记录在对应章节备查!

    电子书的使用

    Learning OpenCV_3rd.pdf 电子书关键字查询

    官方API手册https://docs.opencv.org/

    网站 https://docs.opencv.org/

    下载压缩包,解压后,找到 “index.html”文件即可打开总目录进行查询

    营利性性教学视频

    营利性的视频往往课时较多,且不会直击要点。

    当资源较全较优质可选择、内容较多的情况下,获得知识的速度是:PPT>视频>书。

    觉得有用、有时间就看视频,没有时间就看PPT及代码。

    把书上的东西转变为自己能够理解的内容,需要时间与精力。视频讲解就是引导我们来理解书上的内容,简化了时间与精力。这也是为什么视频需要花钱购买。如果自己能够直接看书理解,大部分人应该是不会去花这部分钱购买课程的。

    如果看视频有不明白的地方,那么有以下几种情况:(1)讲课者能力水平有限,不能在有限时间内把书上内容说明白,甚至把内容像翻译外文书一样翻译错误。这时候可以通过学生提问来解决或者自己找原书来看网上搜索等。(2)知识交叉部分淡薄,例如需要3根鸡腿能饱,但是手头只有1根鸡腿,那么就需要去寻找3根以上鸡腿才行。解决方法基本上是继续(被收割韭菜)买视频或者自己下苦功去把交界处的内容索性再多学一点,不要抱着侥幸心理。

    官方学习课程https://courses.learnopencv.com

    开源教学项目

    https://www.pyimagesearch.com/ 国外的opencv教学网站,有简易答题卡识别

  • 相关阅读:
    令人恼怒!mount windows共享目录出错
    今天修改PCB板图
    在深圳出差
    触摸屏技术原理介绍
    getrlimit和setrlimit函数
    OpenCV下的HelloWorld
    两本OpenCV的书到了
    GDB用法小结
    没搞懂自适应二进制阈值化的参数
    【JavaScript】73 逆序的三位数 (10分)
  • 原文地址:https://www.cnblogs.com/wutiantian/p/11506698.html
Copyright © 2020-2023  润新知