基于四博 ESP32-S3 + VB6824 打造 A1 AI 智能拍学机:视觉识别、语音交互与 AI 学习应用落地方案

基于四博 ESP32-S3 + VB6824 打造 A1 AI 智能拍学机:视觉识别、语音交互与 AI 学习应用落地方案

1. 项目背景

随着 AI 大模型逐步进入终端硬件,传统学习机正在从"内容播放设备"升级为"多模态 AI 交互设备"。四博 A1 AI 智能拍学机的目标,是基于 ESP32-S3 + 摄像头 + 屏幕 + 麦克风 + 喇叭 + VB6824 离线语音芯片 + 云端大模型,构建一套可量产、可定制、可扩展的 AI 学习终端。

四博 AI 硬件选型资料中已经给出 ESP32-S3 + 7014 + 摄像头 + 4G 高端方案 ,并强调该方案开发者生态好、可以方便对接各类平台,支持多模态、游戏和蓝牙音箱等功能。资料中 AI 智能相机方案也采用 ESP32S3R8 + 16M Flash + VB6824,支持 2.0 寸屏、4G 选配、存储卡选配、摄像头、麦克风、电池包、喇叭等配置。

同时,四博 ESP32-C2/C3/S3 + VB6824 语音方案已经应用于电子吧唧、S3 双目、S3 拍学机、地球仪、拍拍灯等场景,VB6824 可负责音频编解码、AEC、语音唤醒和唤醒词修改,让主控专注通信和 UI。


2. 系统总体架构

A1 AI 智能拍学机可以拆成四个核心子系统:

复制代码

┌───────────────────────────────────────┐

│ A1 AI 智能拍学机系统 │

├───────────────────────────────────────┤

│ 1. 感知层 │

│ Camera / MIC / Button / Touch │

├───────────────────────────────────────┤

│ 2. 设备控制层 │

│ ESP32-S3 / LVGL / Wi-Fi / BLE │

├───────────────────────────────────────┤

│ 3. 语音协处理层 │

│ VB6824 / Wakeup / AEC / Offline CMD │

├───────────────────────────────────────┤

│ 4. 云端 AI 层 │

│ OCR / ASR / LLM / TTS / RAG / MCP │

└───────────────────────────────────────┘

ESP32-S3 负责屏幕 UI、摄像头采集、网络通信、WebSocket 协议、OTA、任务调度;VB6824 负责离线唤醒、命令词识别、AEC 和音频前处理;云端 AI 服务负责 OCR、拍题讲解、绘本理解、英语跟读评分和大模型问答。

四博模组选型手册中,ESPS3-32 系列支持 N4/N8/N8R2/N16R2/N16R8 等子型号,芯片包括 ESP32-S3/S3R2/S3R8,兼容 ESP32-S3-WROOM-1 系列模组。 ESP32-S3 在四博乐鑫族系表中属于 Wi-Fi + BLE5 平台,Xtensa 双核 240MHz,并支持 DVP、RGB/I8080/SPI LCD 等外设,适合音视频和 AIoT 应用。


3. 推荐硬件配置

复制代码

主控:ESP32-S3R8 / ESPS3-32 N16R8

Flash:16MB

PSRAM:8MB

摄像头:OV2640 / GC0308

显示屏:2.0 寸 SPI LCD / RGB LCD

语音:VB6824

音频:数字麦克风 / 模拟麦克风 + 喇叭 + 功放

网络:Wi-Fi + BLE,4G 可选

存储:TF Card 可选

电源:锂电池 + Type-C 充电

交互:按键 / 触摸 / 姿态传感器可选


4. 固件工程目录设计

复制代码

a1_ai_study_camera/

├── main/

│ ├── app_main.c

│ ├── board_config.h

│ ├── app_event.h

│ ├── camera_manager.c

│ ├── camera_manager.h

│ ├── vb6824_uart.c

│ ├── vb6824_uart.h

│ ├── wifi_manager.c

│ ├── wifi_manager.h

│ ├── ws_ai_client.c

│ ├── ws_ai_client.h

│ ├── ai_protocol.c

│ ├── ai_protocol.h

│ ├── lvgl_ui.c

│ ├── lvgl_ui.h

│ ├── ota_manager.c

