ARM Linux平台下 OpenCV Camera 实验

一、硬件原理

1. OV2640

1.1 基本功能

OV2640 是一款低功耗、高性能的图像传感器,支持以下功能:

  • 最高分辨率:200 万像素(1600x1200)。

  • 输出格式:JPEG、YUV、RGB。

  • 内置图像处理功能:自动曝光、自动白平衡、自动增益控制等。

1.2 硬件接口

2. CSI

2.1 基本功能

CSI 是一种高速串行接口,专为摄像头模块设计,具有以下特点:

  • 支持高带宽数据传输(适合高分辨率和高帧率视频)。

  • 低引脚数,减少硬件复杂度。

  • 支持多种数据格式(如 RAW、YUV、RGB)。

2.2 硬件原理

CSI 接口通常包括以下信号:

  • 数据通道(Data Lanes)

    • 差分信号对(如 CSI_D0+/CSI_D0-)。

    • 支持 1-4 对数据通道,带宽随通道数增加。

  • 时钟通道(Clock Lane)

    • 差分信号对(如 CSI_CLK+/CSI_CLK-)。

    • 用于同步数据传输。

  • 控制信号

    • I2C 或 SPI 接口,用于配置摄像头模块。

2.3 工作流程

  1. 初始化:通过 I2C 或 SPI 配置摄像头模块。

  2. 数据传输

    • 摄像头模块通过 CSI 数据通道发送图像数据。

    • 主控设备通过 CSI 时钟通道同步接收数据。

  3. 数据处理:主控设备对接收到的图像数据进行处理或存储。

二、设备树

根节点

&csi {status = "okay";port {csi1_ep: endpoint {remote-endpoint = <&ov2640_ep>;};};
};&i2c1 {ov2640: ov2640@30 {compatible = "ovti,ov2640";reg = <0x30>;pinctrl-names = "default";pinctrl-0 = <&pinctrl_csi1>;clocks = <&clks IMX6UL_CLK_CSI>;clock-names = "csi_mclk";/*pwn-gpios = <&gpio1 4 1>;*/rst-gpios = <&gpio1 2 0>;/*csi_id = <0>;mclk = <24000000>;mclk_source = <0>;*/status = "okay";port {ov2640_ep: endpoint {remote-endpoint = <&csi1_ep>;};};};
};

三、驱动简单分析

四、Qt 编写测试文件

1. 简介

Qt 里有一个 QCamera 类,但是不支持4.1.15 内核版本上使用 OV5640、OV2640。

因为 OV5640、OV2640 的驱动默认是读取 YUYV 格式数据,而 QCamera 里读取的数据是 RGB 格式数据。当然也能通过修改驱动来支持。不过有 V4l2 框架,就没必要这么做了。V4l2 的数据直接可以显示在 fb0,且处理效率比 Qt 来的流程。

直接使用 V4l2 的方案留在后面的视频监控项目上。本次使用的是 Qt+OpenCV 调用摄像头。

OpenCV 的环境搭建:ARM Linux 移植 tslib、Qt和OpenCV-CSDN博客

2. 主要功能

  • 摄像头管理

    • selectCameraDevice(int index):选择并打开指定索引的摄像头
    • cameraProcess(bool bl):控制摄像头的启动和停止
    • timerTimeOut():定时采集摄像头图像并发送信号
  • 图像处理

    • matToQImage(const cv::Mat &img):将 OpenCV cv::Mat 格式转换为 Qt QImage 格式
  • 定时器机制

    • 使用 QTimer 控制图像采集频率(33ms,约等于 30fps)

3. 程序编写

3.1 .pro 文件

添加 opencv 库

INCLUDEPATH += /home/prover/linux/opencv-3.4.1/install/include
LIBS += /home/prover/linux/opencv-3.4.1/install/lib/libopencv_core.so \/home/prover/linux/opencv-3.4.1/install/lib/libopencv_highgui.so \/home/prover/linux/opencv-3.4.1/install/lib/libopencv_imgproc.so \/home/prover/linux/opencv-3.4.1/install/lib/libopencv_videoio.so \/home/prover/linux/opencv-3.4.1/install/lib/libopencv_imgcodecs.so

