opencv-python 将图像迷宫转为迷宫数组

这篇具有很好参考价值的文章主要介绍了opencv-python 将图像迷宫转为迷宫数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

起因是我想做个自动走迷宫的外挂(其实是想做点实践),所以我需要在游戏中捕捉画面并自动寻路,然后再控制自动移动,此为第一部分:捕捉画面。

一.思路

1.取得图像迷宫

2.处理图像

3.图像分割

4.生成数组

二.代码

首先我们得捕捉屏幕画面,即获得迷宫图像,这里我是在steam上面找了一个迷宫小游戏作为捕捉对象

opencv-python 将图像迷宫转为迷宫数组

然后写个捕捉屏幕画面的函数

def VideoCapture():
    imm = ImageGrab.grab()  # 获得当前屏幕
    imm = cv2.cvtColor(np.array(imm), cv2.COLOR_RGB2GRAY)  # 转为opencv的灰度图
    imm = imm[35:1040, 450:1470]  # 1080*1100 裁剪图像,这是根据游戏画面调整的数值 
    imm = cv2.resize(imm, (250, 250))  # 19 * 19 缩小图像
    return imm

然后如果显示图像就能看到:

opencv-python 将图像迷宫转为迷宫数组

接着我们需要对图像进行处理,我们可以看到这个迷宫有三个对象:从上到下依次是巢,心,球。而我们是要操控球吃完所有的心再返回巢。所以 巢和心的是需要搜索路径的终点,球是起点,但是在此之前,我们需要一个完整的迷宫地图,所以我们要先找到这三个对象并涂白:

所以我们要进行模板匹配:

def match(target, template, color):
    global object
    # 获得模板图片的高宽尺寸
    theight, twidth = template.shape[:2]
    # 执行模板匹配,采用的匹配方式cv2.TM_SQDIFF_NORMED
    result = cv2.matchTemplate(target, template, cv2.TM_SQDIFF_NORMED)
    # 归一化处理
    cv2.normalize(result, result, 0, 1, cv2.NORM_MINMAX, -1)
    # 寻找矩阵(一维数组当做向量,用Mat定义)中的最大值和最小值的匹配结果及其位置
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
    # 匹配值转换为字符串
    # 对于cv2.TM_SQDIFF及cv2.TM_SQDIFF_NORMED方法min_val越趋近与0匹配度越好,匹配位置取min_loc
    # 对于其他方法max_val越趋近于1匹配度越好,匹配位置取max_loc
    strmin_val = str(min_val)
    # 绘制矩形边框,将匹配区域涂成白色
    # min_loc:矩形定点
    # (min_loc[0]+twidth,min_loc[1]+theight):矩形的宽高
    # color:矩形的边框颜色;2:矩形边框宽度
    cv2.rectangle(target, min_loc, (min_loc[0] + twidth, min_loc[1] + theight), color, -1)
    # 返回操作后图像,以及对象的四点坐标
    return [target, (int(min_loc[0]), int(min_loc[1]), int(min_loc[0] + twidth), int(min_loc[1] + theight))]

执行后效果如图所示:

opencv-python 将图像迷宫转为迷宫数组

然后我们要把图像转化为标准的迷宫图像,黑白块的大小要相等,这样才方便转化成数组形式,所以我们对图像进行二值化后白色为可走趋于,黑色为障碍,接着通过腐蚀操作增大黑色趋于使之与白色块大小接近。

def pic(imm):
    ret, binary = cv2.threshold(imm, 200, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)# 二值化
    k = np.ones((7, 7), np.uint8)#定义核
    binary = cv2.erode(binary, k)# 腐蚀
    return binary

opencv-python 将图像迷宫转为迷宫数组

然后大致数出可以划分为19*19的色块,计算出单个色块的长度,然后定义每个色块的近中心点(因为坐标只能整数而计算中心点会有小数,一般略微靠近左上角比较准确),取其近中心点的颜色为整个色块的颜色转化为数组中:

def getBoard(imm):
    board = [[0 for w in range(19)] for h in range(19)]#创建数组
    for h in range(19):
        for w in range(19):
            if imm[13 * h + 5, 13 * w + 5] == np.uint8(255):#坐标转换
                board[h][w] = 255
    return board

然后我们把得到的数组以图像的形式打印出来看看:

opencv-python 将图像迷宫转为迷宫数组

对比一下原图像,已经实现了我们的目的。

最后我们再把其他信息获取一下,比如对象位置转化为数组坐标:

def getBoardIndex(cor):
    index = (int((cor[1] - 5) / 13), int((cor[0] - 5) / 13))
    return index

然后我们也方便日后的寻路算法应用(这么小,很快!)

最后的最后给个运行代码:文章来源地址https://www.toymoban.com/news/detail-465251.html