│ └── ota_manager.h

├── components/

│ ├── lcd_driver/

│ ├── audio_player/

│ ├── json_helper/

│ └── storage_manager/

├── partitions.csv

├── sdkconfig.defaults

└── CMakeLists.txt


5. sdkconfig.defaults 推荐配置

复制代码

CONFIG_IDF_TARGET="esp32s3"

CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y

CONFIG_SPIRAM=y

CONFIG_SPIRAM_MODE_OCT=y

CONFIG_SPIRAM_SPEED_80M=y

CONFIG_SPIRAM_USE_MALLOC=y

CONFIG_FREERTOS_HZ=1000

CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192

CONFIG_LWIP_TCP_SND_BUF_DEFAULT=8192

CONFIG_LWIP_TCP_WND_DEFAULT=8192

CONFIG_LWIP_TCP_RECVMBOX_SIZE=16

CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10

CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32

CONFIG_ESP_WIFI_TX_BUFFER_TYPE_DYNAMIC=y

CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384

CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096

CONFIG_BT_ENABLED=y

CONFIG_BT_NIMBLE_ENABLED=y


6. 分区表设计

A1 拍学机建议预留 OTA 双分区和资源区,用于后续升级固件、更新提示音、字体、图片和游戏资源。

复制代码

Name, Type, SubType, Offset, Size

nvs, data, nvs, 0x9000, 0x6000

otadata, data, ota, 0xf000, 0x2000

phy_init, data, phy, 0x11000, 0x1000

factory, app, factory, 0x20000, 0x300000

ota_0, app, ota_0, , 0x300000

ota_1, app, ota_1, , 0x300000

spiffs, data, spiffs, , 0x400000


7. 主程序启动流程

复制代码

#include "freertos/FreeRTOS.h"

#include "freertos/task.h"

#include "esp_log.h"

#include "nvs_flash.h"

#include "wifi_manager.h"

#include "camera_manager.h"

#include "vb6824_uart.h"

#include "ws_ai_client.h"

#include "lvgl_ui.h"

#include "ota_manager.h"

static const char *TAG = "A1_MAIN";

void app_main(void)

{

ESP_LOGI(TAG, "四博 A1 AI 智能拍学机启动");

esp_err_t ret = nvs_flash_init();

if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||

ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {

ESP_ERROR_CHECK(nvs_flash_erase());

ESP_ERROR_CHECK(nvs_flash_init());

}

lvgl_ui_init();

lvgl_ui_show_boot("A1 AI Study Camera");

wifi_manager_init();

camera_manager_init();

vb6824_uart_init();

ota_manager_init();

lvgl_ui_show_status("正在连接 Wi-Fi...");

wifi_manager_start();

lvgl_ui_show_status("正在连接 AI 服务...");

ws_ai_client_start();

xTaskCreate(vb6824_uart_task, "vb6824_uart", 4096, NULL, 5, NULL);

lvgl_ui_show_home();

ESP_LOGI(TAG, "系统初始化完成");

}


8. 摄像头采集模块

复制代码

#include "esp_camera.h"

#include "esp_log.h"

#include "camera_manager.h"

static const char *TAG = "CAMERA";

#define CAM_PIN_PWDN -1

#define CAM_PIN_RESET -1

#define CAM_PIN_XCLK 15

#define CAM_PIN_SIOD 4

#define CAM_PIN_SIOC 5

#define CAM_PIN_D7 16

#define CAM_PIN_D6 17

#define CAM_PIN_D5 18

#define CAM_PIN_D4 12

#define CAM_PIN_D3 10

#define CAM_PIN_D2 8

#define CAM_PIN_D1 9

#define CAM_PIN_D0 11

#define CAM_PIN_VSYNC 6

#define CAM_PIN_HREF 7

#define CAM_PIN_PCLK 13

esp_err_t camera_manager_init(void)

