RK3588学习日记(一) OpenCV 摄像头入门:读取并保存第一帧
RK3588学习日记(一) OpenCV 摄像头入门从环境搭建到读取并保存第一帧这一篇只做基础验证安装 OpenCV、编译示例、生成测试图片、读取图片以及从摄像头读取一帧并保存结果。暂不讨论 V4L2 细节、DMA-BUF、RGA 或 NPU。1. 这一篇要验证什么在后续学习 V4L2、MPP、RGA 和 RKNN 之前先确认三件事开发板上的 OpenCV 头文件和库可以正常链接程序能把图片读进cv::Mat完成简单处理并写回文件VideoCapture能打开摄像头读到有效帧并输出尺寸和处理结果。没有摄像头时也可以先用示例生成测试图片完成前两项。2. 准备环境在 Debian/Ubuntu 类系统上安装编译工具和 OpenCV 开发包sudoaptupdatesudoaptinstall-ybuild-essential cmake pkg-config libopencv-dev检查 OpenCV 版本pkg-config--modversionopencv4能输出版本号只说明pkg-config找到了 OpenCV最终是否能编译还要由 CMake 的find_package(OpenCV REQUIRED)验证。3. 编译示例以下命令从示例目录执行cdexamples/01_opencvmkdir-pbuildcdbuild cmake..make-j$(nproc)CMake 做了两件事查找 OpenCV并把main.cpp编译成opencv_demo。也可以使用目录里的 Makefile但本文统一使用 CMake 命令。如果编译失败先检查pkg-config--cflags--libsopencv44. 没有摄像头时先生成测试图片./opencv_demo --make-sample sample.jpg示例会生成一张 800×600 的测试图里面包含渐变、圆形、直线和文字。然后处理这张图片./opencv_demo sample.jpg程序会在当前工作目录生成output_img_gray.jpg 灰度图 output_img_blur.jpg 高斯模糊结果 output_img_edge.jpg Canny 边缘结果 output_img_annotated.jpg 画框和文字后的图像这里的img来自程序内部的图片输入标签不是文件名的一部分。实测参考RK3588 / OpenCV 4.5.4[save] 测试图片已生成sample.jpg [img] sample.jpg800 x 600通道数 3 [save] output_img_gray/blur/edge/annotated.jpg生成的文件可用ls -l sample.jpg output_img_*.jpg确认再用下面第 6 节的方法拉回电脑查看。5. 用 VideoCapture 打开摄像头图片链路跑通后再进入摄像头采集。第一步不是猜节点编号而是确认设备身份和采集能力。5.1 先找到摄像头节点RK3588 板子上/dev/video0不一定是摄像头。同一块板会出现大量 video 节点MIPI/CSI 摄像头对应 ISP 与 CIF 通道USB 摄像头对应 UVC 通道还有独立的视频编解码节点如/dev/video-dec0、/dev/video-enc0。直接扫描ls-l/dev/video*但有设备节点不等于能采集。用v4l2-ctl看每个节点的驱动名和卡片类型才能分清哪个是真摄像头v4l2-ctl --list-devices v4l2-ctl-d/dev/video21--info# 看 driver/card/capabilitiesv4l2-ctl-d/dev/video21 --list-formats-ext# 看支持的格式与分辨率以一块插入 USB 摄像头的板子为例lsusb会看到设备而v4l2-ctl --info显示Driver name : uvcvideo Card type : USB Camera: USB Camera Capabilities : Video Capture / Metadata Captureuvcvideo是 USB 摄像头驱动MIPI 摄像头则会是rkisp/rkcif相关的驱动名。把你的实际节点号替换进后面的命令即可。5.2 读取一帧./opencv_demo--camera/dev/video21示例也支持设备索引当摄像头是0或1这类索引时./opencv_demo--camera0程序收到--camera后会按设备路径或数字索引打开摄像头连续读取最多 10 帧让自动曝光和自动白平衡有机会稳定检查最后一帧是否为空打印实际帧宽和高度保存原始帧并执行灰度、模糊、边缘和标注处理。对应的核心逻辑是cv::VideoCapture cap;if(camera_spec.size()1std::isdigit(camera_spec[0]))cap.open(std::stoi(camera_spec));elsecap.open(camera_spec);if(!cap.isOpened()){std::cerr无法打开摄像头\n;return1;}cv::Mat frame;for(inti0;i10cap.read(frame);i){// 预热帧}if(frame.empty()){std::cerr没有读到有效帧\n;return1;}注意这里的VideoCapture是 OpenCV 对摄像头后端的封装。它能否打开某个 MIPI 或 USB 摄像头取决于系统驱动、设备节点和 OpenCV 构建时的后端支持。板端实测时USB 摄像头通过VideoCapture成功取到一帧 640×480 的 BGR 图并处理而板载 MIPI 摄像头rkisp_mainpath因当前 DTS 未配置 sensor 节点即使节点存在也无法出流。下文「常见问题」会再说明这两种情况。6. 一帧图像和 cv::Mat拿到一帧后后续处理就是在不同的cv::Mat之间完成像素变换。OpenCV 默认把彩色图像按 BGR 顺序存储cv::Mat gray;cv::cvtColor(frame,gray,cv::COLOR_BGR2GRAY);cv::Mat blurred;cv::GaussianBlur(gray,blurred,cv::Size(5,5),0);cv::Mat edges;cv::Canny(blurred,edges,50,150);示例还会复制原图进行标注避免直接改写采集到的原始帧cv::Mat annotatedframe.clone();cv::rectangle(annotated,cv::Point(50,50),cv::Point(250,250),cv::Scalar(0,255,0),3);cv::Scalar(0, 255, 0)是 BGR 顺序因此表示绿色。frame.clone()会产生一次 CPU 深拷贝本篇这样写是为了让示例简单后续零拷贝章节会再分析这类复制的代价。摄像头模式的输出文件是frame_cam_raw.jpg 读取到的原始 BGR 帧 output_cam_gray.jpg 灰度图 output_cam_blur.jpg 高斯模糊结果 output_cam_edge.jpg Canny 边缘结果 output_cam_annotated.jpg 标注结果可以用下面的命令把文件拉回电脑scpuser板子IP:/path/to/frame_cam_raw.jpg.scpuser板子IP:/path/to/output_cam_edge.jpg.请把板子IP和实际文件路径替换成自己的值。实测参考USB 摄像头--camera /dev/video21[ WARN:0] ...cap_gstreamer.cpp ... GStreamer warning: unable to start pipeline [cam] 已打开 /dev/video21 [cam] 帧尺寸640 x 480 [save] output_cam_gray/blur/edge/annotated.jpg第一行 GStreamer WARN 是 OpenCV 尝试 GStreamer 后端失败后回退 V4L2 的正常现象不影响采集。程序实际经 V4L2 后端取到一帧 640×480并生成frame_cam_raw.jpg及 4 个处理结果。7. 需要桌面环境时再显示窗口./opencv_demo--camera/dev/videoN--show请把/dev/videoN替换成你实际找到的摄像头节点。--show会调用imshow然后用waitKey(0)等待按键关闭窗口。它不是连续视频预览而是显示当前采集结果并等待用户操作。通过 SSH 登录且没有图形桌面时窗口显示可能失败。示例已经用异常处理保护这条路径但最可靠的验证仍然是保存 JPEG 后用scp查看。8. 常见问题下面按现象整理排查入口。先确认设备、驱动和后端再检查图像格式与显示环境。现象检查方向opencv2/opencv.hpp不存在安装libopencv-dev检查pkg-config路径链接出现undefined reference确认 CMake 链接了${OpenCV_LIBS}/dev/video0不存在查看实际设备节点不要假定一定是video0VideoCapture打不开检查设备权限、驱动和 OpenCV 视频后端读到的帧为空检查设备格式、分辨率和采集是否成功图像颜色异常核对 BGR/RGB 和实际摄像头输出格式SSH 下窗口失败不使用--show改为保存文件输出图像错位或花屏本篇只通过 OpenCV 读取进入 V4L2 章节后再核对 stride 和像素格式有 video 节点但打不开No such device/Operation not permitted该节点无摄像头硬件接入MIPI sensor 未注册、USB 未插。用v4l2-ctl --list-devices和lsusb确认真正的摄像头节点出现GStreamer warning: unable to start pipelineOpenCV 先尝试 GStreamer 后端失败后回退 V4L2不影响采集结果可忽略或安装 gstreamer 插件消除警告--camera 0打不开但--camera /dev/videoX可以索引0对应的是设备枚举不一定是你想用的摄像头改用v4l2-ctl --list-devices确认节点号USB 摄像头往往是靠后的编号如/dev/video21实测补充RK3588 上 USB 摄像头uvcvideo与板载 MIPI 摄像头rkisp/rkcif都可能在/dev/video*里列出大量节点。区分方法是看v4l2-ctl的Driver name/Card type而不是凭编号猜测。板载 MIPI 摄像头若 DTS 未配置 sensor 节点VIDIOC_STREAMON会返回Operation not permitted内核日志出现check rkisp_mainpath link or isp input此时应优先改用 USB 摄像头或先修复 DTS 的 sensor 配置。9. 下一篇本篇使用 OpenCV 的VideoCapture作为入口。下一篇进入 YOLO 模型转 RKNN梳理模型从 PC 到 RK3588 的转换链路并对比量化前后的精度。V4L2、MMAP 与 DMA-BUF 会在后续采集章节展开。