3.2 简单分析

3.3 编译

source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
/home/prover/linux/qt-5.12.9/arm-qt/bin/qmake
make -j 8

五、测试

1. 手动加载

将内核源码的drivers/media/paltform/mxc/subdev 中的mx6s_capture.c 单独拿出来编译 .ko文件

然后将 ov2640_driver.ko 和 mx6s_capture.ko 文件进行加载即可。

一般加载后,设备为 /dev/video1。然后运行第四节的 Qt 程序即可。

2. 内核修改

配置 4.1.15 内核

 

按1进入

按Y选中,并进入红框

红框默认是 M 的,改成 Y,并选择 VF SDC。 

还有这个也要选中:

如果不出意外的话,就会出意外了:

 修改内核源码中的 drivers/media/platform/mxc/capture/ 下的 ipu_prp_vf_sdc.c和ipu_prp_vf_sdc_bg.c

重新编译下内核。

发现取消绑定了。

然后加载自己写的驱动,当然也可以编入到内核的 drivers/media/paltform/mxc/capture:

运行测试前,可以添加格式:drivers\media\platform\mxc\subdev\mx6s_capture.c

static struct mx6s_fmt formats[] = {{.name		= "UYVY-16",.fourcc		= V4L2_PIX_FMT_UYVY,.pixelformat	= V4L2_PIX_FMT_UYVY,.mbus_code	= MEDIA_BUS_FMT_UYVY8_2X8,.bpp		= 2,}, {.name		= "YUYV-16",.fourcc		= V4L2_PIX_FMT_YUYV,.pixelformat	= V4L2_PIX_FMT_YUYV,.mbus_code	= MEDIA_BUS_FMT_YUYV8_2X8,.bpp		= 2,}, {.name		= "YUV32 (X-Y-U-V)",.fourcc		= V4L2_PIX_FMT_YUV32,.pixelformat	= V4L2_PIX_FMT_YUV32,.mbus_code	= MEDIA_BUS_FMT_AYUV8_1X32,.bpp		= 4,}, {.name		= "RAWRGB8 (SBGGR8)",.fourcc		= V4L2_PIX_FMT_SBGGR8,.pixelformat	= V4L2_PIX_FMT_SBGGR8,.mbus_code	= MEDIA_BUS_FMT_SBGGR8_1X8,.bpp		= 1,}, {.name		= "RGB565_LE",.fourcc		= V4L2_PIX_FMT_RGB565,.pixelformat	= V4L2_PIX_FMT_RGB565,.mbus_code	= MEDIA_BUS_FMT_RGB565_2X8_LE,.bpp		= 2,}, {.name		= "RGB565_BE",.fourcc		= V4L2_PIX_FMT_RGB565,.pixelformat	= V4L2_PIX_FMT_RGB565,.mbus_code	= MEDIA_BUS_FMT_RGB565_2X8_BE,.bpp		= 2,}, {.name		= "JPEG",.fourcc		= V4L2_PIX_FMT_JPEG,.pixelformat	= V4L2_PIX_FMT_JPEG,.mbus_code	= MEDIA_BUS_FMT_JPEG_1X8,.bpp		= 2,}
};

一般加载后,设备为 /dev/video0.

然后运行第四节的 Qt 程序即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2.x中父组件通过props向子组件传递数据详细解读

1. 父组件向子组件传递数据的步骤 在子组件中定义 props&#xff1a; 子组件通过 props 选项声明它期望接收的数据。props 可以是数组形式&#xff08;简单声明&#xff09;或对象形式&#xff08;支持类型检查和默认值&#xff09;。 在父组件中使用子组件时绑定 props&#x…