{

camera_config_t config = {

.pin_pwdn = CAM_PIN_PWDN,

.pin_reset = CAM_PIN_RESET,

.pin_xclk = CAM_PIN_XCLK,

.pin_sccb_sda = CAM_PIN_SIOD,

.pin_sccb_scl = CAM_PIN_SIOC,

.pin_d7 = CAM_PIN_D7,

.pin_d6 = CAM_PIN_D6,

.pin_d5 = CAM_PIN_D5,

.pin_d4 = CAM_PIN_D4,

.pin_d3 = CAM_PIN_D3,

.pin_d2 = CAM_PIN_D2,

.pin_d1 = CAM_PIN_D1,

.pin_d0 = CAM_PIN_D0,

.pin_vsync = CAM_PIN_VSYNC,

.pin_href = CAM_PIN_HREF,

.pin_pclk = CAM_PIN_PCLK,

.xclk_freq_hz = 20000000,

.ledc_timer = LEDC_TIMER_0,

.ledc_channel = LEDC_CHANNEL_0,

.pixel_format = PIXFORMAT_JPEG,

.frame_size = FRAMESIZE_SVGA,

.jpeg_quality = 12,

.fb_count = 2,

.grab_mode = CAMERA_GRAB_LATEST

};

esp_err_t ret = esp_camera_init(&config);

if (ret != ESP_OK) {

ESP_LOGE(TAG, "摄像头初始化失败: 0x%x", ret);

return ret;

}

ESP_LOGI(TAG, "摄像头初始化成功");

return ESP_OK;

}

camera_fb_t *camera_manager_capture(void)

{

camera_fb_t *fb = esp_camera_fb_get();

if (!fb) {

ESP_LOGE(TAG, "拍照失败");

return NULL;

}

ESP_LOGI(TAG, "拍照成功, len=%d", fb->len);

return fb;

}

void camera_manager_release(camera_fb_t *fb)

{

if (fb) {

esp_camera_fb_return(fb);

}

}


9. WebSocket AI 通信模块

A1 拍学机与云端 AI 服务建议使用 WebSocket 长连接。文本交互、状态通知、TTS 地址、OTA 通知都可以走 JSON;图片数据可以走二进制帧。

复制代码

#include "esp_websocket_client.h"

#include "esp_log.h"

#include "cJSON.h"

#include "ai_protocol.h"

#include "lvgl_ui.h"

static const char *TAG = "WS_AI";

static esp_websocket_client_handle_t ws = NULL;

static void ws_event_handler(

void *handler_args,

esp_event_base_t base,

int32_t event_id,

void *event_data

)

{

esp_websocket_event_data_t *data = (esp_websocket_event_data_t *)event_data;

switch (event_id) {

case WEBSOCKET_EVENT_CONNECTED:

ESP_LOGI(TAG, "AI WebSocket 已连接");

lvgl_ui_show_status("AI 服务在线");

break;

case WEBSOCKET_EVENT_DISCONNECTED:

ESP_LOGW(TAG, "AI WebSocket 已断开");

lvgl_ui_show_status("AI 服务断开,正在重连");

break;

case WEBSOCKET_EVENT_DATA:

if (data->op_code == 0x1) {

ESP_LOGI(TAG, "收到文本: %.*s", data->data_len, (char *)data->data_ptr);

ai_protocol_parse((char *)data->data_ptr, data->data_len);

}

break;

case WEBSOCKET_EVENT_ERROR:

ESP_LOGE(TAG, "WebSocket 错误");

break;

default:

break;

}

}

void ws_ai_client_start(void)

{

esp_websocket_client_config_t config = {

.uri = "wss://ai.example.com/a1/ws",

.reconnect_timeout_ms = 3000,

.network_timeout_ms = 10000,

};

ws = esp_websocket_client_init(&config);

esp_websocket_register_events(

ws,

WEBSOCKET_EVENT_ANY,

ws_event_handler,

NULL

);

esp_websocket_client_start(ws);

}

bool ws_ai_client_is_ready(void)

{

return ws && esp_websocket_client_is_connected(ws);

}

void ws_ai_send_text_json(const char *json)

{

if (!ws_ai_client_is_ready()) {

ESP_LOGW(TAG, "WebSocket 未连接");

return;

}

esp_websocket_client_send_text(ws, json, strlen(json), portMAX_DELAY);

}


10. 拍题识别:图片上传 + Prompt

复制代码

#include "camera_manager.h"

#include "ws_ai_client.h"

#include "cJSON.h"

#include "lvgl_ui.h"

void app_homework_recognize(void)

{

lvgl_ui_show_status("正在拍照...");

camera_fb_t *fb = camera_manager_capture();

if (!fb) {

lvgl_ui_show_error("拍照失败,请重试");

return;

}

cJSON *root = cJSON_CreateObject();

cJSON_AddStringToObject(root, "type", "image_start");

cJSON_AddStringToObject(root, "scene", "homework");

cJSON_AddStringToObject(root, "device_id", "A1_S3_001122334455");

cJSON_AddStringToObject(root, "image_format", "jpeg");

cJSON_AddNumberToObject(root, "image_len", fb->len);

cJSON_AddStringToObject(root, "prompt",

"请识别图片中的题目,给出答案,并用适合小学生理解的方式分步讲解。");

char *json = cJSON_PrintUnformatted(root);

ws_ai_send_text_json(json);

cJSON_free(json);

cJSON_Delete(root);

if (ws_ai_client_is_ready()) {

esp_websocket_client_send_bin(

ws_ai_get_handle(),

(const char *)fb->buf,

fb->len,

portMAX_DELAY

);

}

camera_manager_release(fb);

lvgl_ui_show_status("AI 正在分析题目...");

}


11. AI 返回 JSON 解析

复制代码

#include "cJSON.h"

#include "esp_log.h"

#include "lvgl_ui.h"

#include "audio_player.h"

#include "ota_manager.h"

static const char *TAG = "AI_PROTOCOL";

void ai_protocol_parse(const char *json, int len)

{

cJSON *root = cJSON_ParseWithLength(json, len);

if (!root) {

ESP_LOGE(TAG, "JSON 解析失败");

return;

}

cJSON *type = cJSON_GetObjectItem(root, "type");

if (!cJSON_IsString(type)) {

cJSON_Delete(root);

return;

}

if (strcmp(type->valuestring, "ai_result") == 0) {

cJSON *title = cJSON_GetObjectItem(root, "title");

cJSON *text = cJSON_GetObjectItem(root, "text");

cJSON *tts_url = cJSON_GetObjectItem(root, "tts_url");

if (cJSON_IsString(title) && cJSON_IsString(text)) {

lvgl_ui_show_ai_result(title->valuestring, text->valuestring);

}

if (cJSON_IsString(tts_url)) {

audio_player_play_url(tts_url->valuestring);

}

}

else if (strcmp(type->valuestring, "english_score") == 0) {

cJSON *score = cJSON_GetObjectItem(root, "score");

cJSON *comment = cJSON_GetObjectItem(root, "comment");

if (cJSON_IsNumber(score) && cJSON_IsString(comment)) {

lvgl_ui_show_english_score(score->valueint, comment->valuestring);

}

}

else if (strcmp(type->valuestring, "ota_notify") == 0) {

cJSON *url = cJSON_GetObjectItem(root, "firmware_url");

if (cJSON_IsString(url)) {

ota_manager_start(url->valuestring);

}

}

cJSON_Delete(root);

}


12. VB6824 串口命令解析

复制代码

#include "driver/uart.h"

#include "esp_log.h"

#define VB_UART_NUM UART_NUM_1

#define VB_UART_TX 17

#define VB_UART_RX 18

#define VB_UART_BAUD 115200

#define VB_RX_BUF_SIZE 1024

static const char *TAG = "VB6824";

typedef enum {

VB_CMD_WAKEUP = 0x01,

VB_CMD_TAKE_PHOTO = 0x02,

VB_CMD_HOMEWORK = 0x03,

VB_CMD_ENGLISH = 0x04,

VB_CMD_STORY = 0x05,

VB_CMD_GAME = 0x06,

VB_CMD_BACK_HOME = 0x07,

} vb_cmd_t;

void vb6824_uart_init(void)