相关新闻

AI实力强的EMBA推荐——身边3位高管的真实就读反馈

AI实力强的EMBA推荐——身边3位高管的真实就读反馈

一、我身边3位高管读了啥?AI实力强的EMBA真的好用吗? 上周和深圳的几位老同学吃饭,聊起最近的职业焦虑,做AI硬件的张总突然掏出手机翻出了成绩单:“去年读的香港科技大学EMBA中英双语课程,刚拿到学位证&am…

2026/9/3 17:14:01 阅读更多 →
吃透 Android 性能分析!可观测性 + Systrace/Perfetto/Profiler 全解

吃透 Android 性能分析!可观测性 + Systrace/Perfetto/Profiler 全解

正文 黑客与画家 Paul Graham 在其著作 <黑客与画家> 中断言&#xff1a;“不同语言的执行效率差距正变得越来越大&#xff0c;所以性能分析器&#xff08;profiler&#xff09;将变得越来越重要。目前&#xff0c;性能分析并没有受到重视。许多人好像仍然相信&#xff0…

2026/9/3 17:14:01 阅读更多 →
一篇文章告诉你作为普通人Python该不该学,适不适合学

一篇文章告诉你作为普通人Python该不该学,适不适合学

Python在这几年&#xff0c;发展可谓是风生水起&#xff0c;前景十分优越。Python作为一门程序语言&#xff0c;为什么能够这么火&#xff0c;是有原因的&#xff0c;最根本的两点就是&#xff1a; 1.Python相对于其他编程语言来说&#xff0c;入门门槛低&#xff0c;上手不难…

