4.1 RK3399项目开发实录-案例开发之MIPI 摄像头开发(wulianjishu666)

嵌入式从零到项目开发全套例程资料

链接:https://pan.baidu.com/s/1ksCQN__jD8ZrJhw8sWzhwQ?pwd=vvfz

3.2. MIPI 摄像头

带有 MIPI CSI 接口的 RK3399 板子都添加了双 MIPI 摄像头 OV13850 的支持,应用中也添加了摄像头的例子。下面介绍一下相关配置。

3.2.1. 设备树文件配置

以 rk3399-firefly-aiojd4.dts 为例,这些都是摄像头需要打开的配置。由于内核已经添加了双 MIPI 摄像头的支持,所以这里配置了两个摄像头,如果只使用一个摄像只需要打开其中一个摄像头就可以了。

//电源管理
&vcc_mipi {status = "okay";
};&dvdd_1v2 {status = "okay";
};//MIPI 摄像头1
&ov13850 {status = "okay";
};
&rkisp1_0 {status = "okay";
};&mipi_dphy_rx0 {status = "okay";
};&isp0_mmu {status = "okay";
};
//MIPI 摄像头2
&ov13850_1 {status = "okay";
};
&rkisp1_1 {status = "okay";
};
&mipi_dphy_tx1rx1 {status = "okay";
};&isp1_mmu {status = "okay";
};

注意: 如果使用的是 core-3399 核心板加上 DIY 底板,可能需要修改相应的 GPIO 属性。

3.2.2. 调试

在运行脚本之前先确认一下 OV13850 设备是否注册成功,下面是成功的内核日志:

root@firefly:~# dmesg | grep ov13850
//MIPI 摄像头1
[    1.276762] ov13850 1-0036: GPIO lookup for consumer reset
[    1.276771] ov13850 1-0036: using device tree for GPIO lookup
[    1.276803] of_get_named_gpiod_flags: parsed 'reset-gpios' property of node '/i2c@ff110000/ov13850@36[0]' - status (0)
[    1.276855] ov13850 1-0036: Looking up avdd-supply from device tree
[    1.277034] ov13850 1-0036: Looking up dovdd-supply from device tree
[    1.277170] ov13850 1-0036: Looking up dvdd-supply from device tree
[    1.277535] ov13850 1-0036: GPIO lookup for consumer pwdn
[    1.277544] ov13850 1-0036: using device tree for GPIO lookup
[    1.277575] of_get_named_gpiod_flags: parsed 'pwdn-gpios' property of node '/i2c@ff110000/ov13850@36[0]' - status (0)
[    1.281862] ov13850 1-0036: Detected OV00d850 sensor, REVISION 0xb2
//MIPI 摄像头2
[    1.284442] ov13850 1-0046: GPIO lookup for consumer pwdn
[    1.284461] ov13850 1-0046: using device tree for GPIO lookup
[    1.284523] of_get_named_gpiod_flags: parsed 'pwdn-gpios' property of node '/i2c@ff110000/ov13850@46[0]' - status (0)
[    1.288235] ov13850 1-0046: Detected OV00d850 sensor, REVISION 0xb2

在 /dev 下应该生成相关设备文件:

root@firefly:~# ls /dev/video
//MIPI 摄像头1
video0  video1  video2  video3
//MIPI 摄像头2
video4  video5  video6  video7

注意: 同理,如果只使用一个摄像头,只需要注册一个摄像头设备就可以了。

3.2.3. 测试预览摄像头

3.2.3.1. v4l2

使用v4l2方式预览摄像头:

apt-get install -y git libopencv-dev cmake libdrm-dev g++ librga-devgit clone https://github.com/T-Firefly/rkisp-v4l2.gitcd rkisp-v4l2/rkisp_demo/
cmake ./
makesudo -u firefly DISPLAY=:0 ./rkisp_demo -c 300 -d /dev/video0 -w 640 -h 480
or
sudo -u firefly DISPLAY=:0 ./rkisp_demo -c 300 -d /dev/video5 -w 640 -h 480
3.2.3.2. gstreamer

使用gstreamer方式预览摄像头:

gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=NV12,width=640,height=480, framerate=30/1 ! videoconvert ! kmssink &

运行脚本即可,结果如图所示:

_images/mipi_csi.jpg

3.2.4. 开发MIPI 摄像头

3.2.4.1. FFMPEG读取MIPI摄像头
  • 使用v4l2loopback和FFMPEG多路投影

