OpenCV基础
文章平均质量分 80
梧桐栖鸦
opencv系列教程代码已上传至github:https://github.com/keithMaybe/code/tree/master/opencv
以后更新会继续上传
CUDA、Python、ML努力填坑中>>>
展开
-
opencv学习(四十)之寻找图像轮廓findContours()
1.概述在这篇文章中介绍如何使用findContours()函数寻找图像中物体的轮廓,在OpenCV中没有给出findCountours()函数的原理,如果想了解查找轮廓原理,可以翻**墙出去Google”Topological structural analysis of digitized binary images by border following”,这里就不一一翻译了.2.APIope原创 2017-04-15 16:29:46 · 87456 阅读 · 2 评论 -
opencv学习(三十)之设计线性滤波器filter2D
前面在介绍高斯滤波器的时候我们提到是使用高斯滤波模板kernel与原图像卷积以达到滤波的效果。通常来讲,卷积操作发生于图像的每一个部分与kernel进行卷积运算,kernel就是一个含有锚点的常数数字,这个锚点通常位于kernel的中心位置。如下图所示:kernel是怎么进行卷积运算的的?假设你想知道图像特定位置的像素经过与kernel卷积运算后的值,遵循以下步骤: (1). 将kerne原创 2017-01-20 16:08:09 · 5294 阅读 · 0 评论 -
opencv学习(二十八)之基本图像阈值操作threshold
在二维数字图像中,其每个像素点对应了不同的像素值,其像素值各不相同。可以对像素值特定范围内的图像图像进行操作,划分这个范围的值就被称为图像阈值,它不是一个固定的量级,是根据每幅图像和处理要求动态改变。例如我们可以从图像中利用阈值分割出我们需要的部分,利用其像素值与背景在灰度特性上的差异,图像具有了不同的灰度等级,可据此指定一个合理的阈值从而确定图像中的像素值是否属于这个区域。所以其是像素操作的一种原创 2017-01-20 11:06:08 · 19745 阅读 · 1 评论 -
opencv学习(二十九)之灰度图转化为二值图adaptiveThreshold
针对图像的阈值操作,opencv除了提供threshold函数也提供了adaptiveThreshold()函数,从字面意思可以翻译为自适应阈值操作,函数的主要功能是将灰度图转化为二值图像。其函数原型如下:void cv::adaptiveThreshold ( InputArray src, OutputArray dst, double maxValue, int原创 2017-01-20 12:12:05 · 6578 阅读 · 0 评论 -
opencv学习(二十七)之图像缩放函数resize
上一篇介绍了分别利用高斯金字塔和拉普拉斯金字塔结合opencv提供的pyrDown和pyrUp函数实现了图像的缩放,opencv还提供了另外一种图像缩放函数resize()实现对输入图像缩放到指定大小,其函数原型如下:void cv::resize ( InputArray src, OutputArray dst, Size dsize, double fx =原创 2017-01-20 10:54:53 · 31889 阅读 · 1 评论 -
opencv学习(二十六)之图像金字塔(高斯金字塔、拉普拉斯金字塔)
在进行数字图像处理时,我们可能会需要将某种尺寸的图像转换为其他尺寸的图像,这样会存在放大图像核缩小图像两种可能。opencv提供了一个真正意义上的图像所方函数resize(),但在本篇中主要学习以下使用图像金字塔进行图像的所方,图像金字塔是视觉运用较为广泛的一项技术。 一个图像金字塔是一系列图像的集合,所有图像来源于同一张原始图像,通过梯次向下采样获得,直到达到某个终止条件才停止采样。通常有两种类原创 2017-01-17 23:51:07 · 11753 阅读 · 0 评论 -
opencv学习(十九)之均值滤波blur
从本篇开始采用opencv3.2版本进行编译!!!均值滤波是一种典型的线性滤波算法,主要是利用像素点邻域的像素值来计算像素点的值。其具体方法是首先给出一个滤波模板kernel,该模板将覆盖像素点周围的其他邻域像素点,去掉像素本身,将其邻域像素点相加然后取平均值即为该像素点的新的像素值,这就是均值滤波的本质。官方给出的kernel模板如下: opencv提供了blur函数实现均值滤波操作,其原型原创 2017-01-12 22:32:01 · 19196 阅读 · 0 评论 -
opencv学习(二十五)之开运算、闭运算、形态梯度、顶帽、黑帽
上一篇介绍了形态学的基本操作膨胀和腐蚀,我们这一篇将利用膨胀和腐蚀操作实现对图像更高级的形态学操作,而这些都是建立在膨胀和腐蚀操作基础之上。 首先形态学的主要用途是获取物体拓扑和结果信息,它通过物体和结构元素的某些运算,得到物体更本质的形态,在图像处理中的主要应用有: (1). 利用形态学的基本运算对图像进行观察和处理,从而达到改善图像质量的目的 (2). 描述和定义图像的各种几何参数和特征如原创 2017-01-17 11:51:35 · 20759 阅读 · 0 评论 -
opencv学习(二十四)之腐蚀与膨胀
腐蚀和膨胀是对二维图片的进行操作的形态学运算,简单来讲形态学操作就是基于形状的一系列图像处理操作,通过将结构元素作用于输入图像来产生输出图像。腐蚀(Erosion)和膨胀(Dilation)是最基本的形态学操作,他们运用广泛主要有: . 消除噪声 . 分割(ioslate)独立的图像元素以及连接(join)相邻的元素 . 寻找图像中的明显的极大值区域或极小值区域原创 2017-01-16 17:35:27 · 6052 阅读 · 0 评论 -
opencv学习(二十三)之方框、均值、高斯、中值、双边滤波综合比较
/* *本程序的目的旨在对前面介绍的滤波器进行一个比较 *对比每种滤波器的滤波效果和耗时 *除双边滤波外其他滤波器kernel均是5*5或5 *对于双边滤波器取其直径典型值25 *sigmaColor和sigmaSpace的值均由直径计算而来*/#include <iostream>#include <opencv2/core.hpp>#include <opencv2/highgu原创 2017-01-14 22:39:52 · 3591 阅读 · 0 评论 -
Linux\Ubuntu 16.04配置Opencv
想偶尔用自己的笔记本编译OpenCV代码,由于笔记本是Ubuntu,所以与Windows下的配置方法不太一样,在网上找了一些方法,总结如下:1.首先去官网下载Opencv,选择自己想用的版本,我这里选择的是OpenCV2.4.13,解压缩,然后进入OpenCV2.4.13所在的文件夹cd /home/keith/soft/opencv-2.4.132.安装依赖库和cmake依赖库:原创 2016-09-27 22:57:48 · 19303 阅读 · 11 评论 -
opencv学习(二十二)之双边滤波bilateralFilter
双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。之所以能够达到保边去噪的滤波效果是因为滤波器由两个函数构成:一个函数是由几何空间距离决定滤波器系数,另一个是由像素差值决定滤波器系数。 双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合,其公式如下: 权重系数w(i,j原创 2017-01-14 18:35:00 · 64633 阅读 · 8 评论 -
opencv学习(三十二)之图像边缘检测Soble_Laplace_Canny
1. Sobel算子前面我们已经介绍了图像的卷积操作,而一个最重要的卷积运算就是对导数的计算,假设我们需要检测图像中的边缘部分,如下图所示: 前面我们介绍图像的高频和低频分量的时候说到,图像的高频分量一般出现在像素值显著改变的地方,而高频分量的出现就容易勾画出图像的轮廓。在高等数学中我们知道函数变化剧烈其所对应的导数值越大(极大值),所以表示图像像素值改变最大的一个方法就是求出图像的导数。其梯原创 2017-02-20 10:08:39 · 5378 阅读 · 0 评论 -
opencv学习(三十三)之霍夫变换
1.霍夫变换综述霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状。最基本的霍夫变换是从黑白图像中检测直线。在图像处理中可以通过霍夫变换可以快速的检测出直线或圆。2.霍夫线变换opencv提供三种不同的霍夫线变换分别是:标准霍夫变换(Standard Hough Transform, SHT)、多尺度霍夫 变换(Mu原创 2017-02-20 22:48:05 · 5373 阅读 · 1 评论 -
opencv学习(三十四)之重映射remap
重映射就是把一个图像中一个为之的像素放置到另一个图片指定位置过程。为了完成重映射过程有必要获得一些插值作为非整数像素坐标,因为原图像与目标图像的像素坐标不是一一对应的。我们通过重映射来表达每个像素的位置(x, y): g(x, y)=f(h(x,y)) 这里g()是目标图像,f()是原图像,h(x,y)是作用于(x,y)的映射方法函数。假设有一幅图像I,满足下面条件作重映射: h(x,y)=(原创 2017-02-21 20:43:33 · 18779 阅读 · 4 评论 -
opencv学习(四十四)之图像角点检测Harris
1.概述角点是图像很重要的特征,对图像图形的理解和分析有很重要的作用,在保留图像图形重要特征的同时,可以有效减少信息的数据量,使信息的含量很高,有效提高计算速度,有利于图像的可靠匹配,使得实时处理成为可能。在物体识别、图像匹配、视觉跟踪和三维重建等方面有很重要的应用。 角点可以认为是窗口向任意方向的移动都导致图像灰度的明显变化。从图像分析的角度来定义角点可以有一下两种: 1.角点可以是两个边缘的原创 2017-04-17 10:23:02 · 3728 阅读 · 1 评论 -
opencv学习(四十三)之图像的矩moments()
1.概述图像识别的一个核心问题是图像的特征提取,简单描述即为用一组简单的数据(数据描述量)来描述整个图像,这组数据月简单越有代表性越好。良好的特征不受光线、噪点、几何形变的干扰,图像识别技术的发展中,不断有新的描述图像特征提出,而图像不变矩就是其中一个。从图像中计算出来的矩通常描述了图像不同种类的几何特征如:大小、灰度、方向、形状等,图像矩广泛应用于模式识别、目标分类、目标识别与防伪估计、图像编码与原创 2017-04-16 18:56:41 · 82059 阅读 · 4 评论 -
opencv学习(四十二)之多边形包围图像轮廓
首先介绍一个逼近多边形的函数approxPolyDP(),其定义如下:void cv::approxPolyDP ( InputArray curve, OutputArray approxCurve, double epsilon,原创 2017-04-16 12:40:25 · 11464 阅读 · 0 评论 -
opencv学习(四十一)之寻找凸包convexHull()
1.概述凸包(Convex Hull)是一个计算几何(图形学)中的概念,在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。 X的凸包可以用X内所有点(x1, x2….xn)的线性组合来构造。在二维欧几里得空间中,凸包可以想象为一条刚好包着所有点的橡皮圈,用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点。常见的有原创 2017-04-16 10:34:41 · 42609 阅读 · 3 评论 -
opencv学习(三十九)之反向投影calcBackProject()
1.概述反向投影是一种记录给定图像中的像素点如何适应直方图模型像素分布的方式,简单来讲,反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的特征。反向投影在某一位置的值就是原图对应位置像素值在原图像中的总数目。2.反向投影原理原理采用OpenCV docs介绍!使用肤色直方图来解释反向投影的工作原理。假设我们已经获得一个肤色直方图(Hue-Staturation),旁边的直方图就原创 2017-04-13 09:55:43 · 25486 阅读 · 3 评论 -
opencv学习(三十八)之图像模板匹配matchTemplate()
1.概述利用计算机视觉技术对图像进行处理,通常会用到图像的匹配,图像匹配是指图像之间的比较,得到不同图像之间的相似度,在机器识别的过程中把不同传感器或同一传感器在不同时间、不同成像条件下对同一景物获得的两幅或多幅图像在空间上对准,或根据已知模式到另一幅图中寻找对应的模式。匹配方法大体分为基于灰度和基于特征两类,其中基于特征的配准方法研究较多。 基于灰度的模板匹配方法原理简单且在光照良好的条件下可以原创 2017-04-11 12:01:24 · 21482 阅读 · 5 评论 -
opencv学习(三十七)之图像直方图计算calcHist()
图像直方图是对数据集合的一种统计方法,将统计结果分布于一系列预定义的bin中,bin是直方图中经常用到的一个概念,其数值是从数据中计算出的特征统计量,这些数据不仅仅指的灰度值,统计数据可能是任何能有效描述图像的特征包括梯度、方向、色彩或任何其他特征。直方图获得的是数据分布的统计图,通常直方图的维数要低于原始数据。 图像直方图是用以表示数字图像中亮度分布的直方图,标绘了图像中亮度值的像素数。可以借助原创 2017-02-25 20:59:36 · 29972 阅读 · 8 评论 -
opencv学习(三十一)之图像边缘像素填充估计copyMakeBorder()
前面讲到图像卷积运算的时候涉及到对图像边缘像素的估计,这里讲介绍图像边缘像素进行卷积运算。大部分opencv中的函数是将原图像复制到一个比原图像尺寸更大的图像中然后实现边缘的自动填充。这种方式得到的像素点可以执行卷积操作。下面介绍两种方式: - 1.BORDER_CONSTANT:使用一个常数填充像素边缘 - 2.BORDER_REPLICATE:将图像中边缘的行和列像素值直接填充像素边缘 o原创 2017-02-15 17:55:26 · 9311 阅读 · 0 评论 -
opencv学习(三十六)图像直方图均衡化equalizeHist
图像直方图描述了图像中灰度值的分布情况,直方图均衡化就是通过拉伸像素强度分布范围来增强图像对比度的一种方法。如下图: 可以看到像素主要集中在中间的一些强度值上。直方图均衡化要做的就是拉伸这个范围。如下: 作途中绿色圈圈出了少有像素分布其上的强度值,对其应用均衡化后得到中间图所示的直方图,均衡化后的图像见上右图。直方图均衡化是通过使用累积函数对灰度值进行“调整”以实现对比度的增强,其中心思想是把原原创 2017-02-22 22:51:47 · 9946 阅读 · 3 评论 -
opencv学习(三十五)之仿射变换warpAffine
1.仿射变换介绍仿射变换是指在向量空间中进行一次线性变换(乘以一个矩阵)并加上一个平移(加上一个向量),变换为另一个向量空间的过程。在有限维的情况下,每个仿射变换可以由一个矩阵A和一个向量b给出,它可以写作A和一个附加的列b。一个仿射变换对应于一个矩阵和一个向量的乘法,而仿射变换的复合对应于普通的矩阵乘法,只要加入一个额外的行到矩阵的底下,这一行全部是0除了最右边是一个1,而列向量的底下要加上一个1原创 2017-02-22 10:50:41 · 99315 阅读 · 12 评论 -
opencv(九)之轨迹条条创建和使用createTrackbar
上篇介绍图像混合时,需要设置两幅图像的权重,每次改变图像权重只能从代码改变,没有那么直观。opencv提供了一种称为轨迹条或滑动条(Trackbar)的控件工具,能够直观的改变出现处理时的参数,实时看到更改这些参数时对于图像处理结果的影响。createTrackbar()函数 createTrackbar()函数用来创建一个可以调节输入变量值的滑动条,并将改控件依附于指定的窗口上。在使用时原创 2016-11-15 21:20:47 · 6267 阅读 · 0 评论 -
opencv学习(二十一)之中值滤波medianBlur
中值滤波是一种典型的非线性滤波,是基于排序统计理论的一种能够有效抑制噪声的非线性信号处理技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,让周围的像素值接近真实的值从而消除孤立的噪声点。该方法在取出脉冲噪声、椒盐噪声的同时能保留图像的边缘细节。这些优良特性是线性滤波所不具备的。 中值滤波首先也得生成一个滤波模板,将该模板内的各像素值进行排序,生成单调上升或单调下降的二维数据序列,二维原创 2017-01-14 16:49:16 · 69715 阅读 · 8 评论 -
opencv学习(二十)之高斯滤波GaussianBlur()
高斯滤波是一种线性平滑滤波,对于除去高斯噪声有很好的效果。在其官方文档中形容高斯滤波为”Probably the most useful filter”,同时也指出高斯滤波并不是效率最高的滤波算法。高斯算法在官方文档给出的解释是高斯滤波是通过对输入数组的每个点与输入的高斯滤波模板执行卷积计算然后将这些结果一块组成了滤波后的输出数组,通俗的讲就是高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值原创 2017-01-14 10:46:55 · 109258 阅读 · 2 评论 -
Linux-Fedora25开发OpenCV3.2配置
Ubuntu系统安装opencv3.2看这里《Linux\Ubuntu 16.04配置Opencv》 写文章用的opencv2.4.13,opencv3.2与2.4.13编译和环境变量配置一样!!!换系统了,OpenCV3.2也出来了,改变貌似还挺大的,特别是ml库,在本次配置中将用OpenCV3.2来代替2.4.13,Fedora25配置opencv与Ubuntu有细微不同,还是贴出详细步骤。o原创 2017-01-07 13:09:59 · 2968 阅读 · 2 评论 -
opencv学习(七)之图像卷积运算函数filter2D()
在其官方文档中,filter2D()函数在掩模板介绍中一笔带过,我认为该函数应该进行详细介绍。 对于使用掩模板矩阵(kernel)计算每个像素值,结合函数filter2D()函数,其定义如下:CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth, Inp原创 2016-11-09 18:08:36 · 103472 阅读 · 6 评论 -
opencv学习(六)之掩膜版
可以通过掩模矩阵(通常来讲叫核)对图像的每个图像像素值重新计算。这个掩模板能够调整临近像素包括当前像素对新像素的影响程度。从数学的角度来讲,我们用特殊的值对当前的值做了一个加权平均的操作。举个例子,设想一个图像对比度增强的方法,基本上,我们要将下面的公式应用到每一个像素上:原创 2016-11-09 18:07:10 · 5663 阅读 · 0 评论 -
opencv学习(一)之Mat类
大概说一下opencv来源。opencv最初是Intel在俄罗斯的团队实现的,而在后期Intel对opencv的支持力度慢慢变小。在08年,美国一家机器人公司Willow Garage开始大力支持opencv,在得到支持后opencv更新速度明显加快,加入了很多新特性。在opencv1.x时代,数据类型为IplImage,在使用这种数据类型时,考虑内存管理称为众多开发者的噩梦。在进入到opencv2原创 2016-10-26 22:52:45 · 5725 阅读 · 0 评论 -
opencv学习(五)之像素遍历三种方式耗时分析
前面用两篇介绍了像素的颜色空间缩减、查找表、遍历像素的三种方式、程序计时等,也说了一下每种方法的优缺点,现在用一个综合型的程序进行对比。方式是用三种方式对lena图像(220x220)进行处理,使其颜色种类从256中变成64种。在颜色空间缩减方法中讲过这种方式,即每个像素值除以4向下取整然后再乘以4即可将其颜色种类缩减到64种。#include <iostream>#include <opencv原创 2016-11-08 09:51:07 · 8823 阅读 · 1 评论 -
opencv学习(四)之像素遍历三种方式
在上一篇文章中介绍了图像颜色空间缩减、查找表等内容。在对图像像素进行遍历时共有三种方法: (1). C操作符[] (指针方式访问) (2). 迭代器iterator (3). 动态地址计算 这三种像素遍历方式在速度上有所不同,上一篇文章介绍过用C操作符[]是最快的访问方式。下面会通过对同一幅图像进行处理来直观的比较三种访问方式的速度差异。首先介绍一下opencv中提供的计时函数1.计时原创 2016-11-07 20:52:15 · 14595 阅读 · 1 评论 -
程序命令行argc\argv
在一些程序中会看到这样的定义int main(int argc, char **argv) 或int main(int argc, char *argv [])这样的写法在一些C\C++会经常看到,现在对这两个参数做一个解释。 在上述代码行中argc表示命令行输入参数的个数(以空白符分隔),argv中存储了所有命令行的参数。这里的命令行不是指在IDE输入什么命令,而是在Windows的DOS和原创 2016-10-25 22:13:22 · 3280 阅读 · 0 评论 -
opencv学习(三)之图像像素遍历(颜色空间缩减、查找表)
在图像处理中不可避免的要涉及到对图像像素的操作,这篇文章将介绍对图像像素的访问及遍历图像像素的方法。1.颜色空间缩减及查找表设想一种简单的C\C++类型的无符号字符型矩阵的存储结构,对于单通道图像而言,图像像素最多可以由256个像素值。如果图像是三通道图像,那么图像像素存储的颜色可以达到惊人的1600w。处理如此多的颜色类型对于算法的运算是一种沉重的负担。有时候我们可以找到一些既能够降低颜色数量但是原创 2016-11-06 21:55:48 · 5877 阅读 · 5 评论 -
opencv实现多图像读取并显示,sprintf_s函数,static_cast
基于opencv和C++实现多幅图像的加载,程序中需要将文件统一命名,而且文件名最后一定是数字,还未实现对字符文件名图像的加载。首先介绍一个函数sprintf_s,sprintf_s是sprintf函数的安全版本,是新的C++标准对sprintf函数进行的改进,通过指定缓冲区长度来避免sprintf()存在的溢出风险,其函数原型如下:sprintf_s( _Out_writ原创 2016-09-12 19:58:36 · 7499 阅读 · 0 评论 -
opencv之在Linux下编译opencv程序的两种方式g++、cmake
从电子信息工程跳到计算机,在研究图像处理的东西,发现opencv很好玩,想深入学一下,没有特别好的教材,最好的文档就是官方的tutorials,在实验室比较忙,希望能每天晚上抽点时间把这个大概看一下,不求全部看懂,至少能够深入一下。所有代码编写均在Ubuntu16.04+opencv2.4.9+g++5.4.0+cmake3.5.1下完成。以前写的文章介绍了Windows和Linux下open原创 2016-10-19 23:21:44 · 29084 阅读 · 5 评论 -
opencv学习(二)之图像的加载、显示、保存
在使用opencv对图像进行处理时,图像的加载就是要走出的第一步。1.图像的加载之imread函数图像的加载在opencv中由”imread”函数来实现,在imread函数中可以加载想要进行处理的图像,imread函数支持多种图像格式。 windows位图:bmp, dib JPEG文件:jpeg, jpg, jpe JPEG2000文件: jp2 PNG图片: png 便携文件格式: p原创 2016-10-31 20:55:32 · 5047 阅读 · 0 评论 -
opencv学习(十三)之文本文字插入
在进行图形处理时,可能考虑到要对图片部分进行文字标注,也可以对图片进行加水印。本篇将介绍使用opencv函数putText()和getTextSize()函数来实现这些功能。 1. putText()函数 putText()是字符串绘制函数,其定义如下:CV_EXPORTS_W void putText( Mat& img, const string& text, Point org,原创 2016-11-27 22:45:25 · 11222 阅读 · 8 评论