引言

结合冈萨雷斯的《数字图像处理》和Opencv3.0,学习图像处理算法有一段时间了,知道了函数怎么使用,但不知道opencv所用的函数源代码是如何编写的,“知其然,也要知其所以然”,闲暇之日,研究下源代码的编写,纵然不能全部看懂或者掌握,有收获就是好的。

有诗为证,诗曰:

图像处理有本质,二维数组是内涵。

卷积频域来滤波,轮廓分割形态学。

书山有路勤为径,兴趣使然来做舟。

为识庐山真面目,学习源码实践多。

源代码位置

假如你将opencv3.0解压到D:opencv3.0,那么路径为:

D:opencv3.0opencvsources

文件夹modules和samples是我们重点学习的内容。

图 1 源代码和范例存放位置

图1 文件夹存放内容如下。

  • 3rdparty: 包含第三方库,如用视频解码用的 ffmpeg、jpg、png、tiff 等图片的解码库。
  • apps: 包含进行 Haar 分类器训练的工具,OpenCV 进行人脸检测便是基于 Haar 分类器。如果你想检测人脸以外的图片,千万不要错过这几个工具。
  • cmake: 包含生成工程项目时cmake 的依赖文件,只能用于搜索第三方库,普通开发者不需要关心这个文件夹的内容。
  • data: 包含 OpenCV 库及范例中用到的资源文件
  • doc: 包含生成文档所需的源文件及辅助脚本
  • include: 包含入口头文件。OpenCV子文件夹中是C语言风格的API。OpenCV 2 子文件夹中只有一个 opencv.hpp 文件,这是 OpenCV 2 及 OpenCV 3 推荐使用的头文件
  • modules:算法模块的源代码。研究算法的同学 学习的重点!!!
  • platforms: 包含交叉编译所需的工具链及额外的代码,交叉编译指的是在一个操作系统中编译供另一个系统使用的文件。
  • samples:算法用法示例文件夹

重点文件夹:modules和samples。

modules文件夹

modules文件夹存放了如下内容,主要分为CPU模块和CUDA模块。

图2 modules文件夹展开

  1. CPU模块

alib3d: 相机标定及三维重建。相机标定用于取出相机自身缺陷导致的画面形变,还原真实的场景,确保计算的准确性。三维重建通常用在双目视觉(立体视觉),即两个标定后的摄像头观察同一个场景,通过计算两幅画面中的相关性来估计像素深度。

core: 核心功能模块,定义了基本的数据结构,包括最重要的 Mat 类、XML 读写、OpenGL三维渲染等。这个模块应该在入门之后学习。

features2d: 包含 2D 特征值检测的框架。包含各种特征值检测器及描述子,如 FAST、MSER、OBRB、BRISK 等。各类特征值拥有统一的算法接口,因此在不影响程序逻辑的情况下可以替换替换。

flann: 用于在多维空间内聚类及搜索的近似算法,做图像检索的开发者对它不会陌生。

highgui: 高级图形界面,包括用户界面、Qt。

imgcodecs:对图像文件编解码、读写操作

imgproc: 全称为 Image Processing,即图像处理,包括图像滤波、集合图像变换、直方图计算、形状描述子等。图像处理是计算机视觉的重要工具,重点学习。

ml: 全称为 Machine Learning,即机器学习。包括统计模型、K 最近邻、支持向量机、决策树、神经网络等经典的机器学习算法。

objdetect:物体检测模块,包括 Haar 分类器、SVM 检测器及文字检测。

photo: 计算摄影学,包括图像修补、去噪、HDR 成像、非真实感渲染等。如果读者想实PS的高级功能,那么这个模块必不可少。

shape: 形状匹配算法模块,用于描述形状、比较形状。

stitching: 图像拼接,可用于制作全景图。

superres: 全称为 Super Resolution,用于增强图像的分辨率。

video: 视频分析模块,包括背景提取、光流跟踪、卡尔曼滤波等,做视频监控的开发者会经常使用这个模块。

videoio:视频编解码、读写操作

videostab: 全称为Video Stabilization,用于解决相机移动拍摄时视频不够稳定的问题。

viz: 三维可视化模块。可以认为这个模块实现了一个简单的三维可视化引擎,有各种 UI 空间和键盘、鼠标交互方式。底层实现基于 CTK 这个第三方库。

2.CUDA模块

• cuda: CUDA- 加速的计算机视觉算法,包括数据结构 cuda::GpuMat、基于 cuda 的相机标定及三维重建等。