startFlag = False
while True:
    imm = VideoCapture()
    if startFlag:
        imm, ball = match(imm, cv2.imread("ball.png", 0), (255, 255, 255))
        imm, home = match(imm, cv2.imread("home.png", 0), (255, 255, 255))
        imm, heart = match(imm, cv2.imread("heart.png", 0), (255, 255, 255))
        imm = pic(imm)
        board = getBoard(imm)
        cv2.imwrite("board.png", np.array(board, dtype=np.uint8))
        ball = getBoardIndex(getPointCor(ball))
        heart = getBoardIndex(getPointCor(heart))
        home = getBoardIndex(getPointCor(home))
        print(ball, heart, home)
    key = cv2.waitKey(1)
    if key == ord('q'):
        break
    elif key == ord('g'):
        startFlag = True
    cv2.imshow("im", imm)
 key = cv2.waitKey(1)
    if key == ord('q'):
        break
    elif key == ord('g'):
        startFlag = True
    cv2.imshow("im", imm)

到了这里,关于opencv-python 将图像迷宫转为迷宫数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV-Python中的图像处理-图像直方图

    通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值( 0 到 255), y 轴是图片中具有同一个灰度的点的数目。 BINS:上面的直方图显示了每个灰度值对应的像素数。如果像素值为 0到255,你就需要 256 个数来显示上面的直方图。但是,如果你不需

    2024年02月12日
    浏览(32)
  • OpenCV-Python中的图像处理-霍夫变换

    霍夫(Hough)变换在检测各种形状的技术中非常流行,如果要检测的形状可以用数学表达式描述,就可以是使用霍夫变换检测它。即使要检测的形状存在一点破坏或者扭曲也是可以使用。 Hough直线变换,可以检测一张图像中的直线 cv2.HoughLines(image, rho, theta, threshold) return:返回值

    2024年02月12日
    浏览(32)
  • OpenCV-Python中的图像处理-模板匹配

    使用模板匹配可以在一幅图像中查找目标 函数: cv2.matchTemplate(), cv2.minMaxLoc() 模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。 OpenCV 为我们提供了函数: cv2.matchTemplate()。和 2D 卷积一样,它也是用模板图像在输入图像(大图)上滑动,并在每一个位置对模板图像

    2024年02月12日
    浏览(26)
  • OpenCV-Python中的图像处理-视频分析

    学习使用 Meanshift 和 Camshift 算法在视频中找到并跟踪目标对象: Meanshift 算法的基本原理是和很简单的。假设我们有一堆点(比如直方 图反向投影得到的点),和一个小的圆形窗口,我们要完成的任务就是将这个窗 口移动到最大灰度密度处(或者是点最多的地方)。如下图所

    2024年02月12日
    浏览(35)
  • opencv-python[cv2]读取中文路径图像

    随着AI人工智能的不断发展,图像处理这门技术也越来越重要,很多学校本科都开启了图像处理这门课程,学习图像处理开发,自然就绕不开opencv-python[ cv2 ]这个由intel主导的开源库。 cv2 是指OpenCV的Python接口库。 OpenCV (Open Source Computer Vision Library)是一个开源的计算机视觉库

    2024年02月06日
    浏览(45)
  • 基于OpenCV-Python的图像位置校正和版面分析

    使用opencv对图像进行操作,要求:(1)定位银行票据的四条边,然后旋正。(2)根据版面分析,分割出小写金额区域。 首先是对图像的校正 读取图片 对图片二值化 进行边缘检测 对边缘的进行霍夫曼变换 将变换结果从极坐标空间投影到笛卡尔坐标得到倾斜角 根据倾斜角对

    2024年01月19日
    浏览(30)
  • OpenCV-Python中的图像处理-傅里叶变换

    傅里叶变换经常被用来分析不同滤波器的频率特性。我们可以使用 2D 离散傅里叶变换 (DFT) 分析图像的频域特性。实现 DFT 的一个快速算法被称为快速傅里叶变换( FFT)。 对于一个正弦信号:x (t) = A sin (2πft), 它的频率为 f,如果把这个信号转到它的频域表示,我们会在频率

    2024年02月12日
    浏览(30)
  • OpenCV-Python学习(21)—— OpenCV 图像几何变换之图像翻转(cv.flip、np.flip)

    1. 学习目标 学习 OpenCV 图像的翻转函数 cv.flip; 学习 NumPy 矩阵的反转函数 np.flip; 自己实现矩阵反转的函数。 2. OpenCV 翻转 翻转也称镜像,是指将图像沿轴线进行轴对称变换。水平镜像是将图像沿垂直中轴线进行左右翻转,垂直镜像是将图像沿水平中轴线进行上下翻转,水平

    2024年02月06日
    浏览(38)
  • OpenCV-Python学习(10)—— OpenCV 图像二值化处理(cv.threshold)

    1. 学习目标 理解图像的分类,不同类型的图像的区别; 对图像进行二值化处理,对【 cv.threshold 】函数的理解。 2. 图像分类 2.1 不同类型图像说明 按照颜色对图像进行分类,可以分为二值图像、灰度图像和彩色图像。 二值图像: 只有黑色和白色两种颜色的图像。 每个像素

    2024年02月03日
    浏览(39)
  • 【OpenCV-Python】教程:8-1 图像去噪 Image Denoising

    非局部均值去噪算法去除图像中的噪声。 cv2.fastNlMeansDenoising() , cv2.fastNlMeansDenoisingColored() etc. 在前面的章节中,我们已经看到了许多图像平滑技术,如 高斯模糊,中值模糊 等,它们在一定程度上很好地去除少量的噪声。在这些技术中,我们在像素周围取一个小的邻域,并进

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包