{

uart_config_t uart_config = {

.baud_rate = VB_UART_BAUD,

.data_bits = UART_DATA_8_BITS,

.parity = UART_PARITY_DISABLE,

.stop_bits = UART_STOP_BITS_1,

.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,

.source_clk = UART_SCLK_DEFAULT,

};

uart_driver_install(VB_UART_NUM, VB_RX_BUF_SIZE, 0, 0, NULL, 0);

uart_param_config(VB_UART_NUM, &uart_config);

uart_set_pin(VB_UART_NUM, VB_UART_TX, VB_UART_RX,

UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

ESP_LOGI(TAG, "VB6824 UART 初始化完成");

}

static uint8_t checksum_sum(uint8_t *data, int len)

{

uint8_t sum = 0;

for (int i = 0; i < len; i++) {

sum += data[i];

}

return sum;

}

static void vb6824_handle_cmd(uint8_t cmd)

{

switch (cmd) {

case VB_CMD_WAKEUP:

lvgl_ui_show_status("我在,请说");

break;

case VB_CMD_TAKE_PHOTO:

case VB_CMD_HOMEWORK:

app_homework_recognize();

break;

case VB_CMD_ENGLISH:

app_english_repeat_start();

break;

case VB_CMD_STORY:

app_story_start();

break;

case VB_CMD_GAME:

app_word_game_start();

break;

case VB_CMD_BACK_HOME:

lvgl_ui_show_home();

break;

default:

ESP_LOGW(TAG, "未知命令: 0x%02X", cmd);

break;

}

}

void vb6824_uart_task(void *arg)

{

uint8_t data[64];

while (1) {

int len = uart_read_bytes(

VB_UART_NUM,

data,

sizeof(data),

pdMS_TO_TICKS(100)

);

if (len >= 5) {

if (data[0] == 0xAA && data[1] == 0x55) {

uint8_t frame_len = data[2];

uint8_t cmd = data[3];

uint8_t checksum = data[4];

uint8_t calc = checksum_sum(data, 4);

if (calc == checksum) {

vb6824_handle_cmd(cmd);

} else {

ESP_LOGW(TAG, "校验失败");

}

}

}

}

}


13. LVGL 首页 UI

复制代码

#include "lvgl.h"

static lv_obj_t *status_label;

static void homework_btn_event(lv_event_t *e)

{

app_homework_recognize();

}

static void english_btn_event(lv_event_t *e)

{

app_english_repeat_start();

}

static void game_btn_event(lv_event_t *e)

{

app_word_game_start();

}

static lv_obj_t *create_menu_btn(lv_obj_t *parent, const char *text, int x, int y, lv_event_cb_t cb)

{

lv_obj_t *btn = lv_btn_create(parent);

lv_obj_set_size(btn, 120, 46);

lv_obj_align(btn, LV_ALIGN_TOP_LEFT, x, y);

lv_obj_add_event_cb(btn, cb, LV_EVENT_CLICKED, NULL);

lv_obj_t *label = lv_label_create(btn);

lv_label_set_text(label, text);

lv_obj_center(label);

return btn;

}

void lvgl_ui_show_home(void)

{

lv_obj_clean(lv_scr_act());

lv_obj_t *title = lv_label_create(lv_scr_act());

lv_label_set_text(title, "四博 A1 AI 拍学机");

lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 12);

create_menu_btn(lv_scr_act(), "拍题识别", 20, 60, homework_btn_event);

create_menu_btn(lv_scr_act(), "英语跟读", 160, 60, english_btn_event);

create_menu_btn(lv_scr_act(), "绘本陪读", 20, 120, homework_btn_event);

create_menu_btn(lv_scr_act(), "AI 问答", 160, 120, homework_btn_event);

create_menu_btn(lv_scr_act(), "单词游戏", 20, 180, game_btn_event);

create_menu_btn(lv_scr_act(), "系统设置", 160, 180, game_btn_event);

status_label = lv_label_create(lv_scr_act());

lv_label_set_text(status_label, "Wi-Fi 已连接 | AI 在线");

lv_obj_align(status_label, LV_ALIGN_BOTTOM_MID, 0, -8);

}

void lvgl_ui_show_status(const char *text)

{

if (status_label) {

lv_label_set_text(status_label, text);

}

}


14. 英语跟读请求

复制代码

#include "cJSON.h"

#include "ws_ai_client.h"

void app_english_repeat_send(const char *sentence)

{

cJSON *root = cJSON_CreateObject();

cJSON_AddStringToObject(root, "type", "english_repeat");

cJSON_AddStringToObject(root, "device_id", "A1_S3_001122334455");

cJSON_AddStringToObject(root, "sentence", sentence);

cJSON_AddStringToObject(root, "level", "primary_school");

cJSON_AddBoolToObject(root, "score_enable", true);

char *json = cJSON_PrintUnformatted(root);

ws_ai_send_text_json(json);

cJSON_free(json);

cJSON_Delete(root);

}