2026/9/3 17:14:01 阅读更多 →

最新新闻

MUModelView 0.02:轻量解析老游戏模型文件的查看工具

MUModelView 0.02:轻量解析老游戏模型文件的查看工具

简介&#xff1a;这是面向奇迹MU游戏开发者和模型爱好者的客户端模型查看工具&#xff0c;可脱离游戏客户端直接解析data目录下的模型、贴图与动画数据&#xff0c;支持旋转、缩放、平移等视角操作&#xff0c;便于二次创作、资源提取和问题排查。资源包共31个文件&#xff0c;…

2026/9/3 17:59:47 阅读更多 →
MUModelView 0.02:解析奇迹MU BMD模型的老工具实操指南

MUModelView 0.02:解析奇迹MU BMD模型的老工具实操指南

简介&#xff1a;奇迹客户端模型查看软件 MUModelView0.02 是一款专为奇迹&#xff08;MU&#xff09;游戏设计的模型查看与分析工具&#xff0c;面向游戏开发人员、MOD制作者及资深爱好者。它能在不启动游戏客户端的情况下&#xff0c;直接解析 data 目录中的模型、纹理与动画…

2026/9/3 17:59:47 阅读更多 →
Codex与Claude Code实战对比:多文件项目下谁更适合作工程助手?

