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.rhkb.cn/news/21685.html

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

相关文章

Modbus协议基础

文章目录 1、Modbus协议基础知识1.1、Modbus存储范围1.2、Modbus协议功能码说明1.3、Modbus协议分类及测试 2、ModbusRTU通信报文分析2.1、modbusRTU通信格式 3、Modbus通信库开发4、通信库测试 1、Modbus协议基础知识 1.1、Modbus存储范围 modbus规定&#xff0c;每个存储区…

电脑想安装 Windows 11 需要开启 TPM 2.0 怎么办?

尽管 TPM 2.0 已经内置在许多新电脑中&#xff0c;但很多人并不知道如何激活这一功能&#xff0c;甚至完全忽略了它的存在。其实&#xff0c;只需简单的几步操作&#xff0c;你就能开启这项强大的安全特性&#xff0c;为你的数字生活增添一层坚固的防护屏障。无论你是普通用户还…

node 使用 Redis 缓存

缓存是什么&#xff1f; 高并发下&#xff0c;一个项目最先出问题的&#xff0c;并不是程序本身&#xff0c;而是数据库最先承受不住。 在数据库上我们可以做很多优化&#xff0c;例如优化 SQL 语句&#xff0c;优化索引&#xff0c;如果数据量大了&#xff0c;还可以分库、分表…

解决双系统开机显示gnu grub version 2.06 Minimal BASH Like Line Editing is Supported

找了好多教程都没有用&#xff0c;终于解决了&#xff01;&#xff01;我是因为ubuntu分区的时候出问题了 问题描述&#xff1a; 双系统装好&#xff0c;隔天开机找不到引导项&#xff0c;黑屏显示下列 因为我用的D盘划分出来的部分空闲空间&#xff0c;而不是全部&#xff0c…

NLP-RNN-LSTM浅析

目录 双向 LSTM&#xff08;Bi - LSTM&#xff09; 双向 LSTM&#xff08;Bi - LSTM&#xff09;原理深入讲解 代码示例&#xff08;基于 PyTorch&#xff09; LSTM 应用到双向 RNN 中 代码示例&#xff08;基于 PyTorch&#xff09; 双向 LSTM - CRF&#xff08;Conditio…

自动化之ansible(二)

一、ansible中playbook&#xff08;剧本&#xff09; 官方文档&#xff1a; Ansible playbooks — Ansible Community Documentation 1、playbook的基本结构 一个基本的playbook由以下几个主要部分组成 hosts: 定义要执行任务的主机组或主机。 become: 是否需要使用超级用户…

uni-app小程序开发 基础知识2

目标&#xff1a; 构建一个文章发表平台。 我们先来写一个静态框架。 以下是 首页初代码文章列表页代码&#xff1a; <template><view class"content"><!-- 轮播图 --><swiper class"swiper-container" autoplay"true"…

kafka-集群扩容

一. 前言&#xff1a; 随着业务增加&#xff0c;我们会面临这kafka当性能问题&#xff0c;需要进行集群扩容&#xff0c;增加broker节点。 二. 扩容说明: 增加新服务到kafka集群是很容易的(参考&#xff1a; kafka-部署安装-CSDN博客 )&#xff0c;只要为新服务分配一个独一无…

uni-app开发app时 使用uni.chooseLocation遇到的问题

问题一&#xff1a;不显示 问题二&#xff1a;选择地址列表一直在加载中 因为 uni-app 接口文档 中已经说明&#xff0c;使用腾讯的话需要开启云服务&#xff0c;具体可看官网&#xff0c;这就是为什么使用时直接不显示的原因&#xff0c;所以我使用的高德&#xff0c;但又出现…

RabbitMQ的脑裂(网络分区)问题

问题描述&#xff1a; Mnesia reports that this RabbitMQ cluster has experienced a network partition. There is a risk of losing data 一、什么是MQ脑裂&#xff1f; 网络分区 如果另一个节点在一段时间内&#xff08;默认为 60 秒&#xff09;无法与其联系&#xff0…

