![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
OpenCV
ʚVVcatɞ
时光难留,只有一去不返。
展开
-
树莓派摄像头实现 红线循迹
实现效果:原创 2021-11-07 05:39:28 · 2747 阅读 · 1 评论 -
Raspberry Pi 4B 同步控制两个舵机 实现颜色跟踪
组件:Raspberry Pi 4B 2G5V TS90A 舵机 2个转动角度:0°~180°工作电压:4.8V-5V控制信号:PWM 50HZ/0.5-2.5MS环境Python:3.7.3TS90A 舵机如下图:两个舵机连接树莓派如下图:舵机三条线定义:棕色GND红色VCC 4.8-7.2V 一般用5V橙色:脉冲输入接树莓派的GPIO口参数:无负载速度:0.09秒/60度(4.8V)从 0 ~180° 大约需要 0.27 s,所以设定 sleep原创 2021-09-08 19:49:18 · 2739 阅读 · 1 评论 -
OpenCV 升降维度
import matplotlib.pyplot as pltimport cv2 as cvimport numpy as npimage = cv.imread("1.png") # opencv读进来的彩色图片维度是(高度,宽度,通道数)。数据类型是uint8。plt.imshow(image[:, :, ::-1])print(image.shape) # HWC(高度,宽度,通道数)print(image.dtype) # 数据类型 uint8blob = cv.resize(原创 2021-08-02 11:40:27 · 2070 阅读 · 0 评论 -
OpenCV AprilTags 识别
在windows中安装 apriltags 库:pip install pupil-apriltags代码部分:import pupil_apriltags as apriltag # 在 windows 下引入该库import cv2img = cv2.imread('1.jpg', cv2.IMREAD_GRAYSCALE)detector = apriltag.Detector()result = detector.detect(img)print(result)识别原创 2021-07-11 18:27:11 · 6878 阅读 · 9 评论 -
OpenCV 双边滤波
def bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=None)src:源图像,需要为8位或者浮点型单通道、三通道的图像。d:表示在过滤过程中每个像素邻域的直径。sigmaColor:颜色空间滤波器的sigma值。这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域。sigmaSpace:坐标空间中滤波器的sigma值,坐标空间的标注方差。他的数值越大,意味着越远的像原创 2021-05-22 16:32:52 · 107 阅读 · 1 评论 -
OpenCV 对图片亮度增强或减弱
对每个像素点的三通道值进行同步放大,同时保持通道值在0-255之间将图像中的像素限制在最小值和最大值之间,超过此区间的值赋值为最小值或最大值图片亮度增强import cv2import numpy as npimport matplotlib.pyplot as pltimg = cv2.imread('1.png', 1)height, width = img.shape[:2]dst = np.zeros((height, width, 3), np.uint8)for i in原创 2021-05-22 16:09:40 · 1717 阅读 · 4 评论 -
OpenCV 透视变换
计算透视变换所需的参数矩阵:def cal_perspective_params(img, points): # 设置偏移点。如果设置为(0,0),表示透视结果只显示变换的部分(也就是画框的部分) offset_x = 350 offset_y = 0 img_size = (img.shape[1], img.shape[0]) src = np.float32(points) # 俯视图中四点的位置 dst = np.float32([[offs原创 2021-05-17 18:11:56 · 1043 阅读 · 0 评论 -
OpenCV 相机校正
1. 相机标定根据张正友校正算法,利用棋盘格数据校正对车载相机进行校正,计算其内参矩阵,外参矩阵和畸变系数。标定的流程是:准备棋盘格数据,即用于标定的图片对每一张图片提取角点信息在棋盘上绘制提取到的角点(非必须,只是为了显示结果)利用提取的角点对相机进行标定获取相机的参数信息2.关于相机校正用到的几个API:寻找棋盘图中的棋盘角点rect, corners = cv2.findChessboardCorners(image, pattern_size, flags)参数:原创 2021-05-17 14:32:03 · 962 阅读 · 0 评论 -
OpenCV 车道线提取
本案例基于图像的梯度和颜色特征,定位车道线的位置。在这里选用Sobel边缘提取算法,Sobel相比于Canny的优秀之处在于,它可以选择横向或纵向的边缘进行提取。从车道的拍摄图像可以看出,车道线在横向上的边缘突变是需要关心的问题。OpenCV提供的cv2.Sobel()函数,将进行边缘提取后的图像做二进制图的转化,即提取到边缘的像素点显示为白色(值为1),未提取到边缘的像素点显示为黑色(值为0)。由于只使用边缘检测,在有树木阴影覆盖的区域时,虽然能提取出车道线的大致轮廓,但会同时引入的噪声,给后续处理带来原创 2021-05-16 00:08:25 · 1452 阅读 · 2 评论 -
OpenCV camshift目标追踪
camshift算法是对meanshift算法的改进,首先应用meanshift,一旦meanshift收敛,它就会更新窗口的大小,还计算最佳拟合椭圆的方向,从而根据目标的位置和大小更新搜索窗口。camshift算法:可适应运动目标的大小形状的改变,具有较好的跟踪效果,但当背景色和目标颜色接近时,容易使目标的区域变大,最终有可能导致目标跟踪丢失。import cv2 as cvimport numpy as np# 1.获取图像cap = cv.VideoCapture('./1.mp4')原创 2021-04-26 21:31:13 · 281 阅读 · 0 评论 -
OpenCV 简单的人脸识别
OpenCV中自带已训练好的检测器,包括面部,眼睛,猫脸等,都保存在XML文件中,我们可以通过以下程序找到他们:import cv2 as cvprint(cv.__file__)找到的文件如下所示:opencv中人脸识别的流程是:读取图片,并转换成灰度图实例化人脸和眼睛检测的分类器对象# 实例化级联分类器classifier =cv.CascadeClassifier( "haarcascade_frontalface_default.xml" ) # 加载分类器cla原创 2021-04-26 19:54:15 · 325 阅读 · 1 评论 -
OpenCV meanshift目标追踪
cv.meanShift(probImage, window, criteria)参数:probImage: ROI区域,即目标的直方图的反向投影window: 初始搜索窗口,就是定义ROI的rectcriteria: 确定窗口搜索停止的准则,主要有迭代次数达到设置的最大值,窗口中心的漂移值大于某个设定的限值等。实现Meanshift的主要流程是:读取视频文件:cv.videoCapture()感兴趣区域设置:获取第一帧图像,并设置目标区域,即感兴趣区域计算直方图:计算感原创 2021-04-26 19:06:57 · 821 阅读 · 0 评论 -
OpenCV 保存视频
在OpenCV中保存视频使用的是VedioWriter对象,在其中指定输出文件的名称,如下所示:1.创建视频写入的对象out = cv2.VideoWriter(filename,fourcc, fps, frameSize)参数:filename:视频保存的位置fourcc:指定视频编解码器的4字节代码fps:帧率frameSize:帧大小2.设置视频的编解码器,如下所示,retval = cv2.VideoWriter_fourcc( c1, c2, c3, c4 )参数:原创 2021-04-26 18:10:16 · 11547 阅读 · 3 评论 -
OpenCV 从文件中读取视频并播放
在OpenCV中我们要获取一个视频,需要创建一个VideoCapture对象,指定你要读取的视频文件:1.创建读取视频的对象cap = cv.VideoCapture(filepath)参数:filepath: 视频文件路径2.视频的属性信息2.1 获取视频的某些属性,retval = cap.get(propId)参数:propId: 从0到18的数字,每个数字表示视频的属性常用属性有:索引flags意义0cv2.CAP_PROP_POS_MS原创 2021-04-26 17:50:53 · 3042 阅读 · 2 评论 -
OpenCV BRIEF角点检测
BRIEF是一种特征描述子提取算法,并非特征点的提取算法,一种生成二值化描述子的算法,不提取代价低,匹配只需要使用简单的汉明距离利用比特之间的异或操作就可以完成。因此,时间代价低,空间代价低,效果还挺好是最大的优点。实例化STARstar = cv2.xfeatures2d.StarDetector_create()实例化BRIEFbrief = cv2.xfeatures2d.BriefDescriptorExtractor_create()利用star.detect检测关键点,没有对应的关原创 2021-04-26 16:29:14 · 336 阅读 · 0 评论 -
OpenCV ORB角点检测
实例化ORBorb = cv.ORB_create(nfeatures)参数:nfeatures:特征点的最大数量利用orb.detectAndCompute()检测关键点并计算kp, des = orb.detectAndCompute(gray, None)参数:gray:进行关键点检测的图像(灰度图像)返回:kp:关键点信息,包括位置,尺度,方向信息des:关键点描述符,每个关键点BRIEF特征向量,二进制字符串。将关键点检测结果绘制在图像上cv.drawKey原创 2021-04-26 15:38:36 · 896 阅读 · 0 评论 -
OpenCV Fast角点检测
import numpy as npimport cv2 as cvfrom matplotlib import pyplot as plt# 1.读取图像img = cv.imread("./1.jpg")# 2.Fast角点检测# 2.1创建一个Fast对象,传入阀值,注意:可以处理彩色空间图像fast = cv.FastFeatureDetector_create(threshold=30)# 2.2检测图像上的关键点kp = fast.detect(img, None)#原创 2021-04-26 10:59:02 · 692 阅读 · 0 评论 -
OpenCV SIFT检测关键点
SIFT原理:尺度空间极值检测:构建高斯金字塔,高斯差分金字塔,检测极值点。关键点定位:去除对比度较小和边缘对极值点的影响。关键点方向确定:利用梯度直方图确定关键点的方向。关键点描述:对关键点周围图像区域分块,计算块内的梯度直方图,生成具有特征向量,对关键点信息进行描述。在OpenCV中利用SIFT检测关键点的流程如下所示:1.实例化siftsift = cv.xfeatures2d.SIFT_create()2.利用sift.detectAndCompute()检测关原创 2021-04-26 10:24:58 · 810 阅读 · 0 评论 -
OpenCV Shi-Tomasi角点检测
Shi-Tomasi算法是对Harris角点检测算法的改进,一般会比Harris算法得到更好的角点。Harris 算法的角点响应函数是将矩阵 M 的行列式值与 M 的迹相减,利用差值判断是否为角点。后来Shi 和Tomasi 提出改进的方法是,若矩阵M的两个特征值中较小的一个大于阈值,则认为他是角点,即:如下图所示:从这幅图中,可以看出来只有当 λ1 和 λ 2 都大于最小值时,才被认为是角点。corners = cv2.goodFeaturesToTrack ( image, maxcorner原创 2021-04-25 20:22:06 · 355 阅读 · 0 评论 -
OpenCV Harris角点检测
Harris角点检测的思想是通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化,如下图所示:.判断角点,如下图所示:当R为大数值的正数时是角点当R为大数值的负数时是边界当R为小数是认为是平坦区域dst=cv.cornerHarris(src, blockSize, ksize, k)img:数据类型为 float32 的输入图像。blockSize:角点检测中要考虑的邻域大小。ksize:sobel求导使用的核大小k :角点检测原创 2021-04-25 20:07:59 · 182 阅读 · 0 评论 -
OpenCV 霍夫圆检测
圆的表示式是:其中aa和bb表示圆心坐标,rr表示圆半径,因此标准的霍夫圆检测就是在这三个参数组成的三维空间累加器上进行圆形检测,此时效率就会很低,所以OpenCV中使用霍夫梯度法进行圆形的检测。霍夫梯度法将霍夫圆检测范围两个阶段,第一阶段检测圆心,第二阶段利用圆心推导出圆半径。圆心检测的原理:圆心是圆周法线的交汇处,设置一个阈值,在某点的相交的直线的条数大于这个阈值就认为该交汇点为圆心。圆半径确定原理:圆心到圆周上的距离(半径)是相同的,确定一个阈值,只要相同距离的数量大于该阈值,就认为原创 2021-04-25 18:57:27 · 1881 阅读 · 0 评论 -
OpenCV 霍夫线检测
实现流程假设有一个大小为100*∗100的图片,使用霍夫变换检测图片中的直线,则步骤如下所示:直线都可以使用(ρ,θ) 表示,首先创建一个2D数组,我们叫做累加器,初始化所有值为0,行表示ρ,列表示θ。该数组的大小决定了结果的准确性,若希望角度的精度为1度,那就需要180列。对于ρ,最大值为图片对角线的距离,如果希望精度达到像素级别,行数应该与图像的对角线的距离相等。取直线上的第一个点(x,y)(x,y),将其带入直线在极坐标中的公式中,然后遍历θ的取值:0,1,2,…,180,分别求出对应的原创 2021-04-25 16:58:19 · 203 阅读 · 0 评论 -
OpenCV 模板匹配
所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最终将匹配度最高的区域选择为最终的结果。实现流程:准备两幅图像:1.原图像(I):在这幅图中,找到与模板相匹配的区域2.模板(T):与原图像进行比对的图像块滑动模板图像和原图像进行比对:将模板块每次移动一个像素 (从左往右,从上往下),在每一个位置,都计算与模板图像的相似程度。对于每一个位置将计算的相似结果保原创 2021-04-25 15:27:49 · 246 阅读 · 0 评论 -
OpenCV Canny边缘检测
Canny算法:流程:噪声去除:高斯滤波计算图像梯度:sobel算子,计算梯度大小和方向非极大值抑制:利用梯度方向像素来判断当前像素是否为边界点滞后阈值:设置两个阈值,确定最终的边界Canny()函数:canny = cv2.Canny(image, threshold1, threshold2)image:灰度图,threshold1: minval,较小的阈值将间断的边缘连接起来threshold2: maxval,较大的阈值检测图像中明显的边缘import cv2 a原创 2021-04-25 14:57:50 · 273 阅读 · 0 评论 -
OpenCV Laplacian算子
laplacian = cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])Src: 需要处理的图像,Ddepth: 图像的深度,-1表示采用的是原图像相同的深度,目标图像的深度必须大于等于原图像的深度;ksize:算子的大小,即卷积核的大小,必须为1,3,5,7。import cv2 as cvfrom matplotlib import pyplot as plt# 1 读取图像img =原创 2021-04-25 14:46:55 · 299 阅读 · 0 评论 -
OpenCV Sobel检测算子和Scharr检测算子
Sobel边缘检测算法比较简单,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,但是很多实际应用的场合,sobel边缘却是首选,Sobel算子是高斯平滑与微分操作的结合体,所以其抗噪声能力很强,用途较多。尤其是效率要求较高,而对细纹理不太关心的时候。Sobel_x_or_y = cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)src:传入的图像ddepth: 图像的深度原创 2021-04-25 14:31:23 · 170 阅读 · 0 评论 -
OpenCV 自适应的直方图均衡化
自适应的直方图均衡化整幅图像会被分成很多小块,这些小块被称为“tiles”。然后再对每一个小块分别进行直方图均衡化。如果有噪声的话,噪声会被放大。为了避免这种情况的出现要使用对比度限制。对于每个小块来说,如果直方图中的 bin 超过对比度的上限的话,就把 其中的像素点均匀分散到其他 bins 中,然后在进行直方图均衡化。cv.createCLAHE(clipLimit, tileGridSize)clipLimit: 对比度限制,默认是40tileGridSize: 分块的大小,在 OpenC原创 2021-04-25 14:02:20 · 1942 阅读 · 0 评论 -
OpenCV 直方图均衡化
“直方图均衡化”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在更广泛灰度范围内的分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。这种方法提高图像整体的对比度,特别是有用数据的像素值分布比较接近时,在X光图像中使用广泛,可以提高骨架结构的显示,另外在曝光过度或不足的图像中可以更好的突出细节。dst = cv.equalizeHist(img)img: 灰度图像函数返回结果:dst : 均衡化后的结果import cv2 as .原创 2021-04-25 12:02:40 · 167 阅读 · 0 评论 -
OpenCV 掩膜的应用
掩膜是用选定的图像、图形或物体,对要处理的图像进行遮挡,来控制图像 处理的区域。在数字图像处理中,通常使用二维矩阵数组进行掩膜。掩膜是由0和1组成一个二进制图像,利用该掩膜图像要处理的图像进行掩膜,其中1值的区域被处理,0 值区域被屏蔽,不会处理。掩膜的主要用途是:提取感兴趣区域:用预先制作的感兴趣区掩模与待处理图像进行”与“操作,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0。屏蔽作用:用掩模对图像上某些区域作屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。原创 2021-04-24 16:35:01 · 1116 阅读 · 1 评论 -
OpenCV 直方图的计算和绘制
图像直方图 是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素个数。这种直方图中,横坐标的左侧为较暗的区域,而右侧为较亮的区域。因此一张较暗图片的直方图中的数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反。直方图的意义:直方图是图像中像素强度分布的图形表达方式。它统计了每一个强度值所具有的像素个数。不同的图像的直方图可能是相同的使用OpenCV中的方法统计直方图,并使用matplotlib将其绘制出来。cv2.calcHist(images,channels,原创 2021-04-24 15:54:11 · 165 阅读 · 0 评论 -
OpenCV 中值滤波
中值滤波是一种典型的非线性滤波技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值。中值滤波对椒盐噪声(salt-and-pepper noise)来说尤其有用,因为它不依赖于邻域内那些与典型值差别很大的值。cv.medianBlur(src, ksize )src:输入图像ksize:卷积核的大小import cv2 as cvfrom matplotlib import pyplot as plt# 1 图像读取img = cv.imread('./1.jpg')#原创 2021-04-24 15:13:21 · 235 阅读 · 0 评论 -
OpenCV 高斯滤波
如果原图是彩色图片,可以对RGB三个通道分别做高斯平滑。cv2.GaussianBlur(src,ksize,sigmaX,sigmay,borderType)src: 输入图像ksize:高斯卷积核的大小,注意 : 卷积核的宽度和高度都应为奇数,且可以不同sigmaX: 水平方向的标准差sigmaY: 垂直方向的标准差,默认值为0,表示与sigmaX相同borderType:填充边界类型import cv2 as cvfrom matplotlib import pyplot as原创 2021-04-24 14:41:05 · 351 阅读 · 0 评论 -
OpenCV 均值滤波
由一个归一化卷积框完成的。它只是用卷积框覆盖区域所有像素的平均值来代替中心元素。例如,3x3标准化的平均过滤器如下所示:均值滤波的优点是算法简单,计算速度较快,缺点是在去噪的同时去除了很多细节部分,将图像变得模糊。cv.blur(src, ksize, anchor, borderType)src:输入图像ksize:卷积核的大小anchor:默认值 (-1,-1) ,表示核中心borderType:边界类型import cv2 as cvfrom matplotlib ..原创 2021-04-24 13:55:31 · 329 阅读 · 0 评论 -
OpenCV 礼帽和黑帽
礼帽运算原图像与“开运算“的结果图之差,如下式计算:因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。礼帽运算用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。黑帽运算为”闭运算“的结果图与原图像之差。数学表达式为:黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大.原创 2021-04-24 13:28:12 · 885 阅读 · 0 评论 -
OpenCV 开闭运算
开运算和闭运算是将腐蚀和膨胀按照一定的次序进行处理。 但这两者并不是可逆的,即先开后闭并不能得到原来的图像。开运算开运算是先腐蚀后膨胀,其作用是:分离物体,消除小区域。特点:消除噪点,去除小的干扰块,而不影响原来的图像。闭运算闭运算与开运算相反,是先膨胀后腐蚀,作用是消除/“闭合”物体里面的孔洞,特点:可以填充闭合区域。cv.morphologyEx(img, op, kernel)img: 要处理的图像op: 处理方式:若进行开运算,则设为cv.MORPH_OPEN,若进行闭原创 2021-04-24 13:02:02 · 679 阅读 · 0 评论 -
OpenCV 腐蚀和膨胀
腐蚀和膨胀是最基本的形态学操作,腐蚀和膨胀都是针对白色部分(高亮部分)而言的。膨胀就是使图像中高亮部分扩张,效果图拥有比原图更大的高亮区域;腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域。膨胀是求局部最大值的操作,腐蚀是求局部最小值的操作。腐蚀具体操作是:用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做“与”操作,如果都为1,则该像素为1,否则为0。如下图所示,结构A被结构B腐蚀后:腐蚀的作用是:消除物体边界点,使目标缩小,可以消除小于结构元素的噪声原创 2021-04-24 12:35:47 · 2420 阅读 · 2 评论 -
OpenCV 图像金字塔
图像金字塔是图像多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。图像金字塔用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。其通过梯次向下采样获得,直到达到某个终止条件才停止采样。金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似,层级越高,图像越小,分辨率越低。cv.pyrUp() # 对图像进行上采样cv.pyrDown() # 对图像进行下采样im原创 2021-04-24 12:06:23 · 100 阅读 · 0 评论 -
OpenCV 透射变换
透射变换是视角变化的结果,是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。在opencv中,要找到四个点,其中任意三个不共线,然后获取变换矩阵T,再进行透射变换。通过函数cv.getPerspectiveTransform找到变换矩阵,将cv.warpPerspective应用于此3x3变换矩阵。import numpy as npimport cv2 as cvimport m原创 2021-04-23 20:38:09 · 742 阅读 · 0 评论 -
OpenCV 仿射变换
在仿射变换中,原图中所有的平行线在结果图像中同样平行。为了创建这个矩阵需要从原图像中找到三个点以及他们在输出图像中的位置。然后cv2.getAffineTransform 会创建一个 2x3 的矩阵,最后这个矩阵会被传给函数 cv2.warpAffine。import numpy as npimport cv2 as cvimport matplotlib.pyplot as plt# 1 图像读取img = cv.imread("1.png")# 2 仿射变换rows, cols = img.s转载 2021-04-23 20:27:07 · 2753 阅读 · 4 评论 -
OpenCV 图像旋转
在OpenCV中图像旋转首先根据旋转角度和旋转中心获取旋转矩阵,然后根据旋转矩阵进行变换,即可实现任意角度和任意中心的旋转效果。 cv2.getRotationMatrix2D(center, angle, scale)center:旋转中心angle:旋转角度scale:缩放比例M:旋转矩阵调用cv.warpAffine完成图像的旋转import cv2 as cvimport matplotlib.pyplot as plt# 1 读取图像img = cv.imread("1原创 2021-04-23 20:09:19 · 1090 阅读 · 0 评论