魔方机器人中的视觉处理

魔方机器人的图像识别

魔方机器人还原流程

首先利用opencv对魔方的六个面进行颜色提取,获得六个面的色块分布,将六个面的环境提取到一个矩阵中。获得还原步骤,这里给出star数较高的一个还原库,基本能实现20步之内的还原。
https://github.com/hkociemba/RubiksCube-TwophaseSolver
本文的演示demo放在了GitHub上,可以自行运行一下,需要环境配置在readme中
添加链接描述
在这里插入图片描述

魔方机器人的图像识别

这里对一个较为理想的魔方一面图案进行演示,排除掉光照干扰与矩阵拼接等步骤。
首先对采集的图案进行形态学处理,获得魔方的每个色块的位置与色块大小等参数,然后提取色块中的颜色信息,获得魔方的颜色矩阵。
演示魔方图案

图案的形态学处理

形态学处理基本流程就是进行图像二值化,二值化之后寻找图案中的包含的多边形,在对包含多边形中的四边形进行判断,首先判断是否是一个正方形,然后判断正方形的面积是否符合魔方色块的大小。

读取魔方图片进行二值化处理
#首先加载图片,进行二值化处理
img = cv2.imread("cube.png") #加载魔方图案
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #转化为灰度图案
ret, img_binary = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY) #图片的二值化
寻找所有的封闭多边形
#寻找所有封闭多边形
contours, hierarchy = cv2.findContours(img_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #其中contours就是所有的封闭多边形列表

寻找的结果如图,其中绿色的线条就是封边多边形的边
寻找到的所有封闭多边形

进行魔方的矩形匹配
final_contours = [] #建立一个空列表存放匹配成功的色块,如果寻找到九个色块则认为匹配成功
for contour in contours:
    #进行多边形拟合
    perimeter = cv2.arcLength(contour, True)
    approx = cv2.approxPolyDP(contour, 0.1 * perimeter, True)
    #计算边的数量为4的多边形
    if len (approx) == 4:
        area = cv2.contourArea(contour)#获取多边形面积
        (x, y, w, h) = cv2.boundingRect(approx)#获取拟合多边形的长款
        # Find aspect ratio of boundary rectangle around the countours.
        ratio = w / float(h)#计算长宽比
        # Check if contour is close to a square.
        if ratio >= 0.8 and ratio <= 1.2 and area / (w * h) > 0.9 and ((w * h)/(img.shape[0]*img.shape[1]))<0.1: #长宽比接近1并对大小进行限制
            final_contours.append([[x, y], [x, y+h] , [x+w, y+h], [x+w, y]])

if len(final_contours) >= 9: #判断色块的数量
    print("get it!")

寻找到色块如下图
红色线条就是魔方的色块

读取色块的颜色

这里对读取进行简化,代码中是直接读取色块中心点的位置,在实际中为了程序的鲁棒性可能要求所有色块的均值。并且这里没有对顺序进行处理,仅仅是演示读取的方法。

读取色块的rgb值

首先设立一个黄色的rgb范围,因为演示中的图片颜色不是正黄,所以rgb值设置的比较宽泛

#比较宽泛的黄色的rgb范围是(200,200,0)到(255,255,0)
y_low = (200,200,0)
y_high = (255,255,0)

然后读取色块中心点的rgb值,注意我们设置的顺序是r-g-b,但是cv直接索引的数据是b-g-r,需要注意一下这个顺序。

import numpy as np
cube_color_martix = np.zeros(9) #建立一个魔方单面颜色矩阵

for i in range(len(final_contours)):
    (b, g, r) = img[int((final_contours[i][0][0]+final_contours[i][2][0])/2), int((final_contours[i][0][1]+final_contours[i][2][1])/2)] #读取每个色块中心点的颜色参数
    if (r, g, b)>y_low and (b, g, r)<y_high: #判断是否是黄色范围
        cube_color_martix[i] = 1
cube_color_martix = cube_color_martix.reshape(3, 3) 

读取的结果

参考链接

https://blog.csdn.net/weixin_42488182/article/details/103451877
https://github.com/kkoomen/qbr

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要编写一个 Python 魔方机器人,需要用到一些库,比如 Rubik 和 PyAutoGUI。以下是一个简单的示例代码: ```python import time import pyautogui from rubik.cube import Cube from rubik.solve import CFOPSolver # 创建魔方对象 cube = Cube() # 打乱魔方 cube.randomize() # 创建 CFOP 求解器对象 solver = CFOPSolver() # 求解魔方 solution = solver.solve(cube) # 启动魔方机器人 time.sleep(3) # 延迟 3 秒,留出时间打开魔方模拟器 for step in solution: # 模拟键盘按键 if step == 'U': pyautogui.press('up') elif step == 'D': pyautogui.press('down') elif step == 'L': pyautogui.press('left') elif step == 'R': pyautogui.press('right') elif step == 'F': pyautogui.press('enter') elif step == 'B': pyautogui.press('backspace') # 延迟一段时间,等待魔方模拟器响应 time.sleep(1) ``` 在这个示例代码,我们使用 Rubik 库求解魔方,并使用 PyAutoGUI 模拟键盘按键操作来控制魔方模拟器。在每个步骤,我们根据求解器返回的解法步骤模拟按键。需要注意的是,每个步骤后我们都需要延迟一段时间,等待魔方模拟器响应。 需要注意的是,这个示例代码只是一个简单的示例,实际上编写一个完整的魔方机器人需要考虑很多细节和异常情况,比如如何处理魔方模拟器的界面变化、如何处理错误操作等等。编写一个稳定可靠的魔方机器人需要一定的技术和经验,并需要进行多次实验和测试来验证其正确性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值