2、硬件介绍
2.1 核心硬件平台:FRDM-IMX91开发板
FRDM-IMX91是NXP推出的高性能嵌入式工业级开发板,搭载i.MX 91多核处理器,基于Linux系统架构,具备优异的边缘算力、低功耗特性和丰富的外设接口,完美适配本项目的视觉运算、多线程并发、网络推流需求。核心硬件参数与优势如下:算力性能:ARM核CPU架构,可稳定运行OpenCV图像预处理、色彩空间转换、像素遍历识别等视觉运算,同时支撑多线程并行任务,无卡顿、无算力瓶颈,满足嵌入式实时视觉场景需求。
系统适配:搭载嵌入式Linux系统,完美兼容Python开发环境,支持OpenCV、Flask、第三方算法库的部署运行,开发门槛低、兼容性强。
外设资源:支持USB摄像头接入、输入事件按键驱动、以太网网络通信,为本项目图像采集、按键交互、Web远程推流提供硬件支撑。
稳定性:工业级硬件设计,长时间运行多线程任务、网络服务无死机、无内存溢出,嵌入式部署稳定性优异。
2.2 方案配套核心器件
USB高清摄像头:640×480分辨率,负责实时采集魔方画面,支持Linux系统即插即用,满足近距离高精度色块识别需求。

