ESP32+OV7670做无线图传:从寄存器到MJPEG推流全解析
简介面向 ESP32 与 OV7670 摄像头联调的 Arduino 驱动示例工程适合物联网、嵌入式视觉方向的开发者快速上手图像采集与 I2S 传输。压缩包约 7.74MB共 55 个文件除 h/cpp/ino 源文件外还包含 o、bin、elf 等编译产物以及 vcxproj、xml、filters 等工程配置源码中 OV7670.cpp 负责摄像头寄存器初始化XClk.cpp 提供时钟信号I2SCamera.cpp 通过 I2S-DMA 完成像素读取README.md 则对引脚连接与调试步骤作了说明。目前已有 5784 人浏览学习。整份资料可用作 Arduino 环境中的 OV7670 启动模板读者既能对照源码理解 VSYNC/HREF 时序和帧缓冲管理也能省去重复移植驱动的过程直接验证摄像头出图与后续 Wi-Fi 传输方案。1. 一个三十块的摄像头模块让 ESP32 变成无线图传盒子把一块比指甲盖大不了多少的 OV7670 模块和 ESP32 焊在一起甚至不用焊杜邦线插上就行再写几百行 C 代码你就能得到一个能插浏览器实时看画面的无线摄像头。这块传感器年头不短没有内置 JPEG 压缩输出的是裸的 RGB565 或 YUV 数据但配合 ESP32 的 DMA 和 Wi-Fi照样能压出 15 帧每秒的 MJPEG 流延迟肉眼可接受。本笔记围绕 esp32 ov7670 摄像头案例展开适合想低成本做个无线监控、机器人视觉或者单纯想搞懂“摄像头数据到底怎么进单片机”的人。这不是一篇泛泛的科普而是把寄存器配置、帧同步、DMA 采集、JPEG 压缩、HTTP 推流讲到能直接跑通的程度。2. 硬件接线与技术选型从引脚分配到 DMA 通路2.1 为什么是 ESP32 OV7670 而不是一步到位市面上也有集成度更高的方案比如把摄像头 Sensor 和 MCU 焊在同一块板子上的开发板拿来就能用但代价是很多关键链路被封装成了黑匣子——你根本看不到一帧图像是怎么从 Sensor 进到内存的。OV7670 的好处恰恰在于散装它只负责输出原始像素流所有控制逻辑都在你手上SCCB 寄存器表也能查到全的。配合 ESP32 的双核、Wi-Fi、丰富的外设和 DMA 引擎这套组合既能当玩具也能当教学样例。用 ESP32 而不是传统 Arduino原因很现实。AVR 系单片机的 GPIO 中断频率和处理能力撑不起 VGA 分辨率的实时采集哪怕把分辨率降到 160x120逐像素读 GPIO 也会把 CPU 打满。ESP32 的 I2S 外设有一个并行的从接收模式可以把 8 根数据线并在一起当一个字节总线用外部像素时钟直接驱动 DMA 搬运CPU 只在帧完成时被叫醒一次。2.2 引脚分配与信号完整性OV7670 的接口可以拆成三组一组是 SCCB类似 I2C配置总线一组是时序同步信号VSYNC、HREF、PCLK、XCLK一组是 8 根像素数据线 D0-D7。电源部分要特别注意很多模块板载了稳压电路IO 是 3.3V 电平但有些裸片版本核心电压是 1.8V买模块时认准 3.3V 供电的版本。工程配套的 board.h 里写死了一套引脚分配我这边用的是一组兼容性比较好的接法OV7670 引脚方向ESP32 GPIO说明XCLK输入GPIO16LEDC 输出 10MHz 主时钟VSYNC输出GPIO25帧同步脉冲触发中断HREF输出GPIO26行有效信号采集时备用PCLK输出GPIO27像素时钟接到 I2S 位时钟脚D0-D7输出GPIO12/13/14/15/18/19/21/228 位像素数据SIO_CI2C 时钟GPIO23SCCB 时钟需 4.7k 上拉SIO_DI2C 数据GPIO32SCCB 数据需 4.7k 上拉VCC/GND-3.3V / GND严禁接 5V接线这件事上栽过跟头的人不少。D0-D7 这 8 根线如果超过 15 厘米高速翻转的 PCLK 会串扰到数据线上画面直接花掉。我一般会把杜邦线剪到 10 厘米以内并且把数据线和时钟线隔开走不扎成一捆。另外所有信号必须与 ESP32 共地否则传感器输出的电平参考点漂移采出来的数据全是错的。2.3 数据通路从 PCLK 到 DMA了解数据怎么流动比背引脚更重要。OV7670 输出的是一串连续的像素每个像素在 PCLK 的边沿被锁存8 根数据线上放的就是当前像素的字节。HREF 为高时表示当前行有效VSYNC 脉冲标志一帧的开始或结束。ESP32 要做的事就是把这些外部信号变成内存里的一段连续 buf。常见做法是把 I2S 外设配置成从模式PCLK 作为位时钟8 根数据线接到 I2S 的数据输入脚这样每次 PCLK 跳变DMA 就自动把 8bit 数据搬进内存。DMA 环形缓冲我开了 10 个描述符每个描述符装一整行数据320x2 字节RGB565 每像素两个字节帧与帧之间用双缓冲切换——前台缓冲在做 JPEG 编码时后台缓冲已经在收下一帧了。这套通路跑通之后你会发现 CPU 占用率其实很低瓶颈全在后级的软件压缩上。3. 核心代码拆解OV7670 寄存器配置与帧同步采集3.1 SCCB 通信与传感器 ID 探测不管接什么摄像头第一步永远是先确认传感器活着。OV7670 的 7 位 I2C 地址是 0x21PID 寄存器在 0x0AVER 寄存器在 0x0B。上电后先延时 20ms 等内部复位完成然后读一次 ID能读回 0x76 开头的值说明 SCCB 链路是通的后面才能谈配置。esp_err_t ov7670_read_id(uint8_t *pid, uint8_t *ver) { i2c_cmd_handle_t cmd i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (0x21 1) | I2C_MASTER_WRITE, true); i2c_master_write_byte(cmd, 0x0A, true); // PID 寄存器地址 i2c_master_start(cmd); i2c_master_write_byte(cmd, (0x21 1) | I2C_MASTER_READ, true); i2c_master_read_byte(cmd, pid, I2C_MASTER_LAST_NACK); i2c_master_stop(cmd); i2c_cmd_link_delete(cmd); cmd i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (0x21 1) | I2C_MASTER_WRITE, true); i2c_master_write_byte(cmd, 0x0B, true); // VER 寄存器地址 i2c_master_start(cmd); i2c_master_write_byte(cmd, (0x21 1) | I2C_MASTER_READ, true); i2c_master_read_byte(cmd, ver, I2C_MASTER_LAST_NACK); i2c_master_stop(cmd); i2c_cmd_link_delete(cmd); return ESP_OK; }这段用的是 ESP-IDF 的 I2C 驱动接口核心逻辑是“先写寄存器地址再发起始位切换为读模式读一个字节”。OV7670 的 SCCB 协议要求读操作分两次传输中间那个多余的 Start 是协议规定的不能省。SCCB 时钟我配置在 100kHz稳定优先个别模块在 400kHz 下时序裕量不足会出现某一帧配置丢失导致画面随机闪烁。读到 ID 之后要写一整套初始化寄存器组。这里只列几组关键的0x12 写 0x80 触发软复位0x11 设置时钟分频CLKRC0x40 的 COM15 寄存器选择输出格式0x15 的 COM10 控制 PCLK/HREF 极性。static const regval_t ov7670_init_regs[] { {0x12, 0x80}, // COM7: 软复位必须最先写 {0x11, 0x01}, // CLKRC: XCLK 2 分频给 PCLK 一个合理的起点 {0x40, 0xD0}, // COM15: RGB565 输出全分辨率 {0x15, 0x02}, // COM10: 翻转 PCLK 极性匹配 I2S 采样沿 {0x3A, 0x04}, // TSRC: 输出尺寸寄存器配合分辨率设置 {0x1E, 0x07}, // MVFP: 镜像翻转根据安装方向调整 };寄存器配置的顺序有讲究。0x12 的软复位位必须第一个写写完后传感器内部会重新加载默认值紧接着立刻写其他寄存器。CLKRC 的分频系数决定了 PCLK 的频率XCLK 给 10MHz 时2 分频后 PCLK 大约 5MHz对应 320x240 分辨率下约 20fps 的像素吞吐留了裕量。COM10 的 PCLK 反转位如果设反了画面会整体错位或者全是雪花这一点在避坑章节还会展开。3.2 帧同步中断与 DMA 双缓冲采集配置完寄存器接下来是采集帧。我的设计里 VSYNC 引脚接 GPIO25配置成上升沿和下降沿都触发中断——上升沿通知“新帧开始”主循环准备切换缓冲下降沿通知“这帧发完了”可以开始处理图像。PCLK 和 D0-D7 则完全交给 I2S 外设不需要 CPU 干预。static void IRAM_ATTR vsync_isr(void *arg) { BaseType_t woken pdFALSE; int level gpio_get_level(VSYNC_GPIO); if (level 1) { // 帧起始通知后台缓冲可以开始填 vTaskNotifyGiveFromISR(frame_ready_sem, woken); } else { // 帧结束通知编码任务取走已完成的一帧 vTaskNotifyGiveFromISR(frame_done_sem, woken); } portYIELD_FROM_ISR(woken); }这段中断处理函数被标记了 IRAM_ATTR是因为 ESP-IDF 默认把代码放在 flash中断触发时如果 flash cache 正被 Wi-Fi 抢占会造成中断延迟。放在 IRAM 里执行能保证帧同步不被 Wi-Fi 干扰。vTaskNotifyGiveFromISR 是 FreeRTOS 的任务通知机制比信号量更轻量开销只有一次原子操作。主循环侧要做的就是等帧结束通知然后切换 DMA 缓冲指针。双缓冲的切换逻辑很简单DMA 永远在写 A 缓冲当收到帧结束通知时把 DMA 的寄存器配置成写 B 缓冲同时把 A 缓冲的数据交给后级处理。因为有 10 个 DMA 描述符做环形回绕这个切换可以在任意行边界完成不会丢像素。3.3 RGB565 转灰度查表比浮点快一个数量级OV7670 输出 RGB565 时每个像素占两个字节高字节在高位还是低位取决于 COM15 的配置。默认是大端序高字节是 R[4:0] 和 G[5:3]低字节是 G[2:0] 和 B[4:0]。做 JPEG 压缩时如果用 RGB565 直接编码编码器要做三通道颜色转换费时费力。我选择先把像素转成 8bit 灰度JPEG 编码器只需要处理 Y 通道。static uint8_t ytab[65536]; void init_ytab(void) { for (int i 0; i 65536; i) { int r (i 11) 0x1F; int g (i 5) 0x3F; int b i 0x1F; ytab[i] (r * 77 g * 150 b * 29) 8; } } void cvt_rgb565_to_gray(const uint8_t *src, uint8_t *dst, int pixels) { const uint16_t *p (const uint16_t *)src; for (int i 0; i pixels; i) { dst[i] ytab[p[i]]; } }这里把 RGB565 所有 65536 种取值预先算成灰度程序运行时只剩一次查表和一次 16bit 读取。灰度公式用的是移位整数近似Y (77R 150G 29B) 8系数对应 BT.601 的整数化误差小于 1 个灰度级肉眼完全看不出区别。关键是 RGB565 的 R 只有 5 位、G 有 6 位、B 有 5 位查表下标直接就是 16bit 像素值不用做位域拼接的运算。转灰度这一步恰好也是后面做运动检测的伏笔。两帧灰度图相减比两帧彩色图相减省三分之二的带宽和算力二次开发时可以直接复用这块缓冲。4. 无线图传链路把原始图像变成浏览器里的一帧4.1 MJPEG 还是 WebSocket选最省事的路图像数据已经躺在内存里了怎么送到浏览器是个协议选择问题。WebSocket 推流要写前端 JS 解析、要处理二进制帧粘包调试成本高。MJPEG-over-HTTP 就省事得多它是一个multipart/x-mixed-replace的 HTTP 流浏览器里一个img src/stream标签直接就能播放不需要任何前端代码。httpd_resp_set_type(req, multipart/x-mixed-replace; boundaryframe);响应头就这一句。浏览器收到这个 Content-Type 之后解析 body 里的--frame分隔符每遇到一组Content-Type: image/jpeg就刷新一次图片。帧率完全由服务器发送速度决定客户端断线时 HTTP 写操作会立即返回错误处理起来非常干净。唯一的坑是 boundary 字符串必须和 body 里完全一致多一个空格都可能导致浏览器只显示第一帧。4.2 把灰度帧压成 JPEG轻量编码器的接入方式ESP32 这颗芯片没有硬件 JPEG 编码器只能靠软件压。我移植了一个单文件 JPEG 编码器专攻灰度图内部用 8x8 块做 DCT 变换量化表和 Huffman 表提前生成好编码时只做查表和系数打包160x120 灰度图在 240MHz 主频下大约耗时 8ms。jpeg_enc_t jenc; uint8_t *jpeg_buf NULL; size_t jpeg_len 0; jpeg_begin(jenc, IMG_W, IMG_H, 60); // quality60 for (int y 0; y IMG_H; y 8) { for (int x 0; x IMG_W; x 8) { jpeg_write_block(jenc, gray_buf y * IMG_W x, IMG_W); } } jpeg_end(jenc, jpeg_buf, jpeg_len);jpeg_write_block 每次吃一个 8x8 像素块第二个参数是灰度图的行宽编码器靠它计算每行的偏移。quality 参数影响量化表的缩放系数60 是清晰度和体积的平衡点——160x120 灰度图压出来大约 6KB 到 9KBWi-Fi 带宽完全够。注意这里的灰度缓冲必须按行对齐如果行宽不是 8 的倍数编码器会在边缘块做边界处理但性能会略微下降所以我一般把分辨率直接固定成 8 的倍数。4.3 推流 Handlerchunked 编码与断线处理HTTP 推流的实现很简单难在正确处理客户端断线。ESP-IDF 的 httpd 库用 chunked 编码发送 body每帧数据是一个独立的 chunk。核心逻辑如下static esp_err_t stream_handler(httpd_req_t *req) { httpd_resp_set_type(req, multipart/x-mixed-replace; boundaryframe); stream_running true; while (stream_running) { if (pdTRUE xSemaphoreTake(frame_sem, portMAX_DELAY)) { char hdr[128]; int hl snprintf(hdr, sizeof(hdr), --frame\r\n Content-Type: image/jpeg\r\n Content-Length: %d\r\n\r\n, (int)jpeg_len); esp_err_t err httpd_resp_send_chunk(req, hdr, hl); if (err ! ESP_OK) break; // 客户端断开退出推流 err httpd_resp_send_chunk(req, (const char *)jpeg_buf, jpeg_len); if (err ! ESP_OK) break; err httpd_resp_send_chunk(req, \r\n, 2); if (err ! ESP_OK) break; } } stream_running false; return ESP_OK; }frame_sem 是编码完成信号量每压完一帧编码任务就释放一次。三个 send_chunk 分别发分隔符头、JPEG 数据和尾部 CRLF这里的 CRLF 是 multipart 协议要求的分隔符必须有。httpd_resp_send_chunk 在客户端断开时返回 ESP_ERR_HTTPD_INVALID_REQ代码里三个位置都做了判断任一处失败立即跳出循环避免僵尸任务白占 CPU。主循环和编码任务拆成两个独立任务中间用帧缓冲队列解耦。采集任务只负责等级联通知并切换 DMA 缓冲编码任务等帧结束通知后做灰度转换和 JPEG 压缩压完发信号量。这样采集和压缩重叠执行帧率能上去不少。4.4 帧率预算瓶颈到底在哪整套流水线跑下来我测过的数据放在一起看更直观分辨率灰度转换耗时JPEG 编码耗时实际推流帧率160x120 (QQVGA)约 2ms约 8ms12~15 fps320x240 (QVGA)约 8ms约 32ms5~8 fps640x480 (VGA)约 30ms约 120ms约 3 fps从数据看瓶颈 100% 在软件 JPEG 编码。160x120 是最舒服的工作点画质足够看清实验台或者房间大致情况帧率能到 15fps。想上 QVGA 也可以但帧率会掉到个位数运动场景拖影明显。我在工程里把分辨率参数做成宏切换只需改两个数后面重新编译烧录就能对比效果。5. 避坑指南跑不起来时先查这五个地方5.1 sensor ID 读不到现象串口打印 senor ID 得到 0xFF 或者干脆 I2C ACK 失败初始化流程卡在第一步。原因分三种按概率排序SCCB 的 SDA/SCL 缺上拉电阻、XCLK 没有时钟输入、模块供电是 1.8V 版本而 ESP32 IO 电平是 3.3V。解决先用示波器或逻辑分析仪确认 GPIO16 有 10MHz 方波然后给 SDA/SCL 各加一个 4.7kΩ 上拉到 3.3V最后用万用表量模块 VCC 引脚确认是 3.3V 而不是 5V。这个三板斧解决了我遇到的九成 ID 读不到问题。血的教训是别在没示波器的时候乱拨寄存器先把硬件链路确认干净再谈软件。5.2 图像全是雪花现象ID 能读到初始化没报错但出来的画面是满屏噪点偶尔夹杂几条斜纹。原因通常是数据线串扰或者采样沿不对。8 根数据线走 20 厘米杜邦线PCLK 5MHz 的翻转速度足以产生严重的线间耦合。解决把线剪短到 10 厘米以内或改用 2.54mm 排线再在每根数据线上串一个 33Ω 电阻吸收过冲。如果线已经很短还是花屏检查 COM10 寄存器0x15的 bit1 PCLK 反相位——翻转采样沿画面会从雪花变成正常轮廓。5.3 颜色整体偏色草地变紫色现象能出图但颜色不对红色变蓝色、绿色变洋红。原因九成是 RGB565 的字节序和 ESP32 内存里的字节序不一致。OV7670 输出大端序像素高字节在前而你的灰度查表函数按小端序拆位R 和 B 通道就会互换。解决在转灰度前打印一个纯红像素的原始 16bit 值看高字节是不是红色数据或者直接改查表函数把(i 11)换成(i 0x1F)把字节序调转过来。另一个可能点是把 0x40 COM15 的 RGB 顺序寄存器改一下可以输出 RGB、GRB、BGR 三种排列总有一种能对上。5.4 帧率只有宣称值的三分之一现象初始化日志里写着 15fps实际浏览器里看最多 5fpsCPU 占用却不高。原因大概率是 DMA 缓冲太小每收到几行就触发一次中断CPU 频繁被唤醒做描述符回填。我把 DMA 缓冲从 4 个描述符加到 10 个之后帧率立刻翻倍。另一个隐藏瓶颈是 JPEG quality 设成了 90编码耗时暴涨到 100ms 以上。解决quality 保持在 55~65DMA 描述符数量别省内存多花不了几百字节但帧率体验是质变。5.5 推流几秒后浏览器黑屏现象打开网页能看到画面3~5 秒后图片停止刷新串口终端报ESP_ERR_HTTPD_INVALID_REQ。原因是 multipart 分帧格式不对或者客户端断开后 handler 没有退出。具体来说分隔符头里boundaryframe的frame要和 body 里--frame完全一致多了空格、换行错位浏览器都会在解析第一帧后放弃后续数据。解决严格按照下面的格式发送一个字符都不能多--frame\r\n Content-Type: image/jpeg\r\n Content-Length: 12345\r\n \r\n [JPEG 数据] \r\n客户端断开的问题在 send_chunk 返回非 ESP_OK 时立即 break并且把 stream_running 置回 false。很多人栽在没做断线检测客户端关掉页面后 handler 还在循环里等信号量白白占着任务栈和内存。6. 二次开发思路从“能出图”升级到“能用图”6.1 分辨率切换寄存器参数的前后联动灰度推流跑通后最想改的通常是分辨率。OV7670 的分辨率控制分布在好几组寄存器里HSTART/HSTOP0x32/0x17、VSTART/VSTOP0x18/0x19控制采集窗口TSRC0x3A控制输出尺寸还要配合 CLKRC0x11调像素时钟分频。只改其中一组画面要么整体偏移要么只有左上角一块区域。改成 QQVGA 的完整配置长这样void ov7670_set_resolution(cam_res_t res) { if (res RES_QQVGA) { reg_wr(0x11, 0x02); // CLKRC: 1/4 分频降低 PCLK reg_wr(0x32, 0x80); // HSTART reg_wr(0x17, 0x12); // HSTOP reg_wr(0x18, 0x03); // VSTART reg_wr(0x19, 0x02); // VSTOP reg_wr(0x1A, 0x70); // HREF 高电平宽度 reg_wr(0x3A, 0x14); // TSRC: 160x120 输出 } }改完寄存器后别忘了同步改三处代码DMA 缓冲的行大小、灰度转换的像素数、JPEG 编码器的宽高参数。我踩过一次只改寄存器没改缓冲的坑DMA 直接越界写坏内存复位后画面变雪花。从那以后换分辨率都会做一次完整的链路检查。6.2 给图传加一个 SD 卡快照和运动检测想在监控场景真正“用图”两件事值得加SD 卡存快照和运动检测。SD 卡走 SPI 接口把 JPEG 编码完的 buffer 直接 fwrite 到文件里几十行代码就能实现“按下按键存一帧”。“用图”的下一步是运动检测——三帧灰度图做差分超阈值才编码推流静止画面不占带宽。灰度缓冲区在这里又省了一次转换帧差运算直接在 gray_buf 上跑逐像素相减求平均差就是一个最朴素的看门狗。6.3 一些习惯让你少走弯路搞这套项目的过程里我翻车最惨的一次是把所有 GPIO 重新分配后花了一下午查黑屏最后发现只是 VSYNC 触发沿选反了。从那以后我每次换板子、换接线都强制先出 160x120 灰度测试图确认纯数据通路没问题再做格式转换和推流省掉一半的玄学时间。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

