简介

本项目运用了基础的 Opencv 图像处理算法 来实现魔方色块的识别并判断颜色。 用户可以通过将魔方举在摄像机的前方来让机器自动将魔方的色块录入数据,然后系统将会依靠用户录入的数据来产生当前魔方的解法,并以动画的形式展现出来。

图形用户界面展示:


如何使用

使用到的库:

  1. Opencv
  2. Numpy
  3. Tkinter

在 Anaconda 环境下安装库:

conda install -c anaconda tk
conda install -c conda-forge numpy
conda install -c conda-forge opencv

配置完环境后:

在已具备所有需要的库之后,到 Rubik-s-Cube-Scanner-Solver 将该repo下的 RubiksCubeScanner 路径克隆到电脑中,然后使用python3 运行 client_gui.py 即可。

当该代码第一次运行时,系统需要创建解魔方需要使用到的表格,一般需要花半个小时到一个小时,请耐心等待,并且会占用额外的80MB左右的硬盘空间。此后执行则不需要创建列表,图形化用户界面会直接显示。

当用户界面显示,用户可以直接用客户端里的色盘来给魔方上色,也可以点击 “Turn on cam" 来打开摄像头,让摄像头来自动识别+读入当前魔方的内容。

在整个魔方已经被填充后,点击 ”Solve“ 系统将会连接到之前已经创建的列表并开始解输入的魔方。输出的解法的步骤数会在20步以内。

在魔方已经被解完后,点击 ”Animate“ 即可让魔方“动起来”,作者提前制作的魔方动画将会开始播放解法。左下角可拖动的块可以用来调节动画播放的速度。

实现步骤

本项目可以大致地分为三个步骤 :

1. 检测并录入魔方的内容
2. 生成已录入魔方的解法
3. 创建可以展示给用户的魔方动画

接下来的文章将会对每一个步骤,尤其是第一个步骤进行详细的分解。

1. 检测并录入魔方的内容

识别魔方色块

为了减少不必要的运算,在窗体程序的摄像机读取的视屏中间画有一个正方形,所有算法在该正方形中运行。使用 ROI(Region of Interest) 提升运算效率是非常实用的算法优化。

一张普通的彩色图片在每个像素含有一个 (0-255,0-255,0-255) 的数组, 也就是说在一个像素可以有 256x256x256 = 1703936 种不同的颜色变换。然而一张二值化后的图在每个像素仅仅包含 0 或者 1 两种可能。一张彩色图片所包含的信息远远大于它的二值化后的图片,二值图所包含的主要信息仅仅是图片中物体的轮廓。我们识别魔方色块只需要物体的轮廓信息,所以我们的第一个步骤是将读取到的图像二值化。

在Python OpenCV 中, 二值化图片的代码为:

// 首先将彩色图片处理成灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)// img(gray):       待处理的图片
// threshold1(130): 将低于该值的像素归为 0
// threshold2(230): 将高于该值的像素归为 0
// option:          二值化选项
// thresh1:         返回的二值化后的图片
ret,thresh1 = cv2.threshold(gray,130,230,cv2.THRESH_BINARY)

在图片已经被二值化后,我们还需要进行一些图像处理让我们获得的数据更加可靠:

// kenel 是一个算子,它可以是我们自定义的形状,Opencv 将以它的形状进行填充以及腐蚀
// dilate 是opencv的膨胀算法,将它运用在有时模糊的数据中可以让该数据更加稳定
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2,2))
binary_dilated = cv2.dilate(binary_Image,kernel,iterations = 5)

下面的图片: 左边为膨胀前,右边为膨胀后

将我们的图片膨胀完后,即可开始提取轮廓线,在opencv中算法:

// findContours 会返回两个矩阵
// contours  包含了每一个轮廓线
// hierarchy 包含了对应轮廓线的阶级,也就是被多少其他轮廓线包含着
contours, hierarchy = cv2.findContours(binary_dilated,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

接下来可以在contours 矩阵中寻找为四边形的轮廓线,为此opencv提供了算法:

for cnt in contours:              approx = cv2.approxPolyDP(cnt,0.12*cv2.arcLength(cnt,True),True)x = approx.ravel()[0]y = approx.ravel()[1]if (len(approx) == 4 and 245<x<395 and 105<y<255):

这个循环会把contours中的每一个轮廓线都过一遍,如果该轮廓线不能被估作一个四边形,则舍弃;如果可以,则进入下一步继续判断该四边形是否为正方形:

if approx_is_square(approx) == True

approx_is_square(approx) 是作者自己写的函数,它非常简单。通过比对这个四边形四个边的长度是否在其中任意一边的90%~110%之间,再通过比对这四个边之间的角度是否都在80度到100度;这个算法可以粗略地判断输入的形状是否是正方形。

在识别完正方形后,我们即可数当前图片ROI 中的正方形的数量,如果等于9,就将他们标识出来,最基础的色块识别已经完成!

识别某个色块的颜色

对于我们而言,一个色块可以是“绿“,”红”,“蓝”,“白“ 等等。 然而对于一个机器而言一个色块的颜色仅仅是一个RGB值。我们为了知道一个色块归属于魔方的哪一面则需要知道当前色块的区域的rgb值代表什么颜色。

第一步是遍历该色块,把所有属于本色块的像素的颜色全部加起来,然后除以加起来的像素的数量,这样获得一个当前色块的平均颜色。

接下来我们可以提前设立很多阀值来判断一个色块的平均颜色到底属于什么颜色:

red_low = [30,30,100] #bgr 格式下红色的最低值
red_high = [150,150,255] #bgr 格式下红色的最高值如果:  red_low < 平均颜色 < red_high
则:  该颜色是红色

好了,这样我们就完成了颜色的判断!我们已经可以把颜色填入GUI中的矩阵中了!

Python OpenCV 实现魔方识别+复原相关推荐

  1. 2021-01-07 python opencv实现车牌识别 颜色定位

    python opencv实现车牌识别 颜色定位 主要代码参考https://blog.csdn.net/wzh191920/article/details/79589506 GitHub:https ...

  2. Python+Opencv简易车牌识别(二):形态学运算,HSV颜色空间筛选与图像分割

    注:这是依然一个简单的车牌识别demo 1.前言 在上一篇Python+Opencv简易车牌识别(一):基于HSV颜色空间的图像分割中,我们讲了如何仅基于颜色来进行简单粗暴的车牌分割.今天我们考虑对图 ...

  3. Python OpenCv 车牌检测识别(边缘检测、HSV色彩空间判断)

    Python OpenCv 车牌检测识别 背景 车牌识别在交通.停车等方面有着广泛应用,在网上也有很多种基于OpenCV方案进行识别,本文是综合了两种比较流行的方案,首先是提取出疑似车牌区域的轮廓,然 ...

  4. Python OpenCV车道线识别侦测

    Python OpenCV车道线识别侦测 如需安装运行环境或远程调试,可加QQ905733049, 或QQ2945218359由专业技术人员远程协助! 运行结果如下: 代码如下: import cv2 ...

  5. Python opencv进行矩形识别

    Python opencv进行矩形识别 图像识别中,圆形和矩形识别是最常用的两种,上一篇讲解了圆形识别,本例讲解矩形识别,最后的结果是可以识别出圆心,4个顶点,如下图: 左边是原始图像,右边是识别结果 ...

  6. 【开源分享】基于Python+OpenCV+PyQt5车牌识别(GUI界面)

    亲测无错:基于Python+OpenCV+PyQt5车牌识别(GUI界面)绝对可以用的!!!!! 基于Python+OpenCV+PyQt5车牌识别(GUI界面) 参考文档

  7. python+opencv多进程实现识别魔方颜色,通过kociemba算法得出算法字符串并画图(附毕设完整视频)

    完整毕设成果视频如下: 本科毕业设计转魔方(声音略大) python+opencv本科毕业设计转魔方(声音略大) 上一篇博客已经给大家讲了鼠标hsv获取魔方颜色阈值方法,具体见 python+open ...

  8. python opencv 人体/人脸识别 简易demo

    前言 参考文章: pythonopencv检测行人_[图像处理]使用OpenCV实现人脸和行人检测 Python如何实现行人识别-人体识别 本文主要讲述关于opencv官方提供的现成模型,采取Hog特 ...

  9. 使用Opencv实现魔方识别(一):边缘及位置识别

    之前做魔方机器人,使用的是人工输入默认的各个表面方块颜色分布,不够方便与智能,因此开始研究使用摄像头识别魔方.Opencv基本是首选而且方便简单的工具.本文将描述如何使用Opencv识别从摄像头抓取的 ...

最新文章

  1. UI设计培训分享:学习UI设计有哪些技巧
  2. 聊一聊如何优雅地向程序员提问题
  3. hive in 写法/linux OR CDH如果查看hive的版本
  4. java_IO总结(1)
  5. [转]有关gimbal lock的详细解释(真的好详细)
  6. druid连接池_SpringBoot整合JDBCTemplate及Druid连接池
  7. PyTorch基础(part5)--交叉熵
  8. 如何使用 SAP API Portal Policy Editor 给 SAP API 调用自动添加认证信息
  9. python读取csv最后一行_python – 尝试使用seek()获取csv文件的最后一行时的AttributeError...
  10. Python numpy 多维数组切片
  11. 如何编写可移植的c/c++代码
  12. jvm 参数_JVM快速调优手册之六:JVM参数设置及分析
  13. 在ArcMap离线加载海量卫星影像的方法
  14. 计算机运维项目管理,工程项目管理软件的运维分为几个阶段
  15. 【计算机网络】计算机网络的组成
  16. C++~STL容器实例——三国武将阵营管理系统
  17. 第四章第三节数据资产盘点-业务价值链、数据场景梳理
  18. 小程序怎么弄?小程序开发多少钱?
  19. 个性化智能推荐(协同过滤算法)技术研究
  20. 数据结构与算法:冒泡排序、插入排序、选择排序

热门文章

  1. 图的存储-邻接矩阵和邻接表之间的相互转化
  2. 计算机专业 公务员发展前景,未来5年,我国待遇“最好”的4个专业,前途不输公务员...
  3. dockers迁移容器数据的方法
  4. 行测-常识积累(2)
  5. Qt笔记(四十一)之qtcreator添加pri文件
  6. 共享充电宝PCBA方案开发设计
  7. 达人评测R5 7530U和r5 5600u选哪个好
  8. java使用freemarker模板导出word,合并单元格,单元格内换行
  9. SQL Server 2005系列教学(13) 游标
  10. 工厂方法模式(雷锋依然在人间)