3、整体设计思路/功能效果
3.1 整体设计思路
本项目采用分层模块化+多线程并发设计思路,将系统拆分为硬件驱动层、视觉处理层、算法逻辑层、可视化交互层四大层级,各模块解耦独立运行,互不阻塞。整体流程遵循「图像采集→智能识别→数据校验→算法求解→仿真还原→远程展示」的闭环逻辑,依托多线程实现摄像头推流、按键监听、魔方处理、可视化渲染并行工作,最大化利用IMX91硬件算力。3.2 系统功能框图
本系统采用分层架构设计,从硬件底层到上层应用展示逐级递进,模块解耦、层级清晰,以下为系统完整功能框图:
3.3 软件运行流程图
系统软件流程采用串行闭环逻辑,结合多线程后台常驻运行,整体流程清晰、逻辑严谨,具体软件运行流程图如下:
3.4 核心功能效果
实时视频采集:640×480分辨率流畅采集,实时标注识别色块与面序号;
智能颜色识别:基于HSV阈值精准区分白、黄、红、橙、绿、蓝六种魔方颜色,抗干扰性强;
全自动采集:按键触发单面带采集,自动去重,6面采集完成后自动整合魔方状态;
智能求解:秒级输出魔方最优还原步骤,自动过滤非法魔方状态;
动态仿真:逐步骤模拟魔方旋转还原,实时刷新魔方展开图;
远程可视化:双端口Web服务,分别展示原始摄像头画面与魔方仿真展开图。
4、具体实现情况
4.1 系统环境搭建
在FRDM-IMX91嵌入式Linux系统中,部署Python运行环境,安装OpenCV、numpy、kociemba、magiccube、Flask等核心依赖库,配置摄像头设备权限、按键事件设备权限,完成颜色标定文件初始化,适配嵌入式硬件运行环境。4.2 多线程任务部署
系统采用守护线程并行运行四大核心任务,全程无阻塞:按键监听线程:实时监听物理按键事件,响应用户操作指令;
魔方处理主线程:负责图像采集、颜色识别、状态校验、求解还原全逻辑;
5000端口Web服务线程:推送摄像头原始实时画面;
5001端口Web服务线程:推送魔方动态展开仿真图。
4.3 核心业务实现
系统启动后自动初始化摄像头,加载默认或历史颜色标定参数。用户通过物理按键逐次采集魔方六个面,程序自动分割每面3×3色块区域,识别对应颜色并绑定魔方面属性。六面采集完成后,系统自动遍历魔方旋转姿态,校验合法可解状态,调用算法生成最优还原步骤,随后逐步骤模拟魔方旋转,动态更新可视化画面,最终完成魔方还原演示,支持按键重置重复运行。5、关键代码介绍
代码github地址:AllenLiang0412/CubeColorDetectAndSolve: 三阶魔方可视化识别与求解实现
关键代码分为以下几个部分
5.1 全局配置与映射模块
核心定义魔方旋转规则、六色HSV识别阈值、魔方面与中心颜色映射关系,解决魔方颜色识别、姿态匹配的标准化问题。通过字典与字符串映射,统一识别、求解、可视化的坐标规则,同时支持本地json文件保存标定参数,提升环境适配性。# 颜色HSV阈值标定(核心识别基准)
DEFAULT_COLOR_THRESH = {
"W": [0, 180, 0, 30, 200, 255],
"Y": [20, 35, 100, 255, 100, 255],
"R": [0, 10, 120, 255, 100, 255],
"O": [10, 20, 120, 255, 100, 255],
"G": [40, 70, 80, 255, 80, 255],
"B": [90, 120, 80, 255, 80, 255]
}
# 魔方面与中心颜色映射标准
CENTER_COLOR_TO_FACE = {
"Y": "U", "W": "D", "G": "F",
"B": "B", "R": "L", "O": "R"
}
5.2 HSV颜色识别核心函数
get_color_by_thresh为视觉识别核心,将采集的ROI区域图像转换为HSV色彩空间,通过预设阈值掩膜遍历像素,统计各颜色像素占比,匹配最优色块颜色。相比RGB识别,HSV可规避光照亮度干扰,大幅提升嵌入式场景下的识别准确率。def get_color_by_thresh(hsv_roi, calib):
max_pixels = 0
best_color = "W"
# 遍历六色阈值,匹配像素最多的颜色
for color in COLOR_LIST:
if color not in calib: continue
h_min, h_max, s_min, s_max, v_min, v_max = calib[color]
mask = cv2.inRange(hsv_roi, np.array([h_min,s_min,v_min]), np.array([h_max,s_max,v_max]))
count = cv2.countNonZero(mask)
if count > max_pixels:
max_pixels = count
best_color = color
return best_color
5.3 魔方姿态校验与求解模块
find_valid_cube_and_solve通过迭代遍历六个面的四种旋转姿态,穷举所有合法魔方状态,筛选出可求解的标准魔方字符串。调用kociemba算法实现秒级求解,同时捕获异常,自动识别非法魔方状态并提示重置,保障系统运行稳定性。def find_valid_cube_and_solve():
global cubeColor, cubeStr, solveStr, cube_data,title,text
# 穷举六面所有旋转姿态,匹配合法魔方
for rot in product([0,1,2,3], repeat=6):
cubeStrTmp = build_cube(cubeStr, rot)
if solve_cube(cubeStrTmp):
cubeStr = cubeStrTmp
cubeColor = cubeStr.translate(FaceTransToColor)
print("魔方输入状态:", cubeStr)
print(f"还原步骤:{solveStr}")
return True
print("非法魔方状态无法求解")
title = "Cube Detect - Invalid Cube!"
return False
# 魔方求解核心封装
def solve_cube(cube_face):
global solveStr
try:
solveStr = solve(cube_face)
return True
except:
return False
5.4 魔方动态旋转仿真模块
cube_rotation依托magiccube库解析还原步骤,模拟魔方真实物理旋转,同步更新魔方颜色矩阵与状态字符串,实时刷新全局魔方数据,为可视化绘图提供最新姿态数据,实现步骤化动态还原效果。def cube_rotation(rotationMethod):
global cubeColor,cubeStr,cube_data
# 魔方姿态数据重构
cubeColorTmp = cubeColor[:9] + cubeColor[36:45] + cubeColor[18:27]+ \
cubeColor[9:18] + cubeColor[45:] + cubeColor[27:36]
# 模拟魔方旋转
c = Cube(3, cubeColorTmp)
c.rotate(rotationMethod)
# 解析旋转后最新魔方状态
lines = [line.strip() for line in str(c).splitlines()]
U = ''.join(lines[i].replace(' ','') for i in range(3))
# 更新全局魔方数据
cubeColor = U + lines[3] + lines[4] + lines[5] + lines[6] + lines[7]
cubeStr = cubeColor.translate(ColorTransToFace)
5.5 OpenCV可视化绘图模块
draw_cube_cv2自定义魔方标准展开图布局,纯本地渲染无依赖,自动绘制U、R、F、D、L、B六个魔方面的3×3色块,同步展示系统状态、还原进度、完整步骤,实现魔方姿态可视化。def draw_cube_cv2():
global cube_data, title, text
# 创建深色背景画布
img_height =12 * CELL_SIZE
img_width = 18 * CELL_SIZE
img = np.zeros((img_height, img_width, 3), dtype=np.uint8)
img[:] = (30,30,30)
# 遍历绘制六个魔方面3*3色块
for face, (x0, y0) in FACE_POS.items():
mat = cube_data[face]
for row in range(3):
for col in range(3):
x = x0 + col * CELL_SIZE
y = y0 + row * CELL_SIZE
color_key = mat[row][col] if mat else "G"
color = COLOR_RGB[color_key]
cv2.rectangle(img, (x+1, y+1), (x+CELL_SIZE-1, y+CELL_SIZE-1), color, -1)
cv2.rectangle(img, (x, y), (x+CELL_SIZE, y+CELL_SIZE), (0,0,0), 1)
# 绘制状态文本
cv2.putText(img, title, (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,255,255), 1)
return img
5.6 Web视频流推流模块
通过Flask搭建双服务端口,采用MJPEG流式输出协议,持续编码图像帧并推送至浏览器,实现低延迟远程实时查看,适配嵌入式设备轻量化网络传输需求。# 摄像头视频流生成器
def gen_camera():
global cap, collecting_finished, show_img
while True:
if collecting_finished == True:
success, show_img = cap.read()
if not success: break
ret, jpeg = cv2.imencode('.jpg', show_img)
yield (b'--frame\r\nContent-Type: image/jpeg\r\n\r\n' + jpeg.tobytes() + b'\r\n')
# Web路由推送视频流
@app_camera.route('/video_feed')
def video_feed():
return Response(gen_camera(), mimetype='multipart/x-mixed-replace; boundary=frame')
5.7 按键交互与自动采集模块
read_key_event读取Linux原生输入事件,精准识别按键按下动作;auto_collect_cube为系统主逻辑,闭环实现六面采集、状态校验、求解还原、重置循环,是整套系统的核心业务载体。# 监听Linux物理按键事件
def read_key_event():
global keyValue
with open(EVENT_DEVICE, "rb") as f:
while True:
event = f.read(EVENT_SIZE)
if not event: continue
tv_sec, tv_usec, type, code, value = struct.unpack(EVENT_FORMAT, event)
if type == 1 and value == KEY_PRESS:
keyValue = 1
# 魔方自动采集主逻辑
def auto_collect_cube():
while True:
collected = set()
collecting_finished = False
# 逐面采集魔方色块
while len(collected) < 6:
ret, frame = cap.read()
x, y, w, h = roi_box
face_img = frame[y:y+h, x:x+w]
# 逐格识别3*3颜色
for row in range(3):
for col in range(3):
cell_roi = hsv_face[cy1:cy2, cx1:cx2]
color = get_color_by_thresh(cell_roi, calib_data)
# 按键确认保存当前面
if keyValue == 1:
keyValue = 0
collected.add(center)
collecting_finished = True
6、功能展示
开发板连接USB摄像头采集魔方图片,手动调整魔方使色块识别准确后,通过开发板上按键进行确认进入下一步,开发板进行还原求解