基于BP神经网络的车牌识别系统Matlab实现全解析

基于BP神经网络的车牌识别系统Matlab实现全解析

车牌识别这事儿,听起来挺唬人,其实拆开看就是一套“图像处理 神经网络”的组合拳。最近我把这个基于BP神经网络的车牌识别系统在Matlab里完整实现了一遍,从车牌定位、字符分割到字符识别,每一步都踩了不少坑。这篇东西就是给准备…

2026/10/17 11:44:33 阅读更多 →
自动化立体仓库低价中标陷阱:2000万建造,5年后重建为何花5000万?

自动化立体仓库低价中标陷阱:2000万建造,5年后重建为何花5000万?

“2000万中标,5年后重建花了5000万”,这句话我是在一次行业交流会上听来的。当时一位做仓储设备维保的资深工程师酒后吐真言,说自己这几年最赚钱的项目,全是当年别人低价中标、后来撑不住的烂摊子。他说这话时带着苦笑&#xff0c…

2026/10/17 11:43:32 阅读更多 →
低价中标立体库五年后重建?从技术细节算清自动化立库全生命周期成本

低价中标立体库五年后重建?从技术细节算清自动化立库全生命周期成本

在自动化仓储行业里,“低价中标”这四个字,我几乎每年都要听上几十遍。每次都有企业主满怀期待地指着报价单说:“你看,同样标称的立体库,他家比别人便宜好几百万。”但很少有人追问:这好几百万到底省在了哪…