【Gin】2:快速上手Gin框架(模版、cookie、session)

本文目录 一、模版渲染二、自定义模版函数三、cookie四、Session五、cookie、session区别六、会话攻击 一、模版渲染 在 Gin 框架中&#xff0c;模板主要用于动态生成 HTML 页面&#xff0c;结合 Go 语言的模板引擎功能&#xff0c;实现数据与视图的分离。 模板渲染是一种动态…

【AI绘画】大卫• 霍克尼风格——自然的魔法(一丹一世界)

大卫• 霍克尼&#xff0c;很喜欢这个老头&#xff0c;“艺术是一场战斗”。老先生零九年有了iphone&#xff0c;开始用iphone画画&#xff0c;一零年开始用ipad画画&#xff0c;用指头划拉&#xff0c;据说五分钟就能画一幅&#xff0c;每天早上随手画几幅送给身边的朋友。很c…

解码 NLP:从萌芽到蓬勃的技术蜕变之旅

内容概况&#xff1a; 主要讲述NLP专栏的内容和NLP的发展及其在现代生活中的广泛应用。专栏强调实践为主、理论为辅的学习方法&#xff0c;并通过多个生活场景展示了NLP技术的实际应用&#xff0c;如对话机器人、搜索引擎、翻译软件、电商推荐和智能客服等。 这边我就不多做自我…

解决DeepSeek服务器繁忙问题的实用指南

目录 简述 1. 关于服务器繁忙 1.1 服务器负载与资源限制 1.2 会话管理与连接机制 1.3 客户端配置与网络问题 2. 关于DeepSeek服务的备用选项 2.1 纳米AI搜索 2.2 硅基流动 2.3 秘塔AI搜索 2.4 字节跳动火山引擎 2.5 百度云千帆 2.6 英伟达NIM 2.7 Groq 2.8 Firew…

前端(AJAX)学习笔记(CLASS 2):图书管理案例以及图片上传

* BootStrap弹框 功能&#xff1a;不离开当前页面&#xff0c;显示单独内容&#xff0c;供用户操作 步骤&#xff1a; 1、引入bootstrap.css和bootstrap.js 2、准备弹框标签&#xff0c;确认结构 3、通过自定义属性&#xff0c;控制弹框的显示和隐藏 其中的bootstrap.css…

数据结构:双链表list

list 是 C 标准库中的双向链表容器。 list初始化示例&#xff1a; #include <list>int n 7;std::list<int> lst; // 初始化一个空的双向链表 lststd::list<int> lst(n); // 初始化一个大小为 n 的链表 lst&#xff0c;链表中的值默认都为 0std::list<i…

AI Agent Service Toolkit:一站式大模型智能体开发套件

项目简介 该工具包基于LangGraph、FastAPI和Streamlit构建,提供了构建和运行大模型Agent的最小原子能力,包含LangGraph代理、FastAPI服务、用于与服务交互的客户端以及一个使用客户端提供聊天界面的Streamlit应用。用户可以利用该工具包提供的模板快速搭建基于LangGraph框架…

论文概览 |《Urban Analytics and City Science》2023.10 Vol.50 Issue.8

本次给大家整理的是《Environment and Planning B: Urban Analytics and City Science》杂志2023年10月第50卷第8期的论文的题目和摘要&#xff0c;一共包括21篇SCI论文&#xff01; 论文1 Advances in geospatial approaches to transport networks and sustainable mobility …

大语言模型推理能力从何而来?

前言 DeepSeek R1采用强化学习进行后训练&#xff0c;通过奖励机制和规则引导模型生成结构化思维链&#xff08;CoT&#xff09;&#xff0c;从而显著提升了推理能力。这一创新方法使得DeepSeek R1能够在无需大量监督数据的情况下&#xff0c;通过自我进化发展出强大的推理能力…

用 WOW.js 和 animate.css 实现动画效果

