OpenCV学习笔记
OpenCV-python版的一些基本操作和一些实战应用,总结以供自用,希望也能给其他小伙伴带来帮助。专栏内容大多来自《OpenCV 3 计算机视觉》《OpenCV3 官方文档》《学习OpenCV》和在网上看到的博客,资料。
Charles.zhang
朝闻道,夕死可矣。路漫漫其修远兮,吾将上下而求索。
展开
-
Opencv的DNN模块如何用GPU加速
参考:https://www.pyimagesearch.com/2020/02/03/how-to-use-opencvs-dnn-module-with-nvidia-gpus-cuda-and-cudnn/十分给力,建议细看转载 2020-09-15 14:07:27 · 2685 阅读 · 0 评论 -
[OpenCV实战]6 基于特征点匹配的视频稳像
在这篇文章中,我们将学习如何使用OpenCV库中称为特征点匹配的技术以实现简单视频稳定稳像。我们将讨论该算法并共享代码,以便在OpenCV中使用此方法设计一个简单的稳定器,最好OpenCV3.4.3以上实现代码。什么是视频稳定,视频稳定是指用于减少相机运动对最终视频影响的一系列方法,理解成消除视频抖动就行了。见下图通常用拍摄会出现轻微的抖动,比如手机拍摄视频,后期需要对其进行视频稳像操作。视频稳定的需求涉及许多领域。它在消费者和专业摄像中极为重要。因此,存在许多不同的机械,光学和算法解决方案。即使在转载 2020-08-25 10:34:28 · 2061 阅读 · 2 评论 -
Hessian矩阵以及在血管增强中的应用—OpenCV实现
Hessian矩阵以及在血管增强中的应用—OpenCV实现原文链接:https://www.cnblogs.com/jsxyhelu/p/12114981.html有别于广为人知的Sobel、Canny等一阶算法,基于Hessian矩阵能够得到图像二阶结果,这将帮助我们深入分析图像本质。Hessian矩阵在图像处理中有着广泛的应用:其中在图像分割领域,包括边缘检测、纹理分析等;在图像增强领域,包括边缘增强、边缘消除等。本文从Hessian矩阵定义出发,通过清晰简洁的数学推导和讲解实现公式到C转载 2020-08-17 18:13:48 · 2305 阅读 · 1 评论 -
OpenCV学习笔记-霍夫变换圆检测
霍夫圆变换的基本原理和霍夫线变换类似,只是点对应的二维极径极角空间被三维的圆心点x, y还有半径r空间取代。对直线来说,一条直线能由参数极径极角(r, θ)表示。而对圆来说,我们需要三个参数来表示一个圆,由于比直线检测多出一个维度,使得标准的霍夫圆检测需要大量的内存且速度比较慢。出于对运算效率的考虑,OpenCV实现的霍夫圆检测是一个比标准霍夫圆检测更为灵活的检测方法:...原创 2018-05-24 21:11:03 · 3843 阅读 · 0 评论 -
OpenCV学习笔记-轮廓特征
查找轮廓的不同特征,例如面积,周长,重心,边界框等矩:cv.moments()轮廓面积:cv.contourArea()轮廓周长:cv.arcLength()轮廓近似:cv.approxPolyDp()边界矩形:cv.boundingRect()最小外接矩形: cv.minAreaRect() cv.boxPoints()最小外接圆:cv.minEnclosingCircle()椭圆拟合:cv.e...原创 2018-05-26 17:57:34 · 1014 阅读 · 0 评论 -
OpenCV学习笔记-形状匹配
函数cv.matchShape()可以帮我们比较两个形状或轮廓的相似度。如果返回值越小,匹配越好。它是根据Hu矩来计算的。Hu矩是归一化中心矩的线性组合,之所以这样做是为了能够获取代表图像的某个特征的矩函数。这些矩函数对某些变化如缩放,旋转,镜像映射(除了h1)具有不变形。具体代码:def matchshape_demo(): #性状匹配 img1 = cv.imread('img...原创 2018-05-27 18:38:41 · 9542 阅读 · 0 评论 -
OpenCV学习笔记-腐蚀和膨胀
形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。一、腐蚀这个操作会把前景物体的边界腐蚀掉(但是前景仍然是白色)。卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为0。作用:1、前景物体会变小,整幅图像的白色区域会减少,这对于去除白噪声很有用。2、平滑对象边缘3、弱化或分割图像之间的半岛型连接代码:def erode_...原创 2018-05-28 12:13:27 · 7606 阅读 · 0 评论 -
OpenCV学习笔记-顶帽、黑帽、形态学梯度
一、顶帽又称礼帽,是原始图像与进行开运算之后得到的图像的差。因为开运算到来的结果是放大了裂痕或者局部低亮度的区域,因此,从原图中减去运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。二、黑帽是原始图像与进行闭运算以后得到...原创 2018-05-29 15:40:37 · 13561 阅读 · 0 评论 -
OpenCV学习笔记-分水岭算法
分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特征。其他图像分割方法,如阈值,边缘检测等都不会考虑像素在空间关系上的相似性和封闭性这一概念,彼此像素间互相独立,没有统一性。分水岭算法较其他分割方法更具有思想性,更符合人眼对图像的印象。任意的灰度图像...原创 2018-05-29 19:53:29 · 3694 阅读 · 2 评论 -
OpenCV学习笔记-人脸检测
一、人脸检测方法在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Harr特征和LBP特征。具体的介绍参考:图像特征提取三大法宝:HOG特征,LBP特征,Haar特征在OpenCV中,使用已经训练好的XML格式的分类器进行人脸检测。在OpenCV-master的data文件夹下。OpenCV-master的下载资源在连接:OpenCV-master上图中文件夹的名字‘harrcasca...原创 2018-05-30 13:00:35 · 585 阅读 · 0 评论 -
OpenCV学习笔记-图像分割之GrabCut
一、原理GrabCut是graph cut的改进版,是迭代的graph cut。该算法利用了图像中的纹理(颜色)信息和边界(反差)信息,只要小量的用户交互操作即可得到比较好的分割效果。计算原理参考:点击打开链接,点击打开链接在整个过程发什么了什么呢?1、用户输入一个矩形。矩形外的所有区域肯定是背景。矩形框内的东西是未知的。同样用户确定前景和背景的任何操作都不会被程序改变。2、计算机会对我们的输入图...原创 2018-05-30 15:32:33 · 6247 阅读 · 1 评论 -
OpenCV学习笔记-傅里叶变换
速度话不多说,先推荐一下大佬的文章:傅里叶变换详解一、傅里叶变换傅里叶变换可以将一副图片分解为正弦和余弦两个分量,换言之,它可以将一幅图像从空间域(spatial domain)转换为频域(frequency domain)。这种变换的思想是任何函数可以很精确的接近无穷个sin()函数和cos()函数的和。我们来梳理一下概念:空间域一般情况下,空间域的图像是f(x, y) = 灰度级(0-255)...原创 2018-05-31 16:16:41 · 8598 阅读 · 1 评论 -
OpenCV学习笔记-几何变换
一、扩展缩放扩展缩放只是改变图像的大小。OpenCV提供函数cv.resize()实现这个功能。在缩放时推荐使用cv.INTER_AREA,在扩展时推荐使用cv.INTER_CUBIC(慢)和cv.INTER_LINEAR。#扩展缩放def resize_demo(img): #使用缩放因子 res = cv.resize(img, None, fx=2, fy=2, inter...原创 2018-06-01 16:22:42 · 559 阅读 · 0 评论 -
Python+OpenCV实现旋转文本校正
假设我们有一幅图像,图像中的文本被旋转了一个未知的角度。为了对文字进行角度的校正,我们需要完成如下几个步骤:1、检测出图中的文本范围2、计算出文本被旋转的角度3、将图像旋转特定的角度第一步、读取图像,并做二值化处理#读取图像,做二值化处理img = cv.imread('img/imageTextR.png')gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)...原创 2018-06-01 16:43:44 · 11059 阅读 · 1 评论 -
python+opencv基于图像金字塔实现图像融和
图像金字塔主要涉及两个函数:cv.pyrUp()(图像尺寸变小),cv.pyrDown()(图像尺寸变大,但是会模糊)图像金字塔主要有两个类型:高斯金字塔和拉普拉斯金字塔关于定义和讲解在链接:图像金字塔金字塔图像融和的两个重要作用:1、实现两个图像的无缝连接,就如下面的苹果和橘子2、图像压缩,利用小图形(被高斯金字塔变换后的图像)和几层拉普拉斯金字塔表示大图像信息(拉普拉斯金字塔即使图像很大,由于...原创 2018-06-01 19:15:25 · 1861 阅读 · 0 评论 -
OpenCV学习笔记-Harris角点检测
一、引言:关于兴趣点(interest points)在图像处理和计算机视觉领域,兴趣点(interest points),或称做关键点(keypoints)、特征点(feature points)被大量用于解决物体识别,图像识别、图像匹配、视觉跟踪、三维重建等一系列问题。我们不再观察整幅图,而是选择某些特殊的点,然后对它们进行局部有的放矢的分析。如果能检测到足够多的点,同时它们的区分度很高,并且...原创 2018-06-02 20:05:43 · 6830 阅读 · 0 评论 -
OpenCV学习笔记-Shi-Tomasi角点检测
一、原理我们知道Harris角点检测的打分公式为: R = λ1λ2 - k(λ1 + λ2)²但是Shi-Tomasi使用的打分函数为: R = min(λ1, λ2)如果打分超过阈值,我们就认为它是一个角点。我们可以把它绘制...原创 2018-06-02 20:28:32 · 5505 阅读 · 0 评论 -
OpenCV学习笔记-亚像素级精确度的角点-Python版
在学习亚像素级精确度的角点的过程中,我在书中的代码里遇到了几个想不通的地方,在网上百度也都是C++版本的讲解,通过多番查找,总算是弄明白了一点,特此记录一下,以便日后需要时可以回来看看。同时也希望能对学习Python的小伙伴有帮助。转载请注明出处,原创不易----zyh 2018-6-3一、亚像素级精确度的角点如果我们进行图像处理的目的不是用于识别特征点而是进行几何测量,则通常需要更高的精度,而c...原创 2018-06-03 16:40:29 · 6993 阅读 · 3 评论 -
OpenCV学习笔记-SIFT
一、原理参考大神的博客,介绍的非常详细SIFT算法详解二、函数介绍opencv 3.x中的部分函数有改变:SIFT、SURF等都在cv.xfeatures2d模块中函数sift.detect()可以在图像中找到关键点。如果想在图像中的一个区域搜索的话,可以创建一个掩模图像作为参数使用。返回的关键点是个带有很多不同属性的特殊结构体,这些属性如下:pt: 表示图像中关键点的X坐标和Y坐标size...原创 2018-06-03 19:45:23 · 6618 阅读 · 0 评论 -
OpenCV学习笔记-SURF
一、原理参考两位大神的博客:原理解释:SURF原理解释数学公式:SURF数学公式二、函数及代码因为版本改动的原因,所以一些书上的代码都报错了,这个是能运行的代码。首先我们先初始化SURF函数,并可以直接指定hessianthreshold的值,通过surf.getHessianThreshold()可以查看HessianThreshold的值。我们也可以通过surf.setHessianThres...原创 2018-06-03 20:49:17 · 2125 阅读 · 0 评论 -
OpenCV学习笔记-角点检测的FAST算法
一、原理在实时的视频流处理中,需要对每一帧特征提取,对算法处理速度上有很高的要求,传统的SIFT,Harris等特征点提取很难满足。由此提出Fast(Features from Accelerated Segment Test),由于不涉及尺度,梯度,等复杂运算,Fast检测器速度非常快。它使用一定邻域内像元的灰度值与中心点比较大小去判断是否为一个角点。但它的缺点是不具有方向性,尺度不变性。二、使...原创 2018-06-04 20:59:24 · 910 阅读 · 0 评论 -
OpenCV学习笔记-BRIEF
原理转载自https://blog.csdn.net/luoshixian099/article/details/48338273,后面的代码是我用python实现的还有两个博主的讲解也很清楚:点击打开链接,点击打开链接传统的特征点描述子如SIFT,SURF描述子,每个特征点采用128维(SIFT)或者64维(SURF)向量去描述,每个维度上占用4字节,SIFT需要128×4=512字节内存,SU...转载 2018-06-04 21:43:58 · 1713 阅读 · 0 评论 -
OpenCV学习笔记-ORB
一、原理具体原理参考博客:ORB原理,这里只是简单介绍SIFT 和 SURF 算法是有专利保护的 如果你 使用它们 就可能要花钱 。但是 ORB 不需要ORB基本是FAST关键点检测和BRIEF关键点描述符的结合体, 并很多修改增强了性能。 先它使用 FAST 找到关键点, 然后再使用 Harris 角点检测对 这些关键 点进行 排序找到其中的前 N 个点。它也使用 金字塔从而产生尺度不变性特...原创 2018-06-05 09:17:53 · 5852 阅读 · 4 评论 -
OpenCV学习笔记-brute_force特征匹配
Brute-Force匹配器也就是蛮力匹配器,顾名思义,它的工作原理是:在第一幅图像上选取一个关键点,然后依次与第二幅图像的每个关键点进行(描述符)距离测试,最后返回距离最近的关键点。对于BF匹配器,我们首先要使用cv.BFMatcher()创建一个BFMatcher对象。它有两个可选参数。第一个是normType,它用来指定要使用的距离测试类型。默认值为cv.NORM_L2,这个类型很适合SIF...原创 2018-06-05 11:02:49 · 6270 阅读 · 3 评论 -
OpenCV学习笔记-FLANN匹配器
FLANN是快速最近邻搜索包(Fast_Library_for_Approximate_Nearest_Neighbors)的简称。它是一个对大数据集和高维特征进行最近邻搜索的算法的集合,而且这些算法都已经被优化过了。在面对大数据集是它的效果要好于BFMatcher。使用FLANN匹配,我们需要传入两个字典作为参数。这两个用来确定要使用的算法和其他相关参数等。第一个是indexParams。配置我...原创 2018-06-05 11:29:03 · 21258 阅读 · 3 评论 -
OpenCV学习笔记-单应性查找对象
我们使用一个查询图像,在其中找到一些特征点(关键点),我们又在另一幅图像中也找到了一些特征点,最后对这两幅图像之间的特征点进行匹配。简单来说就是:我们在一张杂乱的图像中找到了一个对象(的某些部分)的位置。这些信息足以帮助我们在目标图像中准确的找到(查询图像)对象。为了达到这个目的我们可以使用calib3d模块中的cv.findHomography()函数。如果将这两幅图像中的特征点集传给这个函数,...原创 2018-06-05 14:50:00 · 1229 阅读 · 0 评论 -
OpenCV学习笔记-MeanShift
一、原理假设我们有一堆点(比如直方图反向投影得到的点),和一个小的圆形窗口,我们要完成的任务就是将这个窗口移动到最大灰度密度处(也就是点最多的地方)。如下图所示:初始窗口是蓝色的C1,它的圆心为蓝色方框的C1_o,而窗口中所有点质心却是C1_r,很明显圆心和点的质心没有重合。所以移动圆心C1_o到质心C1_r,这样我们就得到了一个新的窗口。这时又可以找到新的窗口内所以点的质心,大多数情况下还是不重...原创 2018-06-06 18:07:59 · 5819 阅读 · 1 评论 -
OpenCV学习笔记-CamShift
CamShift算法的全称是"Continuously Adaptive Mean-SHIFT",即:连续自适应的MeanShift算法。其基本思想是对视频序列的所有图像帧都作MeanShift运算,并将上一帧的结果(即搜索窗口的中心位置和窗口大小)作为下一帧MeanShift算法的搜索窗口的初始值,如此迭代下去。简单点说,meanShift是针对单张图片寻找最优迭代结果,而camShift则是针...原创 2018-06-06 20:15:25 · 460 阅读 · 0 评论 -
OpenCV学习笔记-光流
一、光流由于目标对象或者摄像机的移动造成的图像对象在连续两帧图像中的移动被称为光流。它是一个2D向量场,可以用来显示一个点从第一帧图像到第二帧图像的移动。光流是基于以下假设的:1、在连续的两帧图像之间(目标对象的)像素的灰度值不改变2、相邻的像素具有相同的运动具体数学原理参考:https://blog.csdn.net/sophia_tone2w/article/details/51166946,...原创 2018-06-06 21:15:56 · 832 阅读 · 0 评论 -
OpenCV学习笔记-视频文件的读写
定义视频写入类VideoWriter类 必须初始化四个值(文件路径+文件名, 视频编解码器, 帧速率, 帧大小)需要的属性可以通过VideoCapture类的get函数获得视频编解码器:cv.VideoWriter_fourcc('I', '4', '2', '0'):该选项是一个未压缩的YUV颜色编码,是4:2:0色度子采样。这种编码有很好的兼容性,但是会产生较大文件,但会产生较大文件,文件扩展...原创 2018-06-18 22:29:01 · 559 阅读 · 0 评论 -
OpenCV学习笔记-图像翻转和鼠标操作
函数为flip(src, flipCode, dst=None)flipCode:翻转模式,flipCode==0垂直翻转(沿X轴翻转),flipCode>0水平翻转(沿Y轴翻转),flipCode<0水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180°)在摄像头上应用:import cv2 as cvclicked = Falsedef onMouse(event, x...原创 2018-06-19 09:50:11 · 499 阅读 · 0 评论