2026/10/17 11:43:32 阅读更多 →

最新新闻

Vim+GCC+库文件:打通Linux开发工具链的完整闭环

Vim+GCC+库文件:打通Linux开发工具链的完整闭环

我见过太多刚切到 Linux 的开发者,第一周就被劝退。倒不是 C 语言难,而是卡在了工作流上:在终端里不知道怎么快速改代码,写完程序不知道怎么编译,编译完了遇到各种链接报错又一头雾水。说白了,就是 Vim 操作…

2026/10/17 16:14:27 阅读更多 →
大漠插件7.2213 + Python:DmHelper注册调用与桌面自动化避坑指南

大漠插件7.2213 + Python:DmHelper注册调用与桌面自动化避坑指南

简介:面向大漠插件7.2213的Python注册示例包,内含作者自制的DmHelper脚本,用于演示如何通过Python语言调用大漠插件接口,完成注册、激活以及基本功能调用。大漠插件在界面自动化、软件测试、网页数据抓取等日常开发场景中应用广泛…

2026/10/17 16:14:27 阅读更多 →
5 分钟上手 North-Micro-Vision-Instruct-bf16:在 Apple Silicon 上本地跑通图像描述的完整指南

5 分钟上手 North-Micro-Vision-Instruct-bf16:在 Apple Silicon 上本地跑通图像描述的完整指南