用 wow.js 就可以实现动画效果&#xff0c;但由于里面的动画样式太少&#xff0c;一般还会引入 animated.css 第一步&#xff1a;下载 选择合适的包管理器下载对应的内容 pnpm i wow.js animated.css --save 第二步&#xff1a;引入 在main.js中加入&#xff1a; import …

设计模式教程:解释器模式(Interpreter Pattern)

1. 什么是解释器模式&#xff1f; 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;通常用于处理语言&#xff08;例如数学表达式、SQL查询等&#xff09;中的语法和解释。该模式定义了一个文法&#xff0c;并通过解释器类来解释文法中…

STM32MP157A单片机移植Linux驱动深入版

需求整理 在Linux设备树中新增leds节点&#xff0c;其有3个gpio属性&#xff0c;分别表示PE10对应led1&#xff0c;PF10对应led2&#xff0c;PE8对应led3&#xff0c;设备树键值对如下&#xff1a; leds { led1-gpio <&gpioe 10 0>; led2-gpio &l…

本地DeepSeek模型GGUF文件转换为PyTorch格式

接前文,我们在本地Windows系统上,基于GGUF文件部署了DeepSeek模型(DeepSeek-R1-Distill-Qwen-1.5B.gguf版本),但是GGUF是已经量化的版本,我们除了对其进行微调之外,无法对其训练,那么还有没有其他办法对本地的GGUF部署的DeepSeek模型进行训练呢?今天我们就反其道而行之…

http代理IP怎么实现?如何解决代理IP访问不了问题?

HTTP代理是一种网络服务&#xff0c;它充当客户端和目标服务器之间的中介。当客户端发送请求时&#xff0c;请求首先发送到代理服务器&#xff0c;然后由代理服务器转发到目标服务器。同样&#xff0c;目标服务器的响应也会先发送到代理服务器&#xff0c;再由代理服务器返回给…

人工智能之数学基础:施密特正交化

本文重点 在前面的课程中,我们学习了线性空间的基,其中有一个标准正交基的概念,假设现在有一个线性向量空间,然后已经确定了该线性空间的一组基,那么如何将其转变为标准正交基。本文将学习如何通过施密特正交化完成这个任务。 施密特正交化 施密特正交化(Schmidt Orth…

Spark(2)linux和简单命令

&#xff08;一&#xff09;Linux的文件系统 文件系统&#xff1a;操作系统中负责管理和存储文件信息的软件结构称为文件管理系统。 文件系统的结构通常叫做目录树结构&#xff0c;从斜杆/根目录开始; Linux号称万物皆文件&#xff0c;意味着针对Linux的操作&#xff0c;大多…

Grok 3.0 Beta 版大语言模型评测

2025年2月17日至18日&#xff0c;全球首富埃隆马斯克&#xff08;Elon Musk&#xff09;携手其人工智能公司xAI&#xff0c;在美国重磅发布了Grok 3.0 Beta版。这款被誉为“迄今为止世界上最智能的语言模型”的AI&#xff0c;不仅集成了先进的“DeepSearch”搜索功能&#xff0…

基于COSTAR模型的内容创作:如何用框架提升写作质量

目录 前言1. Context&#xff08;上下文&#xff09;&#xff1a;理解背景&#xff0c;奠定写作基础1.1 何为上下文1.2 上下文的作用1.3 案例解析 2. Objective&#xff08;目标&#xff09;&#xff1a;明确写作方向&#xff0c;避免跑题2.1 确立目标2.2 如何设定目标2.3 案例…

Springboot应用开发工具类整理

目录 一、编写目的 二、映射工具类 2.1 依赖 2.2 代码 三、日期格式 3.1 依赖 3.2 代码 四、加密 4.1 代码 五、Http请求 5.1 依赖 5.2 代码 六、金额 6.1?代码 七、二维码 7.1 依赖 7.2 代码 八、坐标转换 8.1 代码 九、树结构 9.1?代码 9.1.1 节点 …