Codex与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/9/3 17:59:46 阅读更多 →
YOLOv3安全帽检测工业落地全链路实践

YOLOv3安全帽检测工业落地全链路实践

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

2026/9/3 17:59:46 阅读更多 →
Adobe Premiere Pro 2024 安装部署与性能优化全攻略

Adobe Premiere Pro 2024 安装部署与性能优化全攻略

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

2026/9/3 17:59:46 阅读更多 →
华为SR130 RAID卡驱动与固件升级实战解析

华为SR130 RAID卡驱动与固件升级实战解析

简介&#xff1a;此驱动包专为华为服务器SR130 RAID卡&#xff08;基于LSI3008芯片组&#xff09;打造&#xff0c;适用于Windows Server 2012 R2及部分Linux环境&#xff0c;帮助运维人员完成阵列卡驱动安装、固件更新与存储管理&#xff0c;解决系统无法识别RAID卡或磁盘阵列…

2026/9/3 17:58:46 阅读更多 →

日新闻

AI智能体辅助JS逆向:从V8环境搭建到补环境实战

AI智能体辅助JS逆向:从V8环境搭建到补环境实战

先别急着点开&#xff0c;这不是劝退文&#xff0c;而是想讲清楚一件事&#xff1a;用 AI 做逆向值不值得学&#xff1f;如果要用&#xff0c;怎么搭一套“V8 环境 AI 智能体”来提升效率。最近逆向圈、爬虫圈都在聊 AI Agent、AST 工程逆向、JS 逆向这些词&#xff0c;很多新手…

2026/9/3 0:00:29 阅读更多 →
安卓设备通过修改机型信息解锁游戏高帧率:原理、操作与风险指南

安卓设备通过修改机型信息解锁游戏高帧率:原理、操作与风险指南

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

2026/9/3 0:00:29 阅读更多 →
ARM版OpenJDK 11安装部署全攻略:下载、配置与避坑指南

ARM版OpenJDK 11安装部署全攻略:下载、配置与避坑指南

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

2026/9/3 0:00:29 阅读更多 →

周新闻

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

每年校招季我都会接触不少准备数据库方向笔试的同学&#xff0c;看到最多的状态就是&#xff1a;简历上写着“熟悉 MySQL”“了解索引优化”&#xff0c;一碰到数据库管理工程师的笔试卷&#xff0c;却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

2026/9/3 4:22:22 阅读更多 →
数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

1. 这不是“背公式”的事&#xff1a;时间参数到底在约束什么你翻过数字电路教材&#xff0c;一定见过这两个词&#xff1a;建立时间&#xff08;Setup Time&#xff09;和保持时间&#xff08;Hold Time&#xff09;。它们常被并列写在触发器&#xff08;Flip-Flop&#xff09…

2026/9/3 4:22:01 阅读更多 →
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

1. 项目缘起&#xff1a;从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目&#xff0c;我至今记忆犹新。它没有直接给出一个花哨的名字&#xff0c;而是用“超声波测距机”这个朴实无华的功能描述&#xff0c;精准地勾勒出了考核的核心。对于当时备赛的我而言…

2026/9/3 4:22:59 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践&#xff1a;原型怎样变成可用功能分类&#xff1a;[AI/大模型]细分主题&#xff1a;AI 增强型 CI/CD 流水线自动化与 GitOps 实践&#xff1a;Agent 工作流、工具调用与任务拆解&#xff1a;从原型到生产的验收清单很多团队在尝试用大…

2026/9/3 4:17:49 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战&#xff1a;复盘记录怎样真正派上用场分类&#xff1a;[工程技术]细分主题&#xff1a;Kubernetes 生产环境运维与排障实战&#xff1a;可复制的项目复盘模板与决策记录大部分团队的事故复盘报告&#xff0c;最后都变成了躺在 Confluence 或钉…

2026/9/3 4:18:56 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理&#xff1a;核心链路应该先拆哪一步分类&#xff1a;[工程技术]细分主题&#xff1a;Docker 容器化技术与镜像安全管理&#xff1a;核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用&#xff08;包含 Web 接口、后台…

2026/9/3 4:21:44 阅读更多 →