【免费下载链接】North-Micro-Vision-Instruct-bf16 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/North-Micro-Vision-Instruct-bf16 点击查看 免费下载 North-Micro-Vision-Instruct-bf16 是一个专为 Apple Silicon(M 系列芯片&#x…

2026/10/17 16:14:27 阅读更多 →
鸿蒙下Flutter测试框架反射装载适配与规模化分发

鸿蒙下Flutter测试框架反射装载适配与规模化分发

test_reflective_loader 这个名字,很多 Flutter 开发者可能只在跑测试时瞥见过一眼,但真正能说清它底层在干嘛的人不多。这次我们团队在把一套针对鸿蒙 HarmonyOS 的 Flutter 测试基建落地时,在这个组件上扎扎实实折腾了几周,踩了…

2026/10/17 16:14:27 阅读更多 →
XERJ零配置自动索引教程:一条命令让PDF、CSV、SQLite和日志全部可搜索

XERJ零配置自动索引教程:一条命令让PDF、CSV、SQLite和日志全部可搜索

XERJ零配置自动索引教程:一条命令让PDF、CSV、SQLite和日志全部可搜索 【免费下载链接】xerj XERJ is the new way for AI to search data. Its autoindex capability activates agents to know your data without the token waste of grep and sed. One command in…

2026/10/17 16:14:27 阅读更多 →
Qt飞机大战飞机类设计:QGraphicsScene、状态机与碰撞检测

Qt飞机大战飞机类设计:QGraphicsScene、状态机与碰撞检测

1. 飞机类挂在 QGraphics 场景里,是我试出来的最优解1.1 一开始我也用过 QWidget 硬拼飞机大战在 Qt 里算一个很经典的练手项目,但大多数教程会把重点放在"怎么把窗口搭出来""怎么加背景图",真到自己动手写飞机类的时候&…

2026/10/17 16:13:26 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →