这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【FRDMDEVBOARDFORI.MX91测评】成果贴-三阶魔方可视化识别与求

共1条 1/1 1 跳转至

【FRDMDEVBOARDFORI.MX91测评】成果贴-三阶魔方可视化识别与求解系统实现

菜鸟
2026-06-07 15:16:39     打赏
1、项目介绍本项目基于NXP FRDM-IMX91嵌入式开发板,搭建一套轻量化、可落地的嵌入式机器视觉魔方智能识别与还原系统。项目依托OpenCV视觉处理技术、Kociemba魔方求解算法、多线程并发编程及Flask Web推流技术,实现魔方六面自动采集、颜色智能识别、魔方合法状态校验、最优还原步骤求解、魔方姿态可视化、远程实时监控等全闭环功能。系统无需上位机辅助,完全在IMX91嵌入式Linux平台本地运算,通过开发板物理按键控制整套流程,同时开启双Web视频流服务,支持局域网内浏览器远程查看摄像头实时画面与魔方展开仿真图,可直观展示项目落地效果。

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系统即插即用,满足近距离高精度色块识别需求。


71054cceafbcbbfa8b289fbe0a65aa7.jpg

3、整体设计思路/功能效果

3.1 整体设计思路

本项目采用分层模块化+多线程并发设计思路,将系统拆分为硬件驱动层、视觉处理层、算法逻辑层、可视化交互层四大层级,各模块解耦独立运行,互不阻塞。整体流程遵循「图像采集→智能识别→数据校验→算法求解→仿真还原→远程展示」的闭环逻辑,依托多线程实现摄像头推流、按键监听、魔方处理、可视化渲染并行工作,最大化利用IMX91硬件算力。

3.2 系统功能框图

本系统采用分层架构设计,从硬件底层到上层应用展示逐级递进,模块解耦、层级清晰,以下为系统完整功能框图:

下载.jpg

3.3 软件运行流程图

系统软件流程采用串行闭环逻辑,结合多线程后台常驻运行,整体流程清晰、逻辑严谨,具体软件运行流程图如下:


下载 (1).jpg

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摄像头采集魔方图片,手动调整魔方使色块识别准确后,通过开发板上按键进行确认进入下一步,开发板进行还原求解

2cbe25fdb42c22be7684f848fb8a914.jpg

通过连接局域网的PC打开Web显示服务端口,实时显示模仿色块识别结果和魔方实时展开图

01a35dbfa9e7ba07d4f4a9dba50264c.jpg

方案整体实现效果图如下图所示,求解打印还原步骤并演示分步还原过程

3c03c5f1a0077133665f69427acc2a5.jpg

下面是b站视频演示

系统整体运行流畅,IMX91硬件算力充足,视觉识别精准、求解速度快、可视化效果直观,多线程运行稳定无卡顿,远程Web访问延迟低,完整实现了预设的全部智能识别与还原功能,落地效果良好。

7、技术难点与解决方案/心得体会

7.1 核心技术难点及解决方案

难点1:嵌入式环境颜色识别易受光照干扰

问题:普通RGB色彩识别对光照亮度、阴影敏感,易出现色块识别错误、颜色混淆问题。

解决方案:改用HSV色彩空间进行阈值分割,分离亮度与色相信息,规避光照干扰;同时预留本地json标定文件,支持自定义适配不同环境的颜色阈值,大幅提升识别鲁棒性。


难点2:魔方采集姿态不标准,导致魔方状态非法、无法求解

问题:人工采集魔方时,魔方面存在旋转偏移,直接拼接的魔方字符串不合法,算法无法求解。

解决方案:通过穷举六个面所有旋转姿态,自动匹配唯一合法可解的魔方状态,无需人工矫正魔方姿态,实现智能化适配校正。


难点3:多线程任务并发冲突、服务阻塞卡顿

问题:图像采集、绘图推流、按键监听、算法运算多任务并行,易出现资源抢占、线程阻塞、画面卡顿问题。

解决方案:采用守护线程隔离各任务模块,全局变量统一管控魔方状态与图像数据,任务解耦独立运行,避免资源冲突,保障系统长时间稳定运行。


难点4:嵌入式设备Web推流延迟高、画面闪烁

问题:嵌入式算力有限,传统图片刷新方式延迟高、画面卡顿闪烁。

解决方案:采用MJPEG流式输出协议,持续编码帧推送,轻量化传输,降低网络延迟,实现浏览器实时流畅播放。

7.2 项目心得体会

本次基于FRDM-IMX91的魔方智能识别还原项目,完整落地了嵌入式机器视觉、智能算法、多线程并发、Web远程可视化的综合应用。在项目开发过程中,我深入掌握了嵌入式Linux外设驱动调用、OpenCV图像预处理与色彩识别原理,理解了模块化编程与多线程任务调度的核心逻辑。同时深刻体会到嵌入式开发与PC开发的差异:嵌入式设备算力有限,必须通过算法优化、任务解耦、轻量化部署保障系统稳定性。针对光照干扰、姿态偏差、线程冲突等实际工程问题,通过调试优化、算法适配、架构调整逐一解决,提升了问题排查与工程落地能力。此外,本次项目充分验证了FRDM-IMX91开发板在边缘AI、机器视觉场景的优异性能,硬件稳定性与算力完全可以满足中小型智能视觉项目的部署需求,为后续嵌入式智能设备、自动化视觉项目开发积累了扎实的实践经验。

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]