Python+OpenCV实现自动扫雷,挑战扫雷世界记录!_opencv 自动扫雷

这篇具有很好参考价值的文章主要介绍了Python+OpenCV实现自动扫雷,挑战扫雷世界记录!_opencv 自动扫雷。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Python全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
Python+OpenCV实现自动扫雷,挑战扫雷世界记录!_opencv 自动扫雷,2024年程序员学习,python,opencv,开发语言
Python+OpenCV实现自动扫雷,挑战扫雷世界记录!_opencv 自动扫雷,2024年程序员学习,python,opencv,开发语言
Python+OpenCV实现自动扫雷,挑战扫雷世界记录!_opencv 自动扫雷,2024年程序员学习,python,opencv,开发语言
Python+OpenCV实现自动扫雷,挑战扫雷世界记录!_opencv 自动扫雷,2024年程序员学习,python,opencv,开发语言
Python+OpenCV实现自动扫雷,挑战扫雷世界记录!_opencv 自动扫雷,2024年程序员学习,python,opencv,开发语言
Python+OpenCV实现自动扫雷,挑战扫雷世界记录!_opencv 自动扫雷,2024年程序员学习,python,opencv,开发语言

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注Python)
Python+OpenCV实现自动扫雷,挑战扫雷世界记录!_opencv 自动扫雷,2024年程序员学习,python,opencv,开发语言

正文

top += 101
right -= 15
bottom -= 43

rect = (left, top, right, bottom)
img = ImageGrab.grab().crop(rect)


聪明的你肯定一眼就发现了那些奇奇怪怪的Magic Numbers,没错,这的确是Magic Numbers,是我们通过一点点细微调节得到的整个棋盘相对于窗体的位置。


**注意:这些数据仅在Windows10下测试通过,如果在别的Windows系统下,不保证相对位置的正确性,因为老版本的系统可能有不同宽度的窗体边框。**



![图片](https://img-blog.csdnimg.cn/img_convert/f951d4df63009d5c6ac34552b0286000.jpeg)


橙色的区域是我们所需要的


好啦,棋盘的图像我们有了,下一步就是对各个雷块进行图像分割了~


### **- 02 雷块分割**



![图片](https://img-blog.csdnimg.cn/img_convert/cd62c0e61fba8fe45914ca44d9cd53fa.jpeg)


在进行雷块分割之前,我们事先需要了解雷块的尺寸以及它的边框大小。经过笔者的测量,在ms\_arbiter下,每一个雷块的尺寸为16px\*16px。


知道了雷块的尺寸,我们就可以进行每一个雷块的裁剪了。首先我们需要知道在横和竖两个方向上雷块的数量。


​​​​​​​



block_width, block_height = 16, 16
blocks_x = int((right - left) / block_width)
blocks_y = int((bottom - top) / block_height)


之后,我们建立一个二维数组用于存储每一个雷块的图像,并且进行图像分割,保存在之前建立的数组中。​​​​​​​



def crop_block(hole_img, x, y):
x1, y1 = x * block_width, y * block_height
x2, y2 = x1 + block_width, y1 + block_height
return hole_img.crop((x1, y1, x2, y2))

blocks_img = [[0 for i in range(blocks_y)] for i in range(blocks_x)]

for y in range(blocks_y):
for x in range(blocks_x):
blocks_img[x][y] = crop_block(img, x, y)


将整个图像获取、分割的部分封装成一个库,随时调用就OK啦~在笔者的实现中,我们将这一部分封装成了imageProcess.py,其中函数get\_frame()用于完成上述的图像获取、分割过程。


### **- 03 雷块识别**


这一部分可能是整个项目里除了扫雷算法本身之外最重要的部分了。笔者在进行雷块检测的时候采用了比较简单的特征,高效并且可以满足要求。



def analyze_block(self, block, location):
block = imageProcess.pil_to_cv(block)

block_color = block[8, 8]
x, y = location[0], location[1]

# -1:Not opened
# -2:Opened but blank
# -3:Un initialized

# Opened

if self.equal(block_color, self.rgb_to_bgr((192, 192, 192))):
if not self.equal(block[8, 1], self.rgb_to_bgr((255, 255, 255))):
self.blocks_num[x][y] = -2
self.is_started = True
else:
self.blocks_num[x][y] = -1

elif self.equal(block_color, self.rgb_to_bgr((0, 0, 255))):

self.blocks_num[x][y] = 1

elif self.equal(block_color, self.rgb_to_bgr((0, 128, 0))):

self.blocks_num[x][y] = 2

elif self.equal(block_color, self.rgb_to_bgr((255, 0, 0))):

self.blocks_num[x][y] = 3

elif self.equal(block_color, self.rgb_to_bgr((0, 0, 128))):

self.blocks_num[x][y] = 4

elif self.equal(block_color, self.rgb_to_bgr((128, 0, 0))):

self.blocks_num[x][y] = 5

elif self.equal(block_color, self.rgb_to_bgr((0, 128, 128))):

self.blocks_num[x][y] = 6

elif self.equal(block_color, self.rgb_to_bgr((0, 0, 0))):

if self.equal(block[6, 6], self.rgb_to_bgr((255, 255, 255))):
# Is mine
self.blocks_num[x][y] = 9
elif self.equal(block[5, 8], self.rgb_to_bgr((255, 0, 0))):
# Is flag
self.blocks_num[x][y] = 0
else:
self.blocks_num[x][y] = 7

elif self.equal(block_color, self.rgb_to_bgr((128, 128, 128))):

self.blocks_num[x][y] = 8
else:
self.blocks_num[x][y] = -3
self.is_mine_form = False

if self.blocks_num[x][y] == -3 or not self.blocks_num[x][y] == -1:
self.is_new_start = False


可以看到,我们采用了读取每个雷块的中心点像素的方式来判断雷块的类别,并且针对插旗、未点开、已点开但是空白等情况进行了进一步判断。具体色值是笔者直接取色得到的,并且屏幕截图的色彩也没有经过压缩,所以通过中心像素结合其他特征点来判断类别已经足够了,并且做到了高效率。


在本项目中,我们实现的时候采用了如下标注方式:


* 1-8:表示数字1到8
* 9:表示是地雷
* 0:表示插旗
* -1:表示未打开
* -2:表示打开但是空白
* -3:表示不是扫雷游戏中的任何方块类型


通过这种简单快速又有效的方式,我们成功实现了高效率的图像识别。


### **- 04 扫雷算法实现**


这可能是本篇文章最激动人心的部分了。在这里我们需要先说明一下具体的扫雷算法思路:


1. 遍历每一个已经有数字的雷块,判断在它周围的九宫格内未被打开的雷块数量是否和本身数字相同,如果相同则表明周围九宫格内全部都是地雷,进行标记。
2. 再次遍历每一个有数字的雷块,取九宫格范围内所有未被打开的雷块,去除已经被上一次遍历标记为地雷的雷块,记录并且点开。
3. 如果以上方式无法继续进行,那么说明遇到了死局,选择在当前所有未打开的雷块中随机点击。(当然这个方法不是最优的,有更加优秀的解决方案,但是实现相对麻烦)


基本的扫雷流程就是这样,那么让我们来亲手实现它吧~


首先我们需要一个能够找出一个雷块的九宫格范围的所有方块位置的方法。因为扫雷游戏的特殊性,在棋盘的四边是没有九宫格的边缘部分的,所以我们需要筛选来排除掉可能超过边界的访问。​​​​​​​



def analyze_block(self, block, location):
block = imageProcess.pil_to_cv(block)

block_color = block[8, 8]
x, y = location[0], location[1]

# -1:Not opened
# -2:Opened but blank
# -3:Un initialized

# Opened

if self.equal(block_color, self.rgb_to_bgr((192, 192, 192))):
if not self.equal(block[8, 1], self.rgb_to_bgr((255, 255, 255))):
self.blocks_num[x][y] = -2
self.is_started = True
else:
self.blocks_num[x][y] = -1

elif self.equal(block_color, self.rgb_to_bgr((0, 0, 255))):

self.blocks_num[x][y] = 1

elif self.equal(block_color, self.rgb_to_bgr((0, 128, 0))):

self.blocks_num[x][y] = 2

elif self.equal(block_color, self.rgb_to_bgr((255, 0, 0))):

self.blocks_num[x][y] = 3

elif self.equal(block_color, self.rgb_to_bgr((0, 0, 128))):

self.blocks_num[x][y] = 4

elif self.equal(block_color, self.rgb_to_bgr((128, 0, 0))):

self.blocks_num[x][y] = 5

elif self.equal(block_color, self.rgb_to_bgr((0, 128, 128))):

self.blocks_num[x][y] = 6

elif self.equal(block_color, self.rgb_to_bgr((0, 0, 0))):

if self.equal(block[6, 6], self.rgb_to_bgr((255, 255, 255))):
# Is mine
self.blocks_num[x][y] = 9
elif self.equal(block[5, 8], self.rgb_to_bgr((255, 0, 0))):
# Is flag
self.blocks_num[x][y] = 0
else:
self.blocks_num[x][y] = 7

elif self.equal(block_color, self.rgb_to_bgr((128, 128, 128))):

self.blocks_num[x][y] = 8
else:
self.blocks_num[x][y] = -3
self.is_mine_form = False

if self.blocks_num[x][y] == -3 or not self.blocks_num[x][y] == -1:
self.is_new_start = False


我们在这一部分通过检测当前雷块是否在棋盘的各个边缘来进行核的删除(在核中,1为保留,0为舍弃),之后通过generate\_kernel函数来进行最终坐标的生成。​​​​​​​



def count_unopen_blocks(blocks):
count = 0
for single_block in blocks:
if self.blocks_num[single_block[1]][single_block[0]] == -1:
count += 1
return count

def mark_as_mine(blocks):
for single_block in blocks:
if self.blocks_num[single_block[1]][single_block[0]] == -1:
self.blocks_is_mine[single_block[1]][single_block[0]] = 1

unopen_blocks = count_unopen_blocks(to_visit)
if unopen_blocks == self.blocks_num[x][y]:
mark_as_mine(to_visit)


在完成核的生成之后,我们有了一个需要去检测的雷块“地址簿”:to\_visit。之后,我们通过count\_unopen\_blocks函数来统计周围九宫格范围的未打开数量,并且和当前雷块的数字进行比对,如果相等则将所有九宫格内雷块通过mark\_as\_mine函数来标注为地雷。



def mark_to_click_block(blocks):
for single_block in blocks:

Not Mine

if not self.blocks_is_mine[single_block[1]][single_block[0]] == 1:

Click-able

if self.blocks_num[single_block[1]][single_block[0]] == -1:

Source Syntax: [y][x] - Converted

if not (single_block[1], single_block[0]) in self.next_steps:
self.next_steps.append((single_block[1], single_block[0]))

def count_mines(blocks):
count = 0
for single_block in blocks:
if self.blocks_is_mine[single_block[1]][single_block[0]] == 1:
count += 1
return count

mines_count = count_mines(to_visit)

if mines_count == block:
mark_to_click_block(to_visit)


扫雷流程中的第二步我们也采用了和第一步相近的方法来实现。先用和第一步完全一样的方法来生成需要访问的雷块的核,之后生成具体的雷块位置,通过count\_mines函数来获取九宫格范围内所有雷块的数量,并且判断当前九宫格内所有雷块是否已经被检测出来。


如果是,则通过mark\_to\_click\_block函数来排除九宫格内已经被标记为地雷的雷块,并且将剩余的安全雷块加入next\_steps数组内。



Analyze the number of blocks

self.iterate_blocks_image(BoomMine.analyze_block)

Mark all mines

self.iterate_blocks_number(BoomMine.detect_mine)

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

Python+OpenCV实现自动扫雷,挑战扫雷世界记录!_opencv 自动扫雷,2024年程序员学习,python,opencv,开发语言

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
Python+OpenCV实现自动扫雷,挑战扫雷世界记录!_opencv 自动扫雷,2024年程序员学习,python,opencv,开发语言

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
.csdnimg.cn/img_convert/21b2604bd33c4b6713f686ddd3fe5aff.png)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注python)
[外链图片转存中…(img-e4e2sf1V-1713160979182)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!文章来源地址https://www.toymoban.com/news/detail-857795.html

到了这里,关于Python+OpenCV实现自动扫雷,挑战扫雷世界记录!_opencv 自动扫雷的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Python OpenCV实现文档自动矫正(含源码和测试数据)

    目录 OpenCV实现文档自动矫正 1. OpenCV文档矫正的方法 (1)基于霍夫变换的文档矫正方法 (2)基于透视变换的文档矫正方法 2. OpenCV文档自动矫正实现 (0)项目说明 (1)基于霍夫变换的文档矫正方法(效果较差) (2)基于透视变换的文档矫正方法(效果较好) (3)文档矫

    2024年02月07日
    浏览(41)
  • 软件杯 深度学习+opencv+python实现车道线检测 - 自动驾驶

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的自动驾驶车道线检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:4分 创新点:4分 🧿 更多资料, 项目分享:

    2024年04月14日
    浏览(26)
  • 竞赛选题 深度学习+opencv+python实现车道线检测 - 自动驾驶

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的自动驾驶车道线检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:4分 创新点:4分 🧿 更多资料, 项目分享:

    2024年02月08日
    浏览(32)
  • Python|OpenCV-实现自动“追踪并检测”视频中的人脸识别(14)

    前言 本文是该专栏的第15篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在本专栏之前,笔者在文章《Python|OpenCV-实现检测人脸以及性别检测(12)》中,有详细介绍通过OpenCV实现对图像中的人物人脸进行性别以及人脸检测,对此领域感兴趣的同学,可直接点击翻阅

    2024年04月14日
    浏览(28)
  • 使用 OpenCV Python 实现自动图像注释工具的详细步骤--附完整源码

    注释是深度学习项目中最关键的部分。它是模型学习效果的决定因素。然而,这是非常乏味且耗时的。一种解决方案是使用自动图像注释工具,这大大缩短了时间。 本文是pyOpenAnnotate系列的一部分,其中包括以下内容。 1、使用 OpenCV 进行图像注释的路线图。 2、pyOpenAnnotate工

    2024年02月11日
    浏览(27)
  • 挑战杯 python 机器视觉 车牌识别 - opencv 深度学习 机器学习

    🔥 优质竞赛项目系列,今天要分享的是 🚩 基于python 机器视觉 的车牌识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:3分 创新点:3分 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 车牌识别其实是个经典的机器视觉任务了,

    2024年02月21日
    浏览(35)
  • 挑战杯 机器视觉的试卷批改系统 - opencv python 视觉识别

    🔥 优质竞赛项目系列,今天要分享的是 基于机器视觉的试卷系统 - opencv python 视觉识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 机器视觉的发展对存在的作业批改问题, 提供了有效的解决方案

    2024年03月23日
    浏览(37)
  • 深度学习毕设项目 深度学习+opencv+python实现车道线检测 - 自动驾驶

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月04日
    浏览(53)
  • 挑战杯 基于深度学习的植物识别算法 - cnn opencv python

    🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的植物识别算法 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分 工作量:4分 创新点:4分 🧿 更多资料, 项目分享: https://gitee.com/dancheng

    2024年04月09日
    浏览(67)
  • PYTHON+YOLOV5+OPENCV,实现数字仪表自动读数,并将读数结果进行输出显示和保存

    最近完成了一个项目,利用python+yolov5实现数字仪表的自动读数,并将读数结果进行输出和保存,现在完成的7788了,写个文档记录一下, 若需要数据集和源代码可以私信。 最后实现的结果如下: 首先查阅文献和文档,好家伙,不看不知道,做相似项目的很多资料都是硕士研

    2024年02月03日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包