使用kociemba模块可以快速地得到3阶魔方的还原步骤,例如:

U = '红绿黄白红白白蓝白'
R = '红蓝绿绿绿蓝黄红红'
F = '绿橙绿黄白红蓝橙红'
D = '橙黄绿红橙蓝橙黄黄'
L = '白橙橙绿蓝红白白黄'
B = '橙白蓝黄黄橙蓝绿蓝'cubdict = {U[4]: 'U', R[4]: 'R', F[4]: 'F', D[4]: 'D', L[4]: 'L', B[4]: 'B'}
UC = ''for s in [U, R, F, D, L, B]:for i in range(9):UC = UC + cubdict[s[i]]
print(UC)
print(kc.solve(UC))

指定面向自己的一面为Front(F),相对的一面即为Back(B),左边的一面为Left(L),右边的一面为Right(R),上面为Up(U),下面为Down(D),将魔方的6个面的颜色分别写到U R F D L B中,最后就会打印出还原魔方所有的步骤,按照步骤操作即可还原。

但是,每次都要自己输颜色会显得自己比较low,所以可以借用opencv的图像处理功能来进行魔方颜色的自动识别,例如:

import kociemba as kcimport os
import cv2
import numpy as np
from copy import deepcopy
import mathdef imgcheck(frame_raw):hsv_table = [[[0, 10], [43, 255], [46, 255], '红'],[[156, 180], [43, 255], [46, 255], '红'],[[11, 20], [43, 255], [46, 255], '橙'],[[20, 34], [43, 255], [46, 255], '黄'],[[35, 80], [43, 255], [46, 255], '绿'],[[80, 99], [43, 255], [46, 255], '青'],[[100, 124], [43, 255], [46, 255], '蓝'],[[125, 155], [43, 255], [46, 255], '紫'],[[0, 180], [0, 30], [166, 255], '白'],[[0, 180], [0, 43], [46, 166], '灰'],[[0, 180], [0, 255], [0, 46], '黑']]cube_list = []frame = frame_raw.copy()index = 0center = []candidates = []hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)for process_ind in range(2):hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)#cv2.imshow("image", hsv)#cv2.waitKey(0)gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)blurred = cv2.GaussianBlur(gray, (3, 3), 0)canny = cv2.Canny(blurred, 20, 40)#cv2.imshow("image", canny)#cv2.waitKey(0)if process_ind == 0:kernel = np.ones((3, 3), np.uint8)dilated = cv2.dilate(canny, kernel, iterations=12)else:kernel = np.ones((6, 6), np.uint8)dilated = cv2.dilate(canny, kernel, iterations=3)if process_ind == 1 or process_ind == 0:cv2.imshow("image", dilated)cv2.waitKey(0)(contours, hierarchy) = cv2.findContours(dilated.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)hierarchy = hierarchy[0]pre_cX = 0pre_cY = 0area_arr = []for component in zip(contours, hierarchy):contour = component[0]peri = cv2.arcLength(contour, True)approx = cv2.approxPolyDP(contour, 0.1 * peri, True)area = cv2.contourArea(contour)corners = len(approx)# compute the center of the contourM = cv2.moments(contour)if M["m00"]:cX = int(M["m10"] / M["m00"])cY = int(M["m01"] / M["m00"])else:cX = NonecY = Noneif cX is not None:if process_ind == 0:tmp = {'area': area, 'contour': contour}area_arr.append(tmp)elif 60000 > area > 1000:tmp = {'index': index, 'cx': cX, 'cy': cY, 'contour': contour}center.append(tmp)index += 1if process_ind == 0:area_arr.sort(key=lambda k: (k.get('area', 0)), reverse=True)mx,my,mw,mh = cv2.boundingRect(area_arr[0].get('contour'))cv2.rectangle(frame, (mx,my), (mx+mw, my+mh), (0, 255, 0), 2)#cv2.imshow("image", frame)#cv2.waitKey(0)frame = frame[my-5:my+mh+5, mx-5:mx+mw+5]#cv2.imshow("image", frame)#cv2.waitKey(0)frame = cv2.resize(frame, (320, 320))#if index < 9:#    returnprint(str(index))'''center.sort(key=lambda k: (k.get('cx', 0)))center.sort(key=lambda k: (k.get('cy', 0)))'''center.sort(key=lambda k: (k.get('cy', 0)))row1 = center[0:3]row1.sort(key=lambda k: (k.get('cx', 0)))row2 = center[3:6]row2.sort(key=lambda k: (k.get('cx', 0)))row3 = center[6:9]row3.sort(key=lambda k: (k.get('cx', 0)))center.clear()center = row1 + row2 + row3for component in center:candidates.append(component.get('contour'))x,y,w,h = cv2.boundingRect(component.get('contour'))if abs(w - h) < 10:cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)#cv2.imshow("image", frame)#cv2.waitKey(0)h_ = 0s_ = 0v_ = 0ss = w * hfor i in range(w):for j in range(h):h_ = h_ + hsv[y+j][x+i][0]s_ = s_ + hsv[y+j][x+i][1]v_ = v_ + hsv[y+j][x+i][2]h_ = h_ / sss_ = s_ / ssv_ = v_ / ssprint(str(h_) + ',' + str(s_) + ',' + str(v_))for k in hsv_table:if k[0][0] < h_ < k[0][1] and k[1][0] < s_ < k[1][1] and k[2][0] < v_ < k[2][1]:# print(k[3])cube_list.append(k[3])breakprint(str(len(cube_list)))#if len(cube_list) == 9:print(cube_list)#cv2.drawContours(frame, candidates, -1, (0, 0, 255), 3)cv2.imshow("image", frame)cv2.waitKey(0)if __name__ == "__main__":webcam = cv2.VideoCapture(0)if not webcam.isOpened():print("can't open the camera!!!")while True:ret, frame = webcam.read()rec_w = 200rec_h = 200rec_y = int((frame.shape[0] - rec_h)/2)rec_x = int((frame.shape[1] - rec_w) / 2)cv2.rectangle(frame, (rec_x, rec_y), (rec_x + rec_w, rec_y + rec_h), (0, 255, 0), 2)imgcheck(frame)cv2.imshow("video", frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakwebcam.release()cv2.destroyAllWindows()