apt-get install -y git libopencv-dev cmake libdrm-dev g++ librga-dev python-devgit clone https://github.com/umlaeute/v4l2loopback.gitcd v4l2loopback/#参考 《安装linux-headers和linux-image》
make install
...//使用v4l2loopback创建 video10、video11和video12设备
sudo insmod v4l2loopback.ko videonr=10,11,12#打开读取video0设备,并把图像信息写入到video10中
sudo -u firefly DISPLAY=:0  ./rkisp_demo -c 300  -d /dev/video0 -w 640  -h 480 -D /dev/video10// 使用ffmpeg拷贝功能将video10中的内容,拷贝到video11和video12设备中
ffmpeg -loglevel quiet -f v4l2 -video_size 640x480 -r 10 -i /dev/video10 -preset fast -codec copy -f v4l2 /dev/video11 -preset fast -codec copy -f v4l2 /dev/video12// 另起一个终端,使用ffplay工具任意预览video11或video12
ffplay -i /dev/video11
3.2.4.2. OpenCV读取MIPI摄像头

MIPI摄像头是不支持OpenCV中 capture.open(index) 方式读取的,在此提供2中读取摄像头的方法:

这种方式推荐OpenCV的C++版本使用,详细使用参考前面的v4l2预览一节。v4l2_simple_demo是rkisp_demo.cpp的精简版本,详细可参考rkisp_demo.cpp。

  • C++

    推荐OpenCV的C++版本使用,详细使用参考前面的v4l2预览一节。v4l2_simple_demo是rkisp_demo.cpp的精简版本,详细可参考rkisp_demo.cpp。

    参考:
    https://github.com/T-Firefly/rkisp-v4l2.gitgit clone https://github.com/T-Firefly/rkisp-v4l2.git
    cd rkisp-v4l2/mipi_video_demo/v4l2_simple_demo
    make
    # open /dev/video0
    sudo -u firefly DISPLAY=:0 ./opencv
    
  • Python

    使用 OpenCV-Python 方式读取 MIPI 摄像头需要添加Gstreamer支持,并需要重现编译安装OpenCV。参考《OpenCV 编译和安装》

    git clone https://gitlab.com/firefly-linux/test_code/rkisp-v4l2.git
    cd mipi_video_demo/OpenCV_Python
    # Please read rkisp-v4l2/mipi_video_demo/OpenCV_Python/README.md carefully.
    python3 opencv_gst_test.py

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

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

相关文章

extundelete使用

用于恢复ext3/ext4文件被删除后的恢复 下载路径 https://sourceforge.net/projects/extundelete/ 编译 ./configure make ./configure出现一个错误 Configuring extundelete 0.2.4 configure: error: Cant find ext2fs library 需要 sudo apt-get update sudo apt-get in…

蓝桥杯(2):python基础算法【上】

时间复杂度、枚举、模拟、递归、进制转换、前缀和、差分、离散化 1 时间复杂度 重要是看循环,一共运行了几次 1.1 简单代码看循环 #时间复杂度1 n int(input()) for i in range(1,n1):for j in range(0,i):pass ###时间复杂度:123....nn(1n)/2 所以…

2024 ccfcsp认证打卡 2023 09 02 坐标变换(其二)

202309-2 坐标变换(其二) 题解1题解2区别第一种算法(使用ArrayList存储操作序列):数据结构:操作序列处理: 第二种算法(使用两个数组存储累积结果):数据结构&a…

【C语言基础篇】字符串处理函数(五)字符分类函数

个人主页: 倔强的石头的博客 系列专栏 :C语言指南 C语言刷题系列 系列文章 【C语言基础篇】字符串处理函数(一)strlen的介绍及模拟实现-CSDN博客 【C语言基础篇】字符串处理函数(二)strcpy…

Unable to authenticate, need: BASIC realm=“Sonatype Nexus Repository Manager“

问题 使用公司的私有源,执行 npm i 的时候突然报错了: 解决 执行命令 npm config list找到 .npmrc 去掉对应的这一行即可,或者使用 nrm 工具执行 nrm del xxx 删掉私有源,然后在添加私有源也可。可以参考我这篇:使…

(一)基于IDEA的JAVA基础8