• cudaarithm: CUDA- 加速的矩阵运算模块。

• cudabgsegm: CUDA- 加速的背景分割模块,通常用于视频监控。

• cudacodec: CUDA- 加速的视频编码与解码。

• cudafeatures2d: CUDA- 加速的特征检测与描述模块,与 features2d/ 模块功能类似。

• cudafilters: CUDA- 加速的图像滤波。

• cudaimgproc: CUDA- 加速的图像处理算法,包含直方图计算、霍夫变换等。

• cudaoptflow: CUDA- 加速的光流检测算法。

• cudastereo: CUDA- 加速的立体视觉匹配算法。

• cudawarping: 实现 CUDA- 加速的快速图像变换,包括透视变换、旋转、改变尺寸等。

samples文件夹

android: Android 平台的范例。既有完全是 Java 的工程,也有完全是 C++ 的工程,也有更为常见的 Java 与 C++ 共存的工程。

• cpp: 由于 OpenCV 是一款 C++ 库,因此 C++ 的返利是最多的,后面将重点介绍。

• data: 示例程序要用到的数据

• directx: directx (d3d) 是微软的私有三维图像 API,这个文件夹中的范例覆盖了 d3d9、d3d10、d3d11.

• gpu: 利用 cuda 加速的范例。

• java: OpenCV 3 官方支持 Java 语言绑定,因此这里演示如何使用 Java 版本的 OpenCV。

• python: OpenCV 3 官方支持 Python 语言绑定,因此这里演示使用 Python 2 版本的范例。

• tapi: tapi 是OpenCV 3 的一个新特性,使用 cv::UMat 替代cv::Mat,实现 CPU 和 GPU 的运算使用统一的接口,不再需要显式地在 CPU 和 GPU 之间传递数据,方便开发人员。

• winrt: Windows RT 平台的范例,开发语言是微软的 C++ “方言”.

.cpp文件功能汇总(压轴戏登场)

以sample文件夹为例

•tutorial_code/: opencv教程代码

• 3calibration.cpp: 同时标定三台水平放置的相机。

• bagofwords_classification.cpp: 使用图像检测实现简易的图像搜索功能。

• bgfg_gmg.cpp: 演示GMG 背景检测算法的使用方式。

• bgfg_segm.cpp: 演示高斯混合背景检测算法的使用方式。

• brief_match_test.cpp: 使用 BRIEF 特征值来匹配两张图像。

• build3dmodel.cpp: 演示如何使用基础矩阵和特征值来创建三维模型。

• calibration.cpp: 完整的多用途标定程序。

• calibration_artificial.cpp: 在程序中生成一个虚拟的相机,并进行标定。

• camshiftdemo.cpp: 读取实时的摄像头数据,并演示基于均值偏移算法的视频跟踪。

• chamfer.cpp: 使用Chamfer 算法匹配两副边缘图像。

• cloning_demo.cpp: 命令行模式的图像克隆。

• cloning_gui.cpp: 图形界面交互的图像克隆。

• connected_components.cpp: 查找并绘制图像中的连通区域。

• contours2.cpp: 查找并绘制图像中的轮廓。

• convexhull.cpp: 查找并绘制由点的集合组成的凸包。

• cout_mat.cpp: 使用cout 来输出各种格式化的 Mat 对象。

• create_mask.cpp: 演示如何创建黑白掩码图像。

• dbt_face_detection.cpp: 基于检测的人脸跟踪代码。

• delaunay2.cpp: 通过鼠标交互式地生成 Delaunay 三角形。

• demhist.cpp: 演示直方图的用法。

• descriptor_extractor_matcher.cpp: 演示 features2d 检测框架的用法。

• detection_based_tracker_sample.cpp: 与 dbt_face_detection.cpp 类似。

• detector_descriptor_evaluation.cpp: 评估各种特征检测器和描述子。

•detector_descriptor_matcher_evaluation.cpp:评估各种特征检测器和匹配器。

• dft.cpp: 演示一幅图像的离散傅里叶变换。

• distrans.cpp: 显示边缘图像的距离变换值。

• drawing.cpp: 演示绘画和文字显示功能。

• edge.cpp: 演示Canny 边缘检测。

• em.cpp: 对随机生成的数据点进行 EM 聚类。

• fabmap_sample.cpp: 演示 FAB-MAP 图像检索算法。

• facerec_demo.cpp: 人脸识别。