hsv_table的各个颜色的范围可能需要根据实际情况进行调试。


基于Python+kociemba+opencv的3阶魔方自动还原相关推荐

  1. ubuntu16.04安装python.h_ubuntu16.04 下基于 Python 的 OpenCV 的安装

    ubuntu16.04 下基于 Python 的 OpenCV 的安装 这几天一直在学习基于 Python 的 OpenCV , 开发环境是在 Ubuntu16.04 下, 学习的心得就是基于 Pyt ...

  2. 基于python和Opencv将多张图片结合为一张图片的办法

    基于python和Opencv将多张图片结合为一张图片的办法 需要用到的python包 代码本体 这两天写结课论文,需要做一个好看一点的图,要把多张图片结合为同一张图片,本来想用ps,但是懒,干脆用代 ...

  3. 基于Python的OpenCV+TensorFlow+Keras人脸识别实现

    前言:本节要讲的人脸识别主要是借鉴了 一位研究生前辈的文章 我只是在他的基础上进行了改动,让代码能在现在的TensorFlow2.X 等的环境下运行 先看一下效果图 完整工程及源代码请点击链接下载:人 ...

  4. 基于Python通过OpenCV实现的口罩识别系统理论篇

    基于Python通过OpenCV实现的口罩识别系统理论设计篇 一.项目实现环境 基于Python 3.8.1版本 opencv-python 4.2.0.34版本 需要自己下载OpenCV的库文件,添 ...

  5. 基于Python与OpenCV的纸质票自动统计功能的实现(一)界面编程

    基于Python与OpenCV的纸质票自动统计功能的实现(一)--界面编程 作为一个资深的自动化工程师,界面编程对我来说太熟悉不过了,但是当时用的都是工业界面编程软件,比如WINCC.组态王等等,在这 ...

  6. 基于Python和OpenCV的面积计算

    基于Python和OpenCV的面积计算 import cv2 import numpy as npimage1 = cv2.imread("F:\\Python\\Image\\1.png ...

  7. cv2 python 获取斑马线_基于python的opencv图像处理实现对斑马线的检测示例

    基本思路 斑马线检测通过opencv图像处理来进行灰度值转换.高斯滤波去噪.阈值处理.腐蚀和膨胀后对图像进行轮廓检测,通过判断车辆和行人的位置,以及他们之间的距离信息,当车速到超过一定阈值时并且与行人 ...

  8. 三阶魔方自动还原 vc实现

    魔方自动求解程序一般有两种方法,一种是按照人还原魔方的步骤,一步步来,另外一种是使用数学方法,魔方自有一套复杂的数学理论,其中较著名的是两阶段算法(压缩文件中的cube430.exe使用的就是数学方法 ...

  9. 魔方自动还原程序3D版本和2D 修正版

    首先感谢大家的对上一个版本的鼓励. 这两天完成了魔方自动还原程序的OpenGL 3D版  源码下载:https://github.com/zhijie/MagicCube3D 同时修正了之前的2D版 ...

  10. 基于python的opencv相机标定(采用黑白棋盘格标定板)

    基于python的相机标定(采用黑白棋盘格图片) 系列文章目录 [第一章 基于python的相机标定(采用黑白棋盘格图片)](https://blog.csdn.net/HWHXXX/article/ ...

最新文章

  1. 美国银行将 AI 应用于企业应收账款处理;联合国或将利用机器学习技术帮助救灾工作...
  2. ​MySQL服务器调优思路图
  3. 大一萌新看过来,C语言学到什么程度,才能“毕业不失业”!
  4. ThoughtWorks培训经历及所想
  5. ucoreOS_lab8 实验报告
  6. (day 34 - 哈希表 or 双指针 )剑指 Offer 57. 和为s的两个数字
  7. vue-router个人总结
  8. fastmock模拟常见数据结构
  9. 计算机知识脑筋急转弯,10道智力题图片及答案大全|2018年朋友圈最烧脑的10道智力题 附答案_最火软件站...
  10. java xml解析框架_JAVA解析xml的五种方式对比
  11. 电影海王真的好看吗|我爬取了9000条影评,得出的结论是
  12. 1. 制作满屏水印(PS)
  13. 采用系统API实现的二维码扫描、识别和生成
  14. Unbuntu22.04安装教程以及Unbuntu下C++环境的配置
  15. Testing——Embedded MongoDB Database
  16. iphone6安装android,在iPhone里装了真 Android系统 这事情已经很神奇了
  17. three.js使用光线投射对象Raycaster在屏幕中拾取/选取对象(vue中使用three.js60)
  18. Java开发常用软件列表——持续更新
  19. CIA3 NOI接站(tarjan缩环+Floyd传递闭包+可相交最小路径覆盖)
  20. html坦克游戏,HTML5制作的坦克游戏

热门文章

  1. cpufreq schedutil原理剖析
  2. 态度决定一切《跟任何人都聊得来》
  3. Scaling SPADE to “Big Provenance”(论文阅读)
  4. SSR、SSE、SST、判定系数(可决系数、拟合优度)的计算公式
  5. 799-C++异常类型以及多级catch匹配
  6. 从零开始搭建ROS移动机器人系列之(四)直流电机PWM调速
  7. python爬取招聘网站视频教程_Python爬取拉钩招聘网
  8. 有没有开以修改服务器游戏数据,剑网3指尖江湖第二批服务器数据互通啦 来看看有没有你所在的大区...
  9. 用MATLAB仿真DSB调制
  10. 《日瓦戈医生》读后感