15. 单词游戏模块

复制代码

typedef struct {

const char *word;

const char *options[4];

int answer;

} word_quiz_t;

static word_quiz_t quiz_list[] = {

{

.word = "apple",

.options = {"苹果", "香蕉", "橙子", "西瓜"},

.answer = 0

},

{

.word = "school",

.options = {"老师", "学校", "铅笔", "书包"},

.answer = 1

}

};

static int current_quiz = 0;

void app_word_game_start(void)

{

current_quiz = 0;

lvgl_ui_show_quiz(

quiz_list[current_quiz].word,

quiz_list[current_quiz].options,

4

);

}

void app_word_game_answer(int index)

{

if (index == quiz_list[current_quiz].answer) {

audio_player_play_local("/spiffs/right.mp3");

lvgl_ui_show_status("回答正确");

} else {

audio_player_play_local("/spiffs/wrong.mp3");

lvgl_ui_show_status("再想一想");

}

current_quiz++;

if (current_quiz >= sizeof(quiz_list) / sizeof(quiz_list[0])) {

current_quiz = 0;

}

lvgl_ui_show_quiz(

quiz_list[current_quiz].word,

quiz_list[current_quiz].options,

4

);

}


16. OTA 升级模块

复制代码

#include "esp_https_ota.h"

#include "esp_log.h"

#include "esp_system.h"

static const char *TAG = "OTA";

void ota_manager_start(const char *firmware_url)

{

ESP_LOGI(TAG, "开始 OTA: %s", firmware_url);

esp_http_client_config_t http_config = {

.url = firmware_url,

.timeout_ms = 15000,

.keep_alive_enable = true,

};

esp_https_ota_config_t ota_config = {

.http_config = &http_config,

};

esp_err_t ret = esp_https_ota(&ota_config);

if (ret == ESP_OK) {

ESP_LOGI(TAG, "OTA 成功,准备重启");

esp_restart();

} else {

ESP_LOGE(TAG, "OTA 失败: %s", esp_err_to_name(ret));

}

}


17. 总结

四博 A1 AI 智能拍学机的核心不是单纯"加一个摄像头",而是把 ESP32-S3 的图像采集、UI 显示、Wi-Fi/BLE 通信能力,与 VB6824 的离线语音、AEC、唤醒词能力结合,再通过 WebSocket 接入 OCR、ASR、LLM、TTS 等云端 AI 服务。

最终形成的产品能力包括:

复制代码

拍题识别

绘本陪读

英语跟读

AI 问答

百科讲解

单词游戏

成语接龙

OTA 升级

小程序配网

知识库接入

对于方案商和品牌客户来说,这类架构最大的优势是:成本可控、开发周期短、AI 能力可扩展、适合快速量产和二次定制。

相关推荐
中海德--陈顺真5 小时前
HONEYWELL 扫描架控制板 51000398
运维·服务器·人工智能
数智前线5 小时前
零售连锁门店的柔性管理之困,海康云眸Claw如何破解?
人工智能
AI技术增长5 小时前
Pytorch图像去噪实战(十四):条件扩散模型图像去噪,让Diffusion根据带噪图恢复干净图
人工智能·pytorch·python
tangweiguo030519875 小时前
LangGraph 入门:多智能体工作流实战(阿里云百炼)
人工智能·python·langchain
饭后一颗花生米5 小时前
AI算力选型全景指南:从入门到旗舰的硬核实操
人工智能
Yue栎廷5 小时前
邪修:Markdown加粗语法**本土化改造
前端·javascript·人工智能
2301_815279525 小时前
实战分享LangChain WebUI 部署智能客服:从零搭建到生产环境优化
人工智能·langchain
三维频道5 小时前
柔性材料3D数字化:蓝光扫描在内衣胸垫设计与质检中的应用
人工智能·3d·逆向工程·蓝光3d扫描仪·服装数字化·内衣设计·柔性材料检测
科研前沿5 小时前
镜像视界浙江科技有限公司的核心引擎关键技术有哪些?
人工智能·数码相机·计算机视觉