使用多重if选择结构 多个if条件进行判断: 语法: if(条件1){ 执行语句1; }else if(条件2){ 执行语句2; }else if(条件3){ 执行语句3; }else if (条件4)…… 流程图: 我们来写个好玩的,对暗号: public class Test01 { …

五分钟快速搭建个人游戏网站(1Panel)

五分钟快速搭建个人游戏网站(1Panel) 环境要求:主流 Linux 发行版本(基于 Debian / RedHat,包括国产操作系统); 如果是Windows OS的可以通过WSL来实现安装。 1 介绍 1Panel 是一个基于 Web 的 L…

人机对话 :人工智能对未来就业的影响——使用kimi AI

人机对话 :人工智能对未来就业的影响——使用kimi AI 一、计算机替代人类劳动的发展趋势预测。二、在AI技术快速发展的背景下,教育体系应该如何改革以适应未来劳动市场的需求?三、具体预测一下未来10年后对就业形势的影响。四、未来10年&…

结构体讲解

目录 一.结构体类型的声明 (1)结构体的声明 (2)结构体的创建和初始化 (3)匿名结构体 (4)结构体的自引用 二.结构体内存对齐 (1)对齐规则 (2)为什么存在内存对齐? (3)结构体传参 三.结构体实现位段 (1)什么是位段 (2)位段的内存分配 (3)位段的跨平…

电脑桌面便签,怎么在电脑桌面上设置便签

在数字化时代,电脑已成为我们日常生活不可或缺的一部分。在我们使用电脑进行各种工作和学习的过程中,经常会遇到需要记录临时信息或提醒自己的情况。这时,设置便签在电脑桌面上就成为了一种非常便捷的方法。那么有一个问题,电脑桌…

2.8、下拉刷新与上拉加载

页面的下拉刷新与上拉加载功能在移动应用中十分常见,例如,新闻页面的内容刷新和加载。这两种操作的原理都是通过响应用户的触摸事件,在顶部或者底部显示一个刷新或加载视图,完成后再将此视图隐藏。 实现思路 以下拉刷新为例,其实现主要分成三步: 监听手指按下事件,记录…

LeetCode热题Hot100-无重复字符的最长子串

一刷,险些被自己绕进去了,哈哈哈 题目描述: 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串的长度。 输入: s "abcabcbb" 输出: 3 def lengthOfLongestSubstring(self, s: str) -> int:if len(s) 0:re…

每天学点儿python(1)---print,input和注释

print函数 print语法格式 print(*objects, sep , end\n, filesys.stdout) sep参数默认为 一个空格 end(输出末尾)参数默认为 回车换行 file默认为 标准输出(一般指屏幕) 所以,如果想输出各个字段不用空格隔开&a…

使用colab仿李沐的卷积神经网络小代码

import torch from torch import nn #神经网络模块 from d2l import torch as d2l #(drive into deep learning)class Reshape(torch.nn.Module):def forward(self, x):return x.view(-1, 16*3*3)net torch.nn.Sequential( #序列化神经网络# 2d卷积层、输入通道数1&#xff0…

vue3+threejs新手从零开发卡牌游戏(七):创建卡组

在开始前先优化下之前的代码: 在之前hand/p1.vue中为了定位 utils文件夹下新建common.ts,将一些公用方法提取出来放在这里: 在game/Cards.ts中,我们调整下卡牌的厚度,由原来的0.02改为0.005,原因是之前的…

【Ucore操作系统】4. 地址空间

文章目录 【 0. 引言 】背景本章任务 【 1. C 中的动态内存分配 】1.1 C语言的内存分配1.2 kalloc 中的动态内存分配 【 2. 地址空间 】2.1 虚拟地址和地址空间2.1.1 地址虚拟化出现之前2.1.2 加一层抽象加强内存管理2.1.3 增加硬件加速虚实地址转换 2.2 分段内存管理2.2.1 等量…

Docker专题-04 Nginx部署

Docker专题-04 Nginx部署 注: 本教程由羞涩梦整理同步发布,本人技术分享站点:blog.hukanfa.com 转发本文请备注原文链接,本文内容整理日期:2024-03-21 csdn 博客名称:五维空间-影子,欢迎关注…

javaSwing扫雷游戏

一、介绍 1.1 背景 在1964年 有一个叫“方 块”的游戏,这是扫雷最原始的版本。后来,这个游戏被改成了另一种游戏,叫做“Rlogic”。在这个游戏中,玩家扮演了一名军队的军人,接受了一项艰难的任务:为指挥中…

24计算机考研调剂 | 中国科学院深圳

中国科学院深圳先进技术研究院(国科大)硕士招收调剂(仅内部调剂) 考研调剂招生信息 中国科学院深圳先进技术研究院集成所神经工程中心刘志远课题组接收2024年中国科学院大学硕士研究生调剂1名,最终录取为全日制专硕 材…

龙芯新世界系统(安同AOCS OS)安装使用HP 1010激光打印机

龙芯新世界系统(安同AOCS OS)安装及切换到Cinnamon桌面系统以后,缺少一个通用的打印机管理配置程序,因此通过以下命令就可以在控制面板中增加打印机配置项: sudo oma install system-config-printer 但是安装完成后&…