时间:2021-05-22
边缘在人类视觉和计算机视觉中均起着重要的作用。
人类能够仅凭一张背景剪影或一个草图就识别出物体类型和姿态。
其中OpenCV提供了许多边缘检测滤波函数,这些滤波函数都会将非边缘区域转为黑色,将边缘区域转为白色或其他饱和的颜色。
不过这些滤波函数都很容易将噪声错误地识别为边缘,所以需要进行模糊处理。
本次的模糊操作使用高斯模糊(低通滤波器),最常用的模糊滤波器(平滑滤波器)之一,是一个削弱高频信号强度的低通滤波器。
低通滤波器,在像素与周围像素的亮度差值小于一个特定值时,平滑该像素的亮度,主要用于去噪和模糊化。
边缘检测则是使用OpenCV的Canny函数实现,算法虽然很复杂,但是代码却很简单。
5个步骤,使用高斯滤波器对图像去噪、计算梯度、在边缘上使用非最大抑制(NMS)、在检测到的边缘上使用双(double)阈值去除阳性(false positive)、分析所有的边缘及其连接,保留真正的边缘并消除不明显的边缘。
下面就来实现一下「跳一跳」的边缘检测,得以获取方块的中心位置。
/ 01 / 边缘检测
Canny边缘检测代码如下。
import cv2import numpy as np# 读取原图像img = cv2.imread('game.png', 0)# 显示原图像cv2.namedWindow('img', 0)cv2.resizeWindow('img', 400, 600)cv2.imshow('img', img)# 高斯模糊img_rgb = cv2.GaussianBlur(img, (5, 5), 0)canny_img = cv2.Canny(img_rgb, 1, 10)# 显示边缘检测图像cv2.namedWindow('canny', 0)cv2.resizeWindow('canny', 400, 600)cv2.imshow('canny', canny_img)# 输出边缘检测图像的高和宽H, W = canny_img.shapeprint(H, W)输出的图像高宽分别为1920和1080。
下面是原图像灰度图和边缘检测图像。
接下来,通过边缘检测图像找到方块的第一个顶点(上顶点)。
# 第一个顶点的高度,row为列表(代表每一行的像素值),max(row)获取列表中最大的像素值y_top = np.nonzero([max(row) for row in canny_img[400:]])[0][0] + 400对图像高度大于400的行进行遍历(这样可以去除上方数字270以及小程序块的影响)。
np.nonzero()表示获取列表元素数值不为0的位置,第一个即为上顶点的高度值。
接下来获取上顶点的宽度值。
# 第一个顶点的宽度x_top = int(np.mean(np.nonzero(canny_img[y_top])))这里发现有好几个水平点,所以最后取平均值。
接下来对方块下顶点的位置进行确定。
为了跳过小白圈的影响,在上顶点高度的基础上加上80个像素大小。
然后往下方遍历,宽度值保持不变,直至找到像素值不为0的点。
便得到了方块的下顶点坐标。
# 跳过小白圈,然后遍历y_bottom = y_top + 80for row in range(y_bottom, H): if canny_img[row, x_top] != 0: y_bottom = row break# 得到方块的中心点x_center, y_center = x_top, (y_top + y_bottom) // 2# 绘制以方块中心点为圆心的圆cv2.circle(canny_img, (x_center, y_center), 33, (255, 0, 255), 2)# 显示得到的图像cv2.namedWindow('result', 0)cv2.resizeWindow('result', 400, 600)cv2.imshow('result', canny_img)# 结束cv2.waitKey(0)cv2.destroyAllWindows()最后通过上下顶点的坐标,得到方块的中心点。
左图为边缘检测原图,右图为找到方块中心点并以中心点为圆心绘制圆形的图像。
/ 02 / 跳动实现
现在结合之前模板匹配获得到的小跳棋位置,计算两中心的距离。
勾三股四弦五,便能得到两个中心的距离了。
看下图,一目了然。
玩过跳一跳的应该都知道,对于不同的距离,我们需要按压的时间是不同的。
所以可以给距离和按压时间设置一个相关参数,此处设置为1.35。
对于我的手机简直完美匹配(与屏幕大小有关)。
最后通过adb命令完成一定的按压时间,完成「跳一跳」自动化。
总结
以上所述是小编给大家介绍的OpenCV 边缘检测,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会
及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
python+opencv车道线检测(简易实现),供大家参考,具体内容如下技术栈:python+opencv实现思路:1、canny边缘检测获取图中的边缘信息;
我尝试了两种方式用opencv对指针仪表进行读数识别,1.先模板匹配,然后边缘检测+霍夫直线2.按轮廓大小过滤,然后边缘检测+霍夫直线两种方式对光线都非常敏感其
本文实例为大家分享了Opencv实现最小外接矩形和圆的具体代码,供大家参考,具体内容如下步骤:将一幅图像先转灰度,再canny边缘检测得到二值化边缘图像,再寻找
最近自己在做一个有关图像处理的小项目,涉及到图像的边缘检测、直线检测、轮廓检测以及角点检测等,本文首先介绍图像的边缘检测,使用的是Canny边缘检测算法,具体代
边缘检测Canny边缘检测器是一种被广泛使用的算法,并被认为是边缘检测最优的算法,该方法使用了比高斯差分算法更复杂的技巧,如多向灰度梯度和滞后阈值化。Canny