OpenCV
OpenCV基础部分---学习笔记
进阶的花生
Yes!
展开
-
一次搞定OpenCV源码及扩展模块的编译与环境配置
本篇文章用来记录花一天时间将扩展模块加入opencv,为了避免大家迷路,特写此博客帮助大家顺利搞定opencv扩展模块版本:VS2017、CMake3.12.3、OpenCV3.4.7安装OpenCV时的环境配置以及扩展模块的编译对于多数新手来说都是令人头疼的问题,希望通过这篇文章可以帮助新手们一次搞定OpenCV的安装与扩展模块编译问题。第一步:安装软件1、安装VS2017,在微软官网可...原创 2020-09-15 09:30:48 · 1225 阅读 · 0 评论 -
OpenCV32---基于距离变换与分水岭的图像分割
三十二、基于距离变换与分水岭的图像分割1、什么是图像分割(Image Segmentation)图像分割是图像处理最重要的处理手段之一图像分割的目标是将图像中像素根据一定的规则分为若干(N)个cluster集合,每个集合包含一类像素根据算法分为监督学习和无监督学习方法,图像分割的算法多数都是无监督学习方法—Kmeans2、距离变换与分水岭介绍距离变换常见算法有两种不断膨胀/...原创 2020-04-08 18:23:43 · 773 阅读 · 0 评论 -
OpenCV31---点多边形测试
三十一、点多边形测试1、概念介绍测试一个点是否在给定的多边形内部、边缘或者外部2、API介绍cv::pointPolygonTestpointPolygonTest(InputArray contours,//输入的轮廓Point2f pt,//测试点bool meatureDist//是否返回距离值,如果是false,1表示在内面,0表示在边界上,-1表示在外部,如果是true返回...原创 2020-04-02 21:50:52 · 230 阅读 · 0 评论 -
OpenCV30---图像矩(图像测量)
三十、图像矩原创 2020-04-02 18:53:41 · 231 阅读 · 0 评论 -
OpenCV29---轮廓周围绘制矩形框和圆形框
三十、轮廓周围绘制矩形框和圆形框1、减少多边形轮廓点数APIapproxPolyDP作用是把一个很多点的多边形变成一个点数适中的多边形,在这个多边形里面找它的最小连接矩形和最小的圆。approxPolyDP(InputArray curve,//输入一个多边形(点)OutputArray approxCurve, //输出一个处理后的多边形(点)double epsilon,//表示两...原创 2020-04-02 15:50:28 · 342 阅读 · 0 评论 -
OpenCV28---凸包
二十八、凸包(Convex Hull)1、概念介绍什么是凸包:在一个多边形边缘或者内部任意两个点的连线都包含在多边形边界或者内部。正式定义:包含点集合S中所有点的最小凸多边形称为凸包。检测算法Graham扫描法首先选择Y方向最低的点作为起始点p0从p0开始极坐标扫描,依次添加p1…pn(排序顺序是根据极坐标的角度大小,逆时针方向)对每个点pi来说,如果添加pi点到凸包中导致一个...原创 2020-04-02 12:10:16 · 204 阅读 · 0 评论 -
OpenCV27---轮廓发现
二十七、轮廓发现1、轮廓发现(find contour)轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法。所以边缘提取的阈值选定会影响最终轮廓发现结果。2、API介绍findContours发现轮廓二值图像上发现轮廓使用APIfindContours(InputOutputArray src,//输入图像,非0的像素被看成1,0的像素保持不变,8bitsOutputArr...原创 2020-04-01 23:04:53 · 113 阅读 · 0 评论 -
OpenCV26---模板匹配
二十六、模板匹配1、模板匹配介绍(Template Match)模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。所以模板匹配首先需要一个模板图像T(给定的子图像)。另外需要一个待检测的图像。工作方法:在待检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。2、匹配算法介绍opencv中提供了6种常见的匹配算法如下:计算...原创 2020-04-01 23:04:19 · 149 阅读 · 0 评论 -
OpenCV25---直方图反向投影
二十五、直方图反向投影1、反向投影(Back Projection)反向投影是反映直方图在目标图像中的分布情况简单点说就是用直方图模型去目标图像中寻找是存在否相似的对象。通常用HSV色彩空间的HS两个通道直方图模型。具体操作是先得到一张图像的直方图信息,然后遍历原图像的每一个像素,如果这个像素值在直方图的某个bin下,就用这个bin出现的频次去代替这个像素值。这样划分了多少个bin,新生...原创 2020-03-28 12:11:04 · 237 阅读 · 0 评论 -
OpenCV24---直方图比较
二十四、直方图比较利用两张图片的直方图判断两张图片的相似性,也可以判断两个图片是否为同一图片。1、直方图比较方法对输入的两张图象计算得到直方图H1与H2,归一化到相同的尺度空间然后可以通过计算H1和H2之间的距离得到两个直方图的相似程度进而比较图像本身的相似程度。opencv提供的比较方法有4种:Correlation相关性比较 HISTCMP_CORREL如果两个数组H1、H2一样的...原创 2020-03-28 00:30:18 · 306 阅读 · 0 评论 -
OpenCV23---直方图计算
二十三、直方图计算1、直方图概念对于图像像素值、图像梯度、每个像素的角度等一切图像的属性值,都可以建立直方图,不过基于图像像素灰度直方图是最常见的。直方图常见的几个属性:dims表示维度,对灰度图像来说只有一个通道值dims=1bins表示在维度中子区域大小划分,bins=256代表划分为256个级别range表示值的范围,灰度范围为0~255之间2、API学习split将三...原创 2020-03-27 18:26:06 · 168 阅读 · 0 评论 -
OpenCV22---直方图均衡化
二十二、直方图均衡化1、什么是直方图(Histogram)统计每一个像素值出现的次数,根据每一个像素值的频次生成直方图。纵坐标是出现的频次,横坐标是像素值。所有的频次加起来就是图像所含有的像素数量。符合这种特征的数据都可以做直方图。即数据的范围有限,统计数据在这个范围内各个位置出现的频次就可以做直方图。图像直方图,是指对整个图像在灰度范围内的像素值(0~255)统计出现频次次数,据此生成...原创 2020-03-27 15:47:00 · 403 阅读 · 0 评论 -
OpenCV21---像素重投影(remap使用)
二十一、像素重投影1、什么是像素重投影简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像。g(x,y)g(x,y)g(x,y) = f(h(x,y))f(h(x,y))f(h(x,y))g(x,y)g(x,y)g(x,y)是重映射后的图像,h(x,y)h(x,y)h(x,y)是功能函数,fff是原图像。原图像fff中每一点经过功能函数hhh映...原创 2020-03-27 09:54:10 · 2204 阅读 · 0 评论 -
OpenCV20---霍夫圆检测
二十、霍夫圆检测1、霍夫圆检测原理从平面坐标到极坐标转换3个参数C(x0x_0x0,y0y_0y0,rrr),其中x0x_0x0、y0y_0y0是圆心。假设平面坐标的任意一个圆上的点,转换到极坐标中:C(x0x_0x0,y0y_0y0,rrr)处有最大值,霍夫变换正是利用这个原理实现圆的检测。霍夫圆检测先检测边缘,将非边缘处都变为零值。遍历所有非零值,将其投影为(a,b,...原创 2020-03-25 10:51:43 · 1240 阅读 · 1 评论 -
OpenCV19---霍夫直线变换
十九、霍夫变换—直线1、霍夫直线变换介绍Hough Line Transform用来做直线检测前提条件—边缘检测已经完成平面空间到极坐标空间转换对于任意一条直线上的所有点来说变换到极坐标中,从[0~360]空间,可以得到r的大小属于同一条直线上点在极坐标空间(r, θ\thetaθ)必然在一个点上有最强的信号出现,根据此反算到平面坐标中就可以得到直线上各点的像素坐标,从而得到直线。...原创 2020-03-24 23:50:21 · 211 阅读 · 0 评论 -
OpenCV18---Canny边缘检测
十八、Canny边缘检测1、Canny算法介绍Canny是边缘检测算法,1986年提出是一个很好的边缘检测器很常用也很实用的图像处理方法2、Canny算法介绍—五步高斯模糊去噪GaussianBlur灰度转换cvtColor计算梯度Sobel/Scharr非最大信号抑制边缘不能很宽,必须选择一个最大值作为边缘高低阈值输出二值图像T1、T2为阈值,凡是高于T2的都保留,...原创 2020-03-24 16:32:55 · 174 阅读 · 0 评论 -
OpenCV17---Laplance算子
十七、拉普拉斯算子1、理论在二阶导数的时候,最大变化处的值为零即边缘是零值。通过二阶导数计算,依据此理论我们可以计算图像二阶导数,提取边缘。不用考虑二阶导数,拉普拉斯算子已经为我们提供了拉普拉斯算子。2、处理流程高斯模糊—去噪声GaussianBlur转换为灰度图像 cvtColor拉普拉斯—二阶导数计算Laplacian取绝对值convertScaleAbs二值化—thr...原创 2020-03-24 12:16:24 · 130 阅读 · 0 评论 -
OpenCV16---Sobel算子
十六、Sobel算子1、卷积应用-图像边缘提取边缘是什么—是像素值发生跃迁的地方,是图像的显著特征之一,在图像特征提取、对象检测、模式识别等方面都有重要作用。如何捕捉/提取边缘—对图像求它的一阶导数,delta=f(x)-f(x-1),delta越大,说明像素在X方向变化越大,边缘信号越强。不知道怎么求导不要紧,Sobel算子帮忙解决,卷积操作。2、Sobel算子是离散微分算子...原创 2020-03-24 10:41:35 · 245 阅读 · 0 评论 -
OpenCV15---卷积时的边缘处理
十五、处理边缘1、卷积边缘问题图像卷积的时候边界像素,不能被卷积操作,原因在于边界像素没有完全跟kernel重叠,所以当33滤波时侯有1个像素的边缘没有被处理,55滤波的时候有两个像素的边缘没有被处理。2、处理边缘在卷积开始时增加边缘像素,填充的像素值为0或者RGB黑色,比如3*3在四周各填充1个像素的边缘,这样就确保图像的边缘被处理,在卷积处理之后再去掉这些边缘。opencv中默认的处理...原创 2020-03-23 22:28:53 · 1591 阅读 · 0 评论 -
OpenCV14---常见卷积算子介绍与自定义线性滤波
十四、自定义线性滤波1、卷积概念卷积是图像处理中的一个操作,是kernel在图像的每个像素上的操作。Kernel本质上是一个固定大小的矩阵数组,其中心点称为锚点。卷积工作把kernel放到像素数组之上,求锚点周围覆盖的像素乘积之和(包括锚点),用来替换锚点覆盖下像素点值称为卷积处理。卷积常用作用:模糊图像、提取边缘、图像锐化。2、常见的卷积算子(模板)Sobel算子X方向(图...原创 2020-03-23 17:16:56 · 495 阅读 · 0 评论 -
OpenCV13---基本阈值操作
十三、基本阈值操作1、图像阈值(threshold)阈值简单说是把图像分割的标尺,根据这个阈值将图像进行分类处理。2、阈值类型阈值二值化(threshold binary)THRESH_BINARY规定某个阈值,当像素值大于这个阈值的时候为255;当像素值小于这个阈值的时候为0。阈值反二值化(threshold binary Inverted)THRESH_BINARY_INY规定...原创 2020-03-16 15:57:50 · 255 阅读 · 0 评论 -
OpenCV12---图像的采样和降采样(图像金字塔)
十二、图像上的采样和降采样1、图像金字塔概念:我们在图像处理中常常会调整图像大小,最常见的就是放大(zoom in)和缩小(zoom out),尽管几何变换也可以实现图像放大和缩小,但图像金字塔可以保证每一层图像的特征不变。一个图像金字塔式一系列的图像组成,最底下一张是图像尺寸最大,最上方的图像尺寸最小,从空间上从上向下看就像一个古代的金字塔。高斯金字塔是从底向上,逐层降采样得到。降...原创 2020-03-16 12:17:07 · 559 阅读 · 0 评论 -
OpenCV11---提取水平与垂直线
十一、提取水平与垂直线1、原理方法图像形态学操作时候,可以通过自定义的结构元素getStructuringElement(模板形状类型,Size(), Point(-1, -1));对输入图像一些对象敏感、而对另一些对象不敏感,这样就会让敏感的对象改变而不敏感的对象保留输出。通过使用两个最基本的形态学操作—膨胀与腐蚀,使用不同的结构元素实现对输入图像的操作、得到想要的结果。膨胀:输出的像素...原创 2020-03-16 12:16:44 · 475 阅读 · 0 评论 -
OpenCV10---形态学操作(开、闭、梯度、顶帽、黑帽)
一、开操作(open)先腐蚀后膨胀可以去掉小的白色对象,保证大的白色部分不变。假设对象是白色,背景是黑色。二、闭操作(close)先膨胀后腐蚀可以填充小的黑色洞,大片的黑色不变,假设对象是白色,背景是黑色。三、形态学梯度(Morphological Gradient)膨胀减去腐蚀morph(src, element) = dilate(src, element) - erode...原创 2020-03-16 12:16:27 · 233 阅读 · 0 评论 -
OpenCV9---膨胀与腐蚀操作
9、膨胀与腐蚀1、原创 2020-03-16 12:16:13 · 246 阅读 · 0 评论 -
OpenCV8---图像滤波(模糊)(均值、高斯、中值、双边)
八、模糊图像(滤波)1、模糊原理Smooth/Blur是图像处理中最简单和常用的操作之一使用该操作的原因之一就是为了给图像预处理时候降低噪声使用Smooth/Blur操作其背后是数学的卷积计算通常这些卷积算子计算都是线性操作,所以又叫线性滤波卷积过程示意如下:(灰色代表图片,黄色部分代表卷积算子,红色中心部分代表正在处理的像素)2、有关模糊(滤波)的API(Applicati...原创 2020-03-16 12:15:56 · 1032 阅读 · 0 评论 -
OpenCV7---绘制形状文字
七、绘制形状和文字1、在图片中绘制一条线Point表示2D平面上的一个点,可用以下两个方式定义Point p;p1.x = 10; p1.y = 8;//第一种p = Point(10, 8);//第二种画线用到函数line( );void MyLines() {//划线函数定义 Point p1 = Point(20, 30);//定义线的起始点 Point p2 ...原创 2020-03-16 12:15:37 · 174 阅读 · 0 评论 -
OpenCV6---调整图片亮度和对比度
六、调整图片亮度和对比度1、理论图像变换可以看作如下:像素变换—点操作邻域操作—区域调整图原创 2020-03-16 12:15:16 · 380 阅读 · 0 评论 -
OpenCV5---图像的混合操作
五、图像的混合操作1、线性混合操作的理论部分两幅图像的线性混合操作:g(x) = (1 - α\alphaα) * f0(x) + α\alphaα * f1(x)其中α\alphaα的取值范围为0~1之间, f0(x)、f1(x)为待混合的两张图像,g(x)为混合后的图像2、加权函数( addWighted() )通过加权函数可以实现两幅图像的混合操作,两幅图像需要保证大小类型完全一...原创 2020-03-16 12:15:00 · 247 阅读 · 0 评论 -
OpenCV4---像素操作(读写像素、修改像素值)
四、像素操作(读写像素、修改像素值)1、遍历图像像素int height = gray_src.rows;//获取图像行数int width = gray_src.cols;//获取图像列数for (int row = 0; row < height; row++) {//遍历图像各个像素点的像素值 for (int col = 0; col < width; col+...原创 2020-03-16 12:14:40 · 3637 阅读 · 1 评论 -
OpenCV3---Mat对象(复制构造简单图像与获取图像基本参数(行、列、像素值))
三、Mat对象(获取图像的基一些基本信息,构造一张简单图像)1、 获取一张与目标图像大小类型一样的初始化图像Mat dst;//定义图像名dstdst = Mat(src.size(), src.type());//使dst与src大小类型一致dst = Scalar(127, 0, 255);//可以得到一张BGR任意配色的背景图,长度与通道数目一致2、复制和克隆一张目标图像Mat ...原创 2020-03-16 12:14:10 · 770 阅读 · 0 评论 -
OpenCV2---矩阵的掩膜操作
二、矩阵的掩膜操作(提高图像的对比度)1、获取图像像素指针Mat.ptr<uchar>(int i = 0)//ptr为指针,uchar为指针类型获取像素矩阵的指针,索引i代表第几行,从0开始计算行数。const uchar* current = Mat.ptr<uchar>(row);获取当前行指针p(row, col) = current[col]获取当前像素点...原创 2020-03-16 12:13:39 · 250 阅读 · 0 评论 -
OpenCV1---基本操作(读取、显示、修改、保存图片)
一、读取、显示、修改、保存图片1、读取图片imread("此处添加图片路径");2、显示图片imshow("弹框名称", 图片名称);3、修改图片颜色cvtColor(要修改的图片, 修改后的图片,目标彩色空间);例:彩色图转灰度cvtColor(src, gray_image, COLOR_BGR2GRAY);4、保存图像:imwrite("添加路径.文件格式",添加的图片名称);5...原创 2020-03-16 12:12:45 · 555 阅读 · 0 评论