通过连接局域网的PC打开Web显示服务端口,实时显示模仿色块识别结果和魔方实时展开图
方案整体实现效果图如下图所示,求解打印还原步骤并演示分步还原过程

下面是b站视频演示
系统整体运行流畅,IMX91硬件算力充足,视觉识别精准、求解速度快、可视化效果直观,多线程运行稳定无卡顿,远程Web访问延迟低,完整实现了预设的全部智能识别与还原功能,落地效果良好。
7、技术难点与解决方案/心得体会
7.1 核心技术难点及解决方案
难点1:嵌入式环境颜色识别易受光照干扰
问题:普通RGB色彩识别对光照亮度、阴影敏感,易出现色块识别错误、颜色混淆问题。
解决方案:改用HSV色彩空间进行阈值分割,分离亮度与色相信息,规避光照干扰;同时预留本地json标定文件,支持自定义适配不同环境的颜色阈值,大幅提升识别鲁棒性。
难点2:魔方采集姿态不标准,导致魔方状态非法、无法求解
问题:人工采集魔方时,魔方面存在旋转偏移,直接拼接的魔方字符串不合法,算法无法求解。
解决方案:通过穷举六个面所有旋转姿态,自动匹配唯一合法可解的魔方状态,无需人工矫正魔方姿态,实现智能化适配校正。
难点3:多线程任务并发冲突、服务阻塞卡顿
问题:图像采集、绘图推流、按键监听、算法运算多任务并行,易出现资源抢占、线程阻塞、画面卡顿问题。
解决方案:采用守护线程隔离各任务模块,全局变量统一管控魔方状态与图像数据,任务解耦独立运行,避免资源冲突,保障系统长时间稳定运行。
难点4:嵌入式设备Web推流延迟高、画面闪烁
问题:嵌入式算力有限,传统图片刷新方式延迟高、画面卡顿闪烁。
解决方案:采用MJPEG流式输出协议,持续编码帧推送,轻量化传输,降低网络延迟,实现浏览器实时流畅播放。
我要赚赏金