• fback.cpp: 实时的Farneback 光流跟踪。

• ffilldemo.cpp: 演示 floodFill() 像素填充算法。

• filestorage.cpp: 演示序列化到外部文件,如yml、xml等。

• fitellipse.cpp: 将轮廓点匹配到椭圆。

• freak_demo.cpp: 演示 FREAK 特征值的用法。

• gencolors.cpp: 演示 generateColors()。

• generic_descriptor_match.cpp: 基于 SURF 的两幅图像间的匹配。

• grabcut.cpp: 演示GrabCut 分割算法。

• houghcircles.cpp: 用霍夫算法检测圆。

• houghlines.cpp: 用霍夫算法检测直线。

• hybridtrackingsample.cpp: 混合跟踪算法(Hybrid Tracker)的演示。

• image.cpp: 来回转换cv::Mat 和 IplImage。

• image_alignment.cpp: 演示 findTransformECC() 函数。

• image_sequence.cpp: 使用 VideoCapture 对象读取序列帧。

• imagelist_creator.cpp: 创建图像列表到 xml 文件。

• inpaint.cpp: 使用鼠标交互地进行图像修补。

• intelperc_capture.cpp: Intel 感知计算设备相关的函数。

• kalman.cpp: 使用卡尔曼滤波进行二维跟踪。

• kmeans.cpp: Kmeans 聚类算法的演示。

• laplace.cpp: 拉普拉斯边缘检测。

• latentsvm_multidetect.cpp: latentSVM 检测器。

• letter_recog.cpp: 字母识别。

• linemod.cpp: 基于OpenNI 的体感设备应用。

• lkdemo.cpp: 演示Lukas-Kanade光流法。

• logpolar_bsm.cpp: 演示 LogPolar 盲点模型。

• lsd_lines.cpp: LSD 线段检测。

• matcher_simple.cpp: SURF 特征检测。

• matching_to_many_images.cpp: 一对多的特征检测。

• meanshift_segmentation.cpp: 演示基于均值漂移的色彩分割函数——meanShiftSegmentation()

• minarea.cpp: 寻找最小包围盒、包围圆

• morphology2.cpp: 形态学图像处理

• npr_demo.cpp: 演示各种非真实感渲染效果

• opencv_version.cpp: 输出 OpenCV 库的版本号

• openni_capture.cpp: 演示 OpenNI 相关的体感设备

• pca.cpp: 基于 PCA 的人脸识别

• peopledetect.cpp: 基于 cascade 或 hog 进行物体(人)检测

• phase_corr.cpp: 演示 phaseCorrelate() 函数

• points_classifier.cpp: 演示各种机器学习算法

• segment_objects.cpp: 实时地在视频或相机画面中检测前景物体

• select3dobj.cpp:在一个有标定棋盘的桌子上,使用3D Box标记一个对象,在所有序列帧中,只要照相机可以看到棋盘,就可以跟踪对象,并用Box分割对象

• shape_example.cpp: 比较并检索形状

• shape_transformation.cpp: 用 SURF 特征值检测形状并进行变换

• squares.cpp: 检测图像中的方块形状。

• starter_imagelist.cpp: 加载一个ImageList(由imagelist_creator.cpp产生)

• stereo_calib.cpp: 双目视觉的标定

• stereo_match.cpp: 计算左右视觉的图像的差异,生成点云文件。

• stitching.cpp: 演示图像拼接算法。

• stitching_detailed.cpp: 演示更多参数的图像拼接算法。

• train_HOG.cpp: 训练 HOG 分类器

• tree_engine.cpp: 演示如何使用不同的决策树和森林包括Boosting和随机树

• videostab.cpp: 演示 videostab 中各个参数的用法。

• watershed.cpp: 演示著名的分水岭图像分割算法。

结语

编程本就是一个练习加总结的过程,不善于总结的编程人员不是一个好工程师。

研读源代码,既可以学习专家们的编程技巧(借以对C++再次学习),然后结合对函数的调用,理解是不是更深刻一点?

