#yyds干货盘点#Python图像处理,cv2模块,OpenCV实现边缘检测

白日放歌须纵酒,青春作伴好还乡。这篇文章主要讲述#yyds干货盘点#Python图像处理,cv2模块,OpenCV实现边缘检测相关的知识,希望能为你提供帮助。
前言利用python实现OpenCV实现边缘检测。废话不多说。
让我们愉快地开始吧~
开发工具Python版本: 3.6.4
相关模块:
cv2模块;
numpy模块;
【#yyds干货盘点#Python图像处理,cv2模块,OpenCV实现边缘检测】以及一些Python自带的模块。
环境搭建安装Python并添加到环境变量,pip安装需要的相关模块即可。
边缘检测则是使用OpenCV的Canny函数实现,算法虽然很复杂,但是代码却很简单。
5个步骤,使用高斯滤波器对图像去噪、计算梯度、在边缘上使用非最大抑制(NMS)、在检测到的边缘上使用双(double)阈值去除阳性(false positive)、分析所有的边缘及其连接,保留真正的边缘并消除不明显的边缘。
下面就来实现一下「跳一跳」的边缘检测,得以获取方块的中心位置。
边缘检测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
下面是原图像灰度图和边缘检测图像
#yyds干货盘点#Python图像处理,cv2模块,OpenCV实现边缘检测

文章图片

通过边缘检测图像找到方块的第一个顶点(上顶点)
# 第一个顶点的高度,row为列表(代表每一行的像素值),max(row)获取列表中最大的像素值\\ y_top = np.nonzero([max(row) for row in canny_img[400:]])[0][0] + 400

对图像高度大于400的行进行遍历(这样可以去除上方数字270以及小程序块的影响)
np.nonzero()表示获取列表元素数值不为0的位置,第一个即为上顶点的高度值
#yyds干货盘点#Python图像处理,cv2模块,OpenCV实现边缘检测

文章图片

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

确定方块下顶点的位置
#yyds干货盘点#Python图像处理,cv2模块,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()

通过上下顶点的坐标,得到方块的中心点
#yyds干货盘点#Python图像处理,cv2模块,OpenCV实现边缘检测

文章图片

左图为边缘检测原图,右图为找到方块中心点并以中心点为圆心绘制圆形的图像
跳动实现现在结合之前模板匹配获得到的小跳棋位置,计算两中心的距离
勾三股四弦五,便能得到两个中心的距离了
#yyds干货盘点#Python图像处理,cv2模块,OpenCV实现边缘检测

文章图片

玩过跳一跳的应该都知道,对于不同的距离,我们需要按压的时间是不同的
可以给距离和按压时间设置一个相关参数,此处设置为1.35
通过adb命令完成一定的按压时间,完成「跳一跳」自动化

    推荐阅读