魔方智能复原机器人(二)【代码块】

代码在这里:

先创建一个魔方类,规定每个面的属性和功能

 

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上下载的,大家自行找吧。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值