java 图像刺绣算法_图像处理:OpenCV3源代码文件解析相关推荐

  1. OpenCV3源代码目录解析(算法模块解析 和 示例目录解析)

    OpenCV3源代码文件夹sources: • 3rdparty: 包含第三方库,如用视频解码用的 ffmpeg.jpg.png.tiff 等图片的解码库. • apps: 包含进行 Haar 分类器 ...

  2. java 哈希算法_选择Java密码算法第1部分-哈希

    java 哈希算法 抽象 这是涵盖Java加密算法的三部分博客系列文章的第1部分. 该系列涵盖如何实现以下功能: 使用SHA–512散列 使用AES–256的单密钥对称加密 使用RSA–4096的公钥 ...

  3. java.policy无法修改_如何配置Policy文件进行Java安全策略的设置

    中国人最喜欢访问的网站 只要注册ofo就送你10块钱,还等什么,快来注册吧 Java语言具有完善的安全框架,从编程语言.编译器.解释程序到Java虚拟机,都能确保Java系统不被恶意的代码或敌对的编译 ...

  4. java 生成.pcap_java抓包后对pcap文件解析示例

    这是自己写的简单的解析pcap文件,方便读取pcap文件,大家参考使用吧 复制代码 代码如下: InputStream is = DataParser.class.getClassLoader().g ...

  5. java opencv磨皮算法_美肤磨皮算法OpenCV3实现

    参考一个大神的美肤公式: Dest =(Src * (100 - Opacity) + (Src + 2 * GuassBlur(EPFFilter(Src) - Src + 128) - 256) ...

  6. java 图像梯度检测_数字图像处理-边缘检测

    梯度介绍 首先介绍边缘检测中用到的高等数学原理---梯度.介绍梯度,离不开方向导数. 方向导数 顾名思义,方向导数就是某个方向上的导数. 什么是方向: 函数 在这个方向上的图像: 我们知道: 函数 的 ...

  7. python图像融合算法_图像融合质量评价方法的python代码实现——MS-SSIM

    图像融合质量评价方法的python代码实现--MS-SSIM 图像融合质量评价方法的python代码实现--MS-SSIM 文章目录 1 前言 2 MS-SSIM介绍 2 MS-SSIM的代码 2.1 ...

  8. 图像处理 图像相似算法aHash、dHash、pHash解析与对比

    某个角落,一个人,一杯酒.他看不清周遭,也没人记得住他.城市偌大,从来不缺孤单的人,离乡背井,迷失在霓虹深处.好在有天地万物与他作伴,他们或指引或守护,让他能一直记住出发以前的自己.--毛不易< ...

  9. java图像检索的算法_图像检索:几种基于纹理特征的图像检索算法

    本文节选自<基于纹理的图像检索算法研究>.描述了几种基于纹理特征的图像检索算法. 第 3 章基于纹理特征的图像检索 3.2 基于灰度共生矩阵的纹理分析法 灰度共生矩阵是分析纹理特征的一种有 ...

最新文章

  1. Code:blocks 调试经历,调试成功这其一
  2. python字符编码导致dict中key不同
  3. Interview:算法岗位面试—11.15下午上海某航天***公司(国企)技术面之工业机器视觉认知、计算机视觉算法的理解、目标检测相关项目案例
  4. 中国移动短信网关CMPP3.0 C#源代码:CMPP30类(1)(转)
  5. 【精简解释】Java中native关键字作用
  6. python 扯线木偶_Python计算器求助~求大神指导~QAQ急!
  7. python中不属于整数类型_哪个选项不是Python语言的整数类型?
  8. 微信小程序---实现输入手机验证码功能
  9. Objective-C中的@Property详解
  10. ubuntu挂载共享文件
  11. 实现CTF智能合约题目的环境部署
  12. MySQL递归查询 三种实现方式
  13. Mac安装JDK1.8及环境变量配置
  14. Win10系统如何通过备忘录的日历设定定时提醒实现日程计划和提醒
  15. 【Linux】编辑器vim的育婴式教程(勉强够用)
  16. CSDN常见问题汇总
  17. 游戏建模师的现状如何?
  18. Lind.DDD.Paging分页模块介绍
  19. wmiprvse.exe进程
  20. 云原生SaaS软件服务与开源框架

热门文章

  1. Swift 新特性 - 访问控制(Access Control)
  2. error LNK2001: 无法解析的外部符号 __imp__Shell_NotifyIconA@8
  3. POJ3041Asteroids(二分图最少顶点覆盖)
  4. wince 6.0 嵌入式开发指导
  5. ASP.NET开发:在用户控件中添加属性
  6. 674 Longest Continuous Increasing Subsequence(每日一题)
  7. win11 WSL centos7安装docker命令整理
  8. linux shell字符串及字符串长度获取方式
  9. CDH HUE集成MySQL
  10. cordova降低版本10.0.0为8.1.2