SQL知识体系

SQL复习 MySQL SQL介绍 SQL SQL的全拼是什么&#xff1f; SQL全拼&#xff1a;Structured Query Language&#xff0c;也叫结构化查询语言。 SQL92和SQL99有什么区别呢&#xff1f; SQL92和SQL99分别代表了92年和99年颁布的SQL标准。 在 SQL92 中采用&#xff08;&#xff…

企业商业秘密百问百答之五十三【商业秘密转让】

《企业商业秘密百问百答》是由天禾律所陈军律师团队精心编撰的成果&#xff0c;汇集了该团队律师在处理商业秘密相关的刑事和民事案件中的丰富经验。近年来&#xff0c;这份资料已通过线上和线下的方式向全国近千家企业进行了广泛宣讲&#xff0c;并获得了积极的社会反响。 其…

巧用GitHub的CICD功能免费打包部署前端项目

近年来&#xff0c;随着前端技术的发展&#xff0c;前端项目的构建和打包过程变得越来越复杂&#xff0c;占用的资源也越来越多。我有一台云服务器&#xff0c;原本打算使用Docker进行部署&#xff0c;以简化操作流程。然而&#xff0c;只要执行sudo docker-compose -f deploy/…

STM32 CubeMx配置串口收发使用DMA并调用Idle模式(二)

本篇主要结合代码落实&#xff0c;之前串口已经配置好的DMA方式。 一、首先我们把串口看成一个对象&#xff0c;它有属性、私有数据和方法&#xff1b; 每个串口都有名字属性&#xff1b;有初始化、发送、接收方法&#xff1b;还有一个私有数据&#xff08;这个私有数据是每个…

react实例与总结(二)

目录 一、脚手架基础语法(16~17) 1.1、hello react 1.2、组件样式隔离(样式模块化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相关API 2.1.1、内置组件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…

【并发测试】Redis并发性能测试

arthas 测试示例 Redis配置类 Slf4j Configuration public class RedisConfig {BeanJedisConnectionFactory jedisConnectionFactory() {RedisStandaloneConfiguration configuration new RedisStandaloneConfiguration();configuration.setHostName(redisHost);configuratio…

【Linux基础八】计算机体系结构(冯诺依曼和操作系统)

【Linux基础八】计算机体系结构&#xff08;冯诺依曼和操作系统&#xff09; 1.冯诺依曼体系结构2.冯诺依曼的优势3.硬件间的交流4.操作系统对硬件资源的管理 1.冯诺依曼体系结构 计算机大部分遵守冯诺依曼体系 输入设备&#xff1a;键盘、鼠标、摄像头、麦克风、磁盘、网卡…

深入解析Qt事件循环

在Qt开发中&#xff0c;QApplication::exec()这行代码是每个开发者都熟悉的“魔法咒语”。为什么GUI程序必须调用它才能响应操作&#xff1f;为何耗时操作会导致界面冻结&#xff1f;本文将以事件循环为核心&#xff0c;揭示Qt高效运转的底层逻辑&#xff0c;探讨其设计哲学与最…

Hadoop 基础原理

Hadoop 基础原理 基本介绍Hadoop 的必要性Hadoop 核心组件Hadoop 生态系统中的附加组件 HDFSHDFS 集群架构HDFS 读写流程HDFS 写流程HDFS 读流程 NameNode 持久化机制 MapReduce底层原理示例 Hadoop 是一个由 Apache 基金会开发的分布式系统基础架构&#xff0c;主要解决海量数…

视觉分析之边缘检测算法

9.1 Roberts算子 Roberts算子又称为交叉微分算法&#xff0c;是基于交叉差分的梯度算法&#xff0c;通过局部差分计算检测边缘线条。 常用来处理具有陡峭的低噪声图像&#xff0c;当图像边缘接近于正45度或负45度时&#xff0c;该算法处理效果更理想。 其缺点是对边缘的定位…