opencv2/3基础教程
文章平均质量分 79
文章在前半部分采用opencv2.4.13编写,后半部分以opencv3.2编写。旨在帮助对opencv有兴趣的同学打开opencv的大门。以官方文献为基础,并搜寻各位大神的博客写就。
梧桐栖鸦
opencv系列教程代码已上传至github:https://github.com/keithMaybe/code/tree/master/opencv
以后更新会继续上传
CUDA、Python、ML努力填坑中>>>
展开
-
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 · 19300 阅读 · 11 评论 -
程序命令行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 · 3279 阅读 · 0 评论 -
opencv学习之visual studio2015+opencv2.4.13配置
换实验室啦,换电脑啦,重新配置开发环境,正好这个系列缺一篇完整的配置教程,索性在中途补上。可能会造成这个系列排版变乱!!!这次配置选择的事visual studio2015和opencv2.4.13。至于不配置opencv3.1是因为opencv3.1中的nonfree库需要自己下载,而且当前大部分项目都是基于opencv2.4系列开发的,没必要追求最新。在了解了opencv一些基本用法之后,至于使原创 2016-11-24 20:10:32 · 28220 阅读 · 0 评论 -
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 · 2966 阅读 · 2 评论 -
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学习(一)之Mat类
大概说一下opencv来源。opencv最初是Intel在俄罗斯的团队实现的,而在后期Intel对opencv的支持力度慢慢变小。在08年,美国一家机器人公司Willow Garage开始大力支持opencv,在得到支持后opencv更新速度明显加快,加入了很多新特性。在opencv1.x时代,数据类型为IplImage,在使用这种数据类型时,考虑内存管理称为众多开发者的噩梦。在进入到opencv2原创 2016-10-26 22:52:45 · 5723 阅读 · 0 评论 -
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 · 5044 阅读 · 0 评论 -
opencv学习(三)之图像像素遍历(颜色空间缩减、查找表)
在图像处理中不可避免的要涉及到对图像像素的操作,这篇文章将介绍对图像像素的访问及遍历图像像素的方法。1.颜色空间缩减及查找表设想一种简单的C\C++类型的无符号字符型矩阵的存储结构,对于单通道图像而言,图像像素最多可以由256个像素值。如果图像是三通道图像,那么图像像素存储的颜色可以达到惊人的1600w。处理如此多的颜色类型对于算法的运算是一种沉重的负担。有时候我们可以找到一些既能够降低颜色数量但是原创 2016-11-06 21:55:48 · 5876 阅读 · 5 评论 -
opencv学习(四)之像素遍历三种方式
在上一篇文章中介绍了图像颜色空间缩减、查找表等内容。在对图像像素进行遍历时共有三种方法: (1). C操作符[] (指针方式访问) (2). 迭代器iterator (3). 动态地址计算 这三种像素遍历方式在速度上有所不同,上一篇文章介绍过用C操作符[]是最快的访问方式。下面会通过对同一幅图像进行处理来直观的比较三种访问方式的速度差异。首先介绍一下opencv中提供的计时函数1.计时原创 2016-11-07 20:52:15 · 14595 阅读 · 1 评论 -
opencv学习(五)之像素遍历三种方式耗时分析
前面用两篇介绍了像素的颜色空间缩减、查找表、遍历像素的三种方式、程序计时等,也说了一下每种方法的优缺点,现在用一个综合型的程序进行对比。方式是用三种方式对lena图像(220x220)进行处理,使其颜色种类从256中变成64种。在颜色空间缩减方法中讲过这种方式,即每个像素值除以4向下取整然后再乘以4即可将其颜色种类缩减到64种。#include <iostream>#include <opencv原创 2016-11-08 09:51:07 · 8821 阅读 · 1 评论 -
opencv学习(六)之掩膜版
可以通过掩模矩阵(通常来讲叫核)对图像的每个图像像素值重新计算。这个掩模板能够调整临近像素包括当前像素对新像素的影响程度。从数学的角度来讲,我们用特殊的值对当前的值做了一个加权平均的操作。举个例子,设想一个图像对比度增强的方法,基本上,我们要将下面的公式应用到每一个像素上:原创 2016-11-09 18:07:10 · 5662 阅读 · 0 评论 -
opencv学习(七)之图像卷积运算函数filter2D()
在其官方文档中,filter2D()函数在掩模板介绍中一笔带过,我认为该函数应该进行详细介绍。 对于使用掩模板矩阵(kernel)计算每个像素值,结合函数filter2D()函数,其定义如下:CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth, Inp原创 2016-11-09 18:08:36 · 103465 阅读 · 6 评论 -
opencv学习(八)之ROI区域和图像混合叠加
1.图像线性混合叠加在进行图像处理时,opencv中提供了addWeighted()实现对两幅图像的叠加。这是一种线性混合操作,其公式如下: 通过改变a的值,可以实现两幅图像或视频进行混合时出现不同的效果。 其函数定义如下:CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2,原创 2016-11-09 21:03:07 · 4272 阅读 · 2 评论 -
opencv(九)之轨迹条条创建和使用createTrackbar
上篇介绍图像混合时,需要设置两幅图像的权重,每次改变图像权重只能从代码改变,没有那么直观。opencv提供了一种称为轨迹条或滑动条(Trackbar)的控件工具,能够直观的改变出现处理时的参数,实时看到更改这些参数时对于图像处理结果的影响。createTrackbar()函数 createTrackbar()函数用来创建一个可以调节输入变量值的滑动条,并将改控件依附于指定的窗口上。在使用时原创 2016-11-15 21:20:47 · 6265 阅读 · 0 评论 -
opencv学习(十)之调节图像亮度和对比度
在图像处理中,图像像素的值依赖于输入图像的值。可以通过对输入像素值进行数值运算已达到对图像处理的目的。以调节图像对比度和亮度为例,通过结合之前学过的图像像素访问和轨迹条等内容,对图像对比度和亮度进行调节。 以f(i,j)代表原像素值,g(i,j)为输出像素的值,α和β为两个参数,则可以通过以下公式对图像像素值进行数值运算从而达到调节图像亮度和对比度的目的。g(i,j)= αf(i,j)+ β原创 2016-11-21 21:28:05 · 10145 阅读 · 1 评论 -
opencv学习(十一)之绘图函数
opencv中提供了很多绘图函数,在进行图像处理,对感兴趣区域进行标定时,就需要利用这些绘图函数。现在集中做一个归纳介绍。Point Point常用来指定一幅二维图像中的点。如Point pt;pt.x = 10;pt.y = 8;或Point pt = Point(10,8);其指向的是在图像中(10, 8)位置的一个像素点。Scalar Scalar代表了一个原创 2016-11-25 11:52:26 · 3158 阅读 · 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 评论 -
opencv学习(十五)之图像傅里叶变换dft
在学习信号与系统或通信原理等课程里面可能对傅里叶变换有了一定的了解。我们知道傅里叶变换是把一个信号从时域变换到其对应的频域进行分析。如果有小伙伴还对傅里叶变换处于很迷糊的状态,请戳这里,非常通俗易懂。而在图像处理中也有傅里叶分析的概念,我这里给出在其官方指导文件opencv_tutorials中给出的解释。 傅里叶变换可以将一幅图片分解为正弦和余弦两个分量,换而言之,他可以将一幅图像从其空间域(s原创 2016-12-03 21:33:42 · 70278 阅读 · 18 评论 -
opencv学习(十四)之图像颜色通道分离和融合
在图像处理时,我们接触到的彩色以RGB居多,为了分析图像在某一通道上的特性,需要将图像的颜色通道进行分离,或者是在对某一颜色通道处理后重新进行融合。opencv提供了split()函数来进行颜色通道的分离,提供了merge()函数来进行颜色通道的融合。1.split()函数 颜色通道分离函数,其定义如下所示:CV_EXPORTS void split(const Mat& src, Mat* mv原创 2016-12-02 16:12:07 · 7789 阅读 · 1 评论 -
opencv学习(十六)之颜色空间转换cvtColor()
我们生活中大多数看到的彩色图片都是RGB类型,但是在进行图像处理时,需要用到灰度图、二值图、HSV、HSI等颜色制式,opencv提供了cvtColor()函数来实现这些功能。首先看一下cvtColor函数定义: C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );参数解释: . InputArra原创 2016-12-05 22:58:37 · 165287 阅读 · 13 评论 -
opencv学习(十七)之XML和YAML文件读写操作
可能大部分人到现在接触的XML和YAML文件很少,等以后训练人脸模型进行人脸识别的时候用的就多了。现在先了解一下这两种文件类型。 XML:Extensible Markup Language,可扩展标记语言,标准通用语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML的简单使其易于在任何应用程序中读写数原创 2016-12-13 23:02:06 · 6584 阅读 · 2 评论 -
opencv学习(十八)之图像方框滤波BoxBlur
从本篇博客开始了解opencv中imgproc库。imgproc顾名思义就是image process即图像处理,像图像滤波、图像形态学(膨胀腐蚀、开运算、闭运算等)、图像缩放等一些图像处理相关知识。 图像平滑(smoothing)也称为图像模糊(blurring),是一种在图像处理中使用频率很高的操作,进行图像平滑的操作原因有很多,在这里重点介绍使用平滑操作降低图片噪声。因为在图像中,噪声的能量原创 2016-12-25 23:08:37 · 9724 阅读 · 2 评论 -
opencv学习(十九)之均值滤波blur
从本篇开始采用opencv3.2版本进行编译!!!均值滤波是一种典型的线性滤波算法,主要是利用像素点邻域的像素值来计算像素点的值。其具体方法是首先给出一个滤波模板kernel,该模板将覆盖像素点周围的其他邻域像素点,去掉像素本身,将其邻域像素点相加然后取平均值即为该像素点的新的像素值,这就是均值滤波的本质。官方给出的kernel模板如下: opencv提供了blur函数实现均值滤波操作,其原型原创 2017-01-12 22:32:01 · 19192 阅读 · 0 评论 -
opencv学习(二十)之高斯滤波GaussianBlur()
高斯滤波是一种线性平滑滤波,对于除去高斯噪声有很好的效果。在其官方文档中形容高斯滤波为”Probably the most useful filter”,同时也指出高斯滤波并不是效率最高的滤波算法。高斯算法在官方文档给出的解释是高斯滤波是通过对输入数组的每个点与输入的高斯滤波模板执行卷积计算然后将这些结果一块组成了滤波后的输出数组,通俗的讲就是高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值原创 2017-01-14 10:46:55 · 109249 阅读 · 2 评论 -
opencv学习(二十一)之中值滤波medianBlur
中值滤波是一种典型的非线性滤波,是基于排序统计理论的一种能够有效抑制噪声的非线性信号处理技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,让周围的像素值接近真实的值从而消除孤立的噪声点。该方法在取出脉冲噪声、椒盐噪声的同时能保留图像的边缘细节。这些优良特性是线性滤波所不具备的。 中值滤波首先也得生成一个滤波模板,将该模板内的各像素值进行排序,生成单调上升或单调下降的二维数据序列,二维原创 2017-01-14 16:49:16 · 69697 阅读 · 8 评论 -
opencv学习(二十二)之双边滤波bilateralFilter
双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空间与信息和灰度相似性,达到保边去噪的目的,具有简单、非迭代、局部处理的特点。之所以能够达到保边去噪的滤波效果是因为滤波器由两个函数构成:一个函数是由几何空间距离决定滤波器系数,另一个是由像素差值决定滤波器系数。 双边滤波器中,输出像素的值依赖于邻域像素的值的加权组合,其公式如下: 权重系数w(i,j原创 2017-01-14 18:35:00 · 64622 阅读 · 8 评论 -
opencv学习(二十三)之方框、均值、高斯、中值、双边滤波综合比较
/* *本程序的目的旨在对前面介绍的滤波器进行一个比较 *对比每种滤波器的滤波效果和耗时 *除双边滤波外其他滤波器kernel均是5*5或5 *对于双边滤波器取其直径典型值25 *sigmaColor和sigmaSpace的值均由直径计算而来*/#include <iostream>#include <opencv2/core.hpp>#include <opencv2/highgu原创 2017-01-14 22:39:52 · 3589 阅读 · 0 评论 -
opencv学习(二十四)之腐蚀与膨胀
腐蚀和膨胀是对二维图片的进行操作的形态学运算,简单来讲形态学操作就是基于形状的一系列图像处理操作,通过将结构元素作用于输入图像来产生输出图像。腐蚀(Erosion)和膨胀(Dilation)是最基本的形态学操作,他们运用广泛主要有: . 消除噪声 . 分割(ioslate)独立的图像元素以及连接(join)相邻的元素 . 寻找图像中的明显的极大值区域或极小值区域原创 2017-01-16 17:35:27 · 6051 阅读 · 0 评论 -
opencv学习(二十五)之开运算、闭运算、形态梯度、顶帽、黑帽
上一篇介绍了形态学的基本操作膨胀和腐蚀,我们这一篇将利用膨胀和腐蚀操作实现对图像更高级的形态学操作,而这些都是建立在膨胀和腐蚀操作基础之上。 首先形态学的主要用途是获取物体拓扑和结果信息,它通过物体和结构元素的某些运算,得到物体更本质的形态,在图像处理中的主要应用有: (1). 利用形态学的基本运算对图像进行观察和处理,从而达到改善图像质量的目的 (2). 描述和定义图像的各种几何参数和特征如原创 2017-01-17 11:51:35 · 20757 阅读 · 0 评论 -
opencv学习(二十六)之图像金字塔(高斯金字塔、拉普拉斯金字塔)
在进行数字图像处理时,我们可能会需要将某种尺寸的图像转换为其他尺寸的图像,这样会存在放大图像核缩小图像两种可能。opencv提供了一个真正意义上的图像所方函数resize(),但在本篇中主要学习以下使用图像金字塔进行图像的所方,图像金字塔是视觉运用较为广泛的一项技术。 一个图像金字塔是一系列图像的集合,所有图像来源于同一张原始图像,通过梯次向下采样获得,直到达到某个终止条件才停止采样。通常有两种类原创 2017-01-17 23:51:07 · 11751 阅读 · 0 评论 -
opencv学习(二十八)之基本图像阈值操作threshold
在二维数字图像中,其每个像素点对应了不同的像素值,其像素值各不相同。可以对像素值特定范围内的图像图像进行操作,划分这个范围的值就被称为图像阈值,它不是一个固定的量级,是根据每幅图像和处理要求动态改变。例如我们可以从图像中利用阈值分割出我们需要的部分,利用其像素值与背景在灰度特性上的差异,图像具有了不同的灰度等级,可据此指定一个合理的阈值从而确定图像中的像素值是否属于这个区域。所以其是像素操作的一种原创 2017-01-20 11:06:08 · 19743 阅读 · 1 评论 -
opencv学习(二十七)之图像缩放函数resize
上一篇介绍了分别利用高斯金字塔和拉普拉斯金字塔结合opencv提供的pyrDown和pyrUp函数实现了图像的缩放,opencv还提供了另外一种图像缩放函数resize()实现对输入图像缩放到指定大小,其函数原型如下:void cv::resize ( InputArray src, OutputArray dst, Size dsize, double fx =原创 2017-01-20 10:54:53 · 31867 阅读 · 1 评论 -
opencv学习(二十九)之灰度图转化为二值图adaptiveThreshold
针对图像的阈值操作,opencv除了提供threshold函数也提供了adaptiveThreshold()函数,从字面意思可以翻译为自适应阈值操作,函数的主要功能是将灰度图转化为二值图像。其函数原型如下:void cv::adaptiveThreshold ( InputArray src, OutputArray dst, double maxValue, int原创 2017-01-20 12:12:05 · 6575 阅读 · 0 评论 -
opencv学习(三十)之设计线性滤波器filter2D
前面在介绍高斯滤波器的时候我们提到是使用高斯滤波模板kernel与原图像卷积以达到滤波的效果。通常来讲,卷积操作发生于图像的每一个部分与kernel进行卷积运算,kernel就是一个含有锚点的常数数字,这个锚点通常位于kernel的中心位置。如下图所示:kernel是怎么进行卷积运算的的?假设你想知道图像特定位置的像素经过与kernel卷积运算后的值,遵循以下步骤: (1). 将kerne原创 2017-01-20 16:08:09 · 5292 阅读 · 0 评论 -
opencv学习(三十一)之图像边缘像素填充估计copyMakeBorder()
前面讲到图像卷积运算的时候涉及到对图像边缘像素的估计,这里讲介绍图像边缘像素进行卷积运算。大部分opencv中的函数是将原图像复制到一个比原图像尺寸更大的图像中然后实现边缘的自动填充。这种方式得到的像素点可以执行卷积操作。下面介绍两种方式: - 1.BORDER_CONSTANT:使用一个常数填充像素边缘 - 2.BORDER_REPLICATE:将图像中边缘的行和列像素值直接填充像素边缘 o原创 2017-02-15 17:55:26 · 9311 阅读 · 0 评论 -
opencv学习(三十二)之图像边缘检测Soble_Laplace_Canny
1. Sobel算子前面我们已经介绍了图像的卷积操作,而一个最重要的卷积运算就是对导数的计算,假设我们需要检测图像中的边缘部分,如下图所示: 前面我们介绍图像的高频和低频分量的时候说到,图像的高频分量一般出现在像素值显著改变的地方,而高频分量的出现就容易勾画出图像的轮廓。在高等数学中我们知道函数变化剧烈其所对应的导数值越大(极大值),所以表示图像像素值改变最大的一个方法就是求出图像的导数。其梯原创 2017-02-20 10:08:39 · 5376 阅读 · 0 评论 -
opencv学习(三十三)之霍夫变换
1.霍夫变换综述霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要用来从图像中分离出具有某种相同特征的几何形状。最基本的霍夫变换是从黑白图像中检测直线。在图像处理中可以通过霍夫变换可以快速的检测出直线或圆。2.霍夫线变换opencv提供三种不同的霍夫线变换分别是:标准霍夫变换(Standard Hough Transform, SHT)、多尺度霍夫 变换(Mu原创 2017-02-20 22:48:05 · 5372 阅读 · 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 · 18773 阅读 · 4 评论 -
opencv学习(三十五)之仿射变换warpAffine
1.仿射变换介绍仿射变换是指在向量空间中进行一次线性变换(乘以一个矩阵)并加上一个平移(加上一个向量),变换为另一个向量空间的过程。在有限维的情况下,每个仿射变换可以由一个矩阵A和一个向量b给出,它可以写作A和一个附加的列b。一个仿射变换对应于一个矩阵和一个向量的乘法,而仿射变换的复合对应于普通的矩阵乘法,只要加入一个额外的行到矩阵的底下,这一行全部是0除了最右边是一个1,而列向量的底下要加上一个1原创 2017-02-22 10:50:41 · 99303 阅读 · 12 评论 -
opencv学习(三十六)图像直方图均衡化equalizeHist
图像直方图描述了图像中灰度值的分布情况,直方图均衡化就是通过拉伸像素强度分布范围来增强图像对比度的一种方法。如下图: 可以看到像素主要集中在中间的一些强度值上。直方图均衡化要做的就是拉伸这个范围。如下: 作途中绿色圈圈出了少有像素分布其上的强度值,对其应用均衡化后得到中间图所示的直方图,均衡化后的图像见上右图。直方图均衡化是通过使用累积函数对灰度值进行“调整”以实现对比度的增强,其中心思想是把原原创 2017-02-22 22:51:47 · 9943 阅读 · 3 评论