代码在这里:
先创建一个魔方类,规定每个面的属性和功能
import cv2
import numpy as np
#白色
white_min = np.array([0, 0, 150])
white_max = np.array([180, 60, 255])
#红色
red_min_ = np.array([0, 70, 120])
red_max_ = np.array([10, 255, 255])
red_min = np.array([156, 70, 120])
red_max = np.array([180, 255, 255])
#橙色
orange_min = np.array([11, 115, 190])
orange_max = np.array([25, 255, 255])
#黄色
yellow_min = np.array([26, 43, 46])
yellow_max = np.array([49, 255, 240])
#绿色
green_min = np.array([50, 80,110])
green_max = np.array([78, 255, 250])
#蓝色
blue_min = np.array([100, 110, 100])
blue_max = np.array([124, 255, 255])
class Image:
def __init__(self, img_name):
self.img = img_name
self.bgr = cv2.imread(self.img)
def __getitem__(self, key):
return self.bgr[key]
def hsv_color(self):
self.hsv = cv2.cvtColor(self.bgr, cv2.COLOR_BGR2HSV)
def get_shape(self):
self.hsv_color()
self.shape = self.hsv.shape[:2]
return self.shape
def binary_u(self):
self.hsv_color()
self.binary_U = cv2.inRange(self.hsv, white_min, white_max)
self.binary_U_array = np.array(self.binary_U)
return self.binary_U_array
def binary_r(self):
self.hsv_color()
self.binary_R = cv2.inRange(self.hsv, blue_min, blue_max)
self.binary_R_array = np.array(self.binary_R)
return self.binary_R_array
def binary_f(self):
self.hsv_color()
self.binary_F = cv2.inRange(self.hsv, red_min, red_max)
self.binary_F_array = np.array(self.binary_F)
return self.binary_F_array
def binary_f_(self):
self.hsv_color()
self.binary_F_ = cv2.inRange(self.hsv, red_min_, red_max_)
self.binary_F_array_ = np.array(self.binary_F_)
return self.binary_F_array_
def binary_d(self):
self.hsv_color()
self.binary_D = cv2.inRange(self.hsv, yellow_min, yellow_max)
self.binary_D_array = np.array(self.binary_D)
return self.binary_D_array
def binary_l(self):
self.hsv_color()
self.binary_L = cv2.inRange(self.hsv, green_min, green_max)
self.binary_L_array = np.array(self.binary_L)
return self.binary_L_array
def binary_b(self):
self.hsv_color()
self.binary_B = cv2.inRange(self.hsv, orange_min, orange_max)
self.binary_B_array = np.array(self.binary_B)
return self.binary_B_array
#img_name = "C:\\Users\\Niyingqi\\Desktop\\3_13.png"
#img = Image(img_name=img_name)
#height, width = img.get_shape()
#print(width)
#print(height)
#binary_U = img.binary_U()
#print(binary_U)
#img.hsv_color()
#创建类的对象
定义解魔方的函数
def color_cube(image):
height, width = image.get_shape()
result = ''
for i in range(3):
for j in range(3):
y_start = i * width // 3
y_end = (i + 1) * width // 3
x_start = j * width // 3
x_end = (j + 1) * width // 3
pic = image[y_start:y_end, x_start:x_end]
binary_U = image.binary_u()
binary_R = image.binary_r()
binary_F = image.binary_f()
binary_F_ = image.binary_f_()
binary_D = image.binary_d()
binary_L = image.binary_l()
binary_B = image.binary_b()
#print('在这里')
if (((binary_U[y_start:y_end, x_start:x_end] > 200).sum()) / (pic.size / 3)) > 0.4:
result += 'U'
elif (((binary_R[y_start:y_end, x_start:x_end] > 200).sum()) / (pic.size / 3)) > 0.4:
result += 'R'
elif (((binary_F[y_start:y_end, x_start:x_end] > 200).sum()) / (pic.size / 3)) > 0.4:
result += 'F'
elif (((binary_D[y_start:y_end, x_start:x_end] > 200).sum()) / (pic.size / 3)) > 0.4:
result += 'D'
elif (((binary_L[y_start:y_end, x_start:x_end] > 200).sum()) / (pic.size / 3)) > 0.4:
result += 'L'
elif (((binary_B[y_start:y_end, x_start:x_end] > 200).sum()) / (pic.size / 3)) > 0.4:
result += 'B'
elif (((binary_F_[y_start:y_end, x_start:x_end] > 200).sum()) / (pic.size / 3)) > 0.4:
result += 'F'
else:
result += "D"
return result
主函数
from class_test import Image
from colorCube import color_cube
import kociemba
U_name = "your path"
R_name = "your path"
F_name = "your path"
D_name = "your path"
L_name = "your path"
B_name = "your path"
img1 = Image(img_name=U_name)
img2 = Image(img_name=R_name)
img3 = Image(img_name=F_name)
img4 = Image(img_name=D_name)
img5 = Image(img_name=L_name)
img6 = Image(img_name=B_name)
img_list = [img1, img2, img3, img4, img5, img6]
result_all = ''
for i in range(6):
result_all += color_cube(img_list[i])
print(result_all)
solved_result = kociemba.solve(result_all)
print(solved_result)
无关紧要的小代码,作用是识别hsv值
import cv2
img = cv2.imread("C:/Users/Niyingqi/Desktop/ab1e651c988c2314207acf9d5032805.jpg")
height, width, _ = img.shape
cx = int(width/9*2)
cy = int(height/9*8)
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
print('hsv:', hsv_img[cy, cx])
和下位机通信
import time
import serial
import serial.tools.list_ports
import cube_3
#还原步骤
steps = cube_3.solved_result
#确定串口号
ports_list = list(serial.tools.list_ports.comports())
if len(ports_list) <= 0:
print('未获取到串口设备')
else:
print('可用设备如下:')
for comport in ports_list:
print(list(comport)[0],list(comport)[1])
#配置串口,打开串口
ser = serial.Serial('',9600)
#发送数据(bytes类型)
write_len = ser.write(steps.encode('utf-8'))
print('串口发出{}个字节', format(write_len))
if ser.is_open():
print('串口已开启')
print(ser.name)
else:
print('串口打开失败')
time.sleep(1)
ser.close()
总结:
大一时期写的ls代码,全放出来了,kociemba部分是在CSDN上下载的,大家自行找吧。。