OpenCV 边缘检测

作者:法纳斯特 时间:2023-08-19 22:54:20 

边缘在人类视觉和计算机视觉中均起着重要的作用。

人类能够仅凭一张背景剪影或一个草图就识别出物体类型和姿态。

其中OpenCV提供了许多边缘检测滤波函数,这些滤波函数都会将非边缘区域转为黑色,将边缘区域转为白色或其他饱和的颜色。

不过这些滤波函数都很容易将噪声错误地识别为边缘,所以需要进行模糊处理。

本次的模糊操作使用高斯模糊(低通滤波器),最常用的模糊滤波器(平滑滤波器)之一,是一个削弱高频信号强度的低通滤波器。

低通滤波器,在像素与周围像素的亮度差值小于一个特定值时,平滑该像素的亮度,主要用于去噪和模糊化。

边缘检测则是使用OpenCV的Canny函数实现,算法虽然很复杂,但是代码却很简单。

5个步骤,使用高斯滤波器对图像去噪、计算梯度、在边缘上使用非最大抑制(NMS)、在检测到的边缘上使用双(double)阈值去除阳性(false positive)、分析所有的边缘及其连接,保留真正的边缘并消除不明显的边缘。

下面就来实现一下「跳一跳」的边缘检测,得以获取方块的中心位置。

/ 01 / 边缘检测

Canny边缘检测代码如下。


import cv2
import 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.shape
print(H, W)

输出的图像高宽分别为1920和1080。

下面是原图像灰度图和边缘检测图像。

OpenCV 边缘检测

接下来,通过边缘检测图像找到方块的第一个顶点(上顶点)。


# 第一个顶点的高度,row为列表(代表每一行的像素值),max(row)获取列表中最大的像素值
y_top = np.nonzero([max(row) for row in canny_img[400:]])[0][0] + 400

对图像高度大于400的行进行遍历(这样可以去除上方数字270以及小程序块的影响)。

np.nonzero()表示获取列表元素数值不为0的位置,第一个即为上顶点的高度值。

OpenCV 边缘检测

接下来获取上顶点的宽度值。


# 第一个顶点的宽度
x_top = int(np.mean(np.nonzero(canny_img[y_top])))

这里发现有好几个水平点,所以最后取平均值。

接下来对方块下顶点的位置进行确定。

OpenCV 边缘检测

为了跳过小白圈的影响,在上顶点高度的基础上加上80个像素大小。

然后往下方遍历,宽度值保持不变,直至找到像素值不为0的点。

便得到了方块的下顶点坐标。


# 跳过小白圈,然后遍历
y_bottom = y_top + 80
for 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()

最后通过上下顶点的坐标,得到方块的中心点。

OpenCV 边缘检测

左图为边缘检测原图,右图为找到方块中心点并以中心点为圆心绘制圆形的图像。

/ 02 / 跳动实现

现在结合之前模板匹配获得到的小跳棋位置,计算两中心的距离。

勾三股四弦五,便能得到两个中心的距离了。

看下图,一目了然。

OpenCV 边缘检测

玩过跳一跳的应该都知道,对于不同的距离,我们需要按压的时间是不同的。

所以可以给距离和按压时间设置一个相关参数,此处设置为1.35。

对于我的手机简直完美匹配(与屏幕大小有关)。

最后通过adb命令完成一定的按压时间,完成「跳一跳」自动化。

总结

以上所述是小编给大家介绍的OpenCV 边缘检测,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:https://mp.weixin.qq.com/s?__biz=MzU4OTYzNjE2OQ==&mid=2247485367&idx=1&sn=c17df276ea6020e430b0be090ad563af&chksm=fdcb3091cabcb987b61b9fa229b13bc2f0e154da87d6b85597ab55b6d0071e3e0b7dafd2afb9&scene=21#wechat_redirect

标签:OpenCV,边缘,检测
0
投稿

猜你喜欢

  • Python编程pytorch深度卷积神经网络AlexNet详解

    2022-02-18 10:28:40
  • python 内置函数-range()+zip()+sorted()+map()+reduce()+filter()

    2022-09-23 19:48:01
  • 如何实现在下拉菜单里输入文字?

    2010-06-03 10:31:00
  • Django实现自定义404,500页面教程

    2021-06-20 06:23:07
  • python 包之 Pillow 图像处理教程分享

    2022-02-22 01:22:48
  • Python学习笔记之Break和Continue用法分析

    2023-02-12 04:55:32
  • MySQL数据库性能优化之表结构优化

    2012-05-08 07:10:34
  • Python Pandas 修改表格数据类型 DataFrame 列的顺序案例

    2023-02-27 17:47:37
  • python正则匹配查询港澳通行证办理进度示例分享

    2021-05-09 19:29:55
  • MySQL 密码设置

    2024-01-28 11:53:59
  • Vue项目的网络请求代理到封装步骤详解

    2024-04-30 10:23:55
  • mysql定时自动备份数据库的方法步骤

    2024-01-15 10:01:19
  • pydantic-resolve嵌套数据结构生成LoaderDepend管理contextvars

    2023-01-12 22:21:05
  • python 中字典嵌套列表的方法

    2022-05-17 04:54:15
  • 使用pycharm和pylint检查python代码规范操作

    2023-06-06 08:02:38
  • python ddt实现数据驱动

    2021-11-11 02:37:08
  • python文件及目录操作代码汇总

    2022-08-19 14:07:27
  • OpenCV-Python模板匹配人眼的实例

    2022-10-22 06:09:23
  • Python线性网络实现分类糖尿病病例

    2022-03-13 11:23:25
  • 使用Tensorflow将自己的数据分割成batch训练实例

    2023-06-14 08:18:07
  • asp之家 网络编程 m.aspxhome.com