文章前两天发过,标题错了,然后下面一部分内容格式错误,我也搞不了。这里做下标题的更正。
先说这个东西有什么用,可以把市面上支持输出HDMI的运动相机转成树莓派的CSI接口,然后可以借助Linux强大的生态来捕获视频。至于应用,那可太多了。
官方点的说法是:
HDMI 到 CSI 摄像头端口适配器,HDMI 输入支持高达1080p@30fps ,向后兼容。它允许您使用 HDMI 摄像头,就像标准的 Raspberry Pi CSI 摄像头一样,支持所有版本的 Raspberry Pi 系列板。
4B
Capture:sudo raspistill -o image-01.jpg
Record:sudo raspivid -o video-01.h264 -t 10000
有图有真相,就像下面这样:
这是狗5?
自然相机也少不了啊
就像这样
放大一点看
正面
背面
在这个TM的物价飞涨的世界里面,幸亏以前有买板子
其实为了文章的完整性,我这里想插一些关于这个相机接口的定义的内容。
就是这个相机的接口,其实我们知道,上面的东西就是模拟了相机的视频信号,遵循了固定的协议。
前面是V1的相机,后面是V2的。
一模一样,一共15个
中文接口
英文接口
因为Zero的小巧,所以单独的说说
确实是这样的
另外我想写一下关于这个树莓派捕获视频的应用。
关于树莓派新系统二三事(Bullseye)我前几天也写过这个,新的OS都是把里面换成了开源的实现,SO,我们就用以前的版本。
raspistill 是用于使用 Raspberry Pi 相机模块捕获静态照片的命令行工具。
用法:RaspiStill [选项]
图像参数命令
-?, --help :此帮助信息
-w, --width : 设置图片宽度
-h, --height : 设置图片高度
-q, --quality : 设置 jpeg 质量 <0 到 100>
-r, --raw :将原始拜耳数据添加到 jpeg 元数据
-o, --output : 输出文件名
-v, --verbose : 运行时输出详细信息
-t, --timeout : 拍照和关机前的时间(以毫秒为单位)(如果没有指定,设置为 5s)
-th, --thumb : 设置缩略图参数 (x:y:quality)
-d, --demo : 运行演示模式(循环通过一系列相机选项,不捕获)
-e, --encoding : 用于输出文件的编码 (jpg, bmp, gif, png)
-x, --exif : 应用于捕获的 EXIF 标记(格式为 'key=value')
-tl, --timelapse :延时摄影模式。每拍一张
预览参数命令
-p, --preview : 预览窗口设置
-f, --fullscreen :全屏预览模式
-n, --nopreview : 不显示预览窗口
图像参数命令
-sh, --sharpness :设置图像清晰度(-100 到 100)
-co, --contrast :设置图像对比度(-100 到 100)
-br, --brightness :设置图像亮度(0 到 100)
-sa, --saturation :设置图像饱和度(-100 到 100)
-ISO, --ISO : 设置捕获 ISO
-vs, --vstab : 开启视频稳定
-ev, --ev : 设置 EV 补偿
-ex, --exposure :设置曝光模式(见注释)
-awb, --awb : 设置 AWB 模式(见注释)
-ifx, --imxfx :设置图像效果(见注释)
-cfx, --colfx : 设置颜色效果 (U:V)
-mm, --metering :设置测光模式(见注释)
-rot, --rotation : 设置图像旋转 (0-359)
-hf, --hflip : 设置水平翻转
-vf, --vflip : 设置垂直翻转
注意!
曝光模式选项:
关闭,自动,夜,夜景,背光,聚光灯,体育,雪景,海滩,很长,固定fps,防抖,烟花
AWB 模式选项:
关闭,自动,太阳,云,灯罩,钨丝灯,荧光灯,白炽灯,闪光,地平线
图像效果模式选项:
无,负数,日光,素描,去噪,浮雕,油画,影线,gpen,粉彩,水彩,电影,模糊,饱和度,颜色交换,褪色,海报,色点,色彩平衡,卡通
测光模式选项:
平均,点,背光,矩阵
raspivid 是用于使用 Raspberry Pi 摄像头模块捕获视频的命令行工具。
Raspberry Pi 系列上使用的 SoC 都有两个摄像头接口,支持 CSI-2 D-PHY 1.1 或 CCP2(紧凑型摄像头端口 2)源。该接口的代号为“Unicam”。Unicam 的第一个实例支持 2 个 CSI-2 数据通道,而第二个支持 4 个。每个通道可以以高达 1Gbit/s(DDR,因此最大链路频率为 500MHz)运行。
但是,Raspberry Pi 的普通变体仅公开第二个实例,并且仅将2 个数据通道路由到相机连接器。计算模块范围从两个外围设备路由出所有通道。
接下来就是说,为什么可以用这个东芝的芯片就可以捕捉HDMI。因为是内核有支持!
有个模块叫C779,这里要说一下。
关于这个接口,我看板子是公版的。
HDMI to CSI - 2
是我们的板子,然后是I2C控制的芯片。
Linux的内核折腾指南
这是目前已经测试通过的驱动程序,其实看源码。。。密密麻麻的驱动啊,可能还没有测试。
Raspberry Pi Linux 内核目前支持 2 个桥接芯片,用于模拟视频源的 Analog Devices ADV728x-M 和用于 HDMI 源的 Toshiba TC358743。
这是基本的作用
处理视频的能力
CSI-2 TX(发送)
芯片的整个控制都是使用的IIC控制
芯片还不咋省电。。。
说看看MIPI的标准。。。hhhh,还看不了,有兄弟有的,给我看看
系统框图
对了这个东西还支持EDID
WIKI的说法
关于具体这个芯片的控制,后面会给资料,300多页的寄存器。
上面的图像格式频繁的出现,这里就说说
YCbCr颜色空间是YUV颜色空间的缩放和偏移版本。Y定义为8bit,标称颜色范围为16-235;Cb和Cr标称颜色表示范围为16-240。YCbCr的采样格式一般有4:4:4、4:2:2、4:1:1、和4:2:0。
这里给段MATLAB的转换代码:
close all
clear all
clc
I=imread('1.bmp');
[H ,W ,D]=size(I);
R=double(I(:,:,1));
G=double(I(:,:,2));
B=double(I(:,:,3));
Y0= double(zeros(H,W));
Cb0 =double(zeros(H,W));
Cr0 = double(zeros(H,W));
Cb1 =double(zeros(H,W/2));
Cr1 = double(zeros(H,W/2));
CbCr = double(zeros(H,W));
%RGB转YCbCr444
for i = 1:H
for j = 1:W
Y0(i, j) = 0.299*R(i, j) + 0.587*G(i, j) + 0.114*B(i, j);
Cb0(i, j) = -0.172*R(i, j) - 0.339*G(i, j) + 0.511*B(i, j) + 128;
Cr0(i, j) = 0.511*R(i, j) - 0.428*G(i, j) - 0.083*B(i, j) + 128;
end
end
for i=1:1:H
for j=2:2:W
Cb1(i,j/2)=(Cb0(i,j-1)+Cb0(i,j))/2;
end
end
for i=1:1:H
for j=2:2:W
Cr1(i,j/2)=(Cr0(i,j-1)+Cr0(i,j))/2;
end
end
for i=1:1:H
for j=1:1:W
if rem(j,2)==0
CbCr(i,j)=Cr1(i,j/2);
else
CbCr(i,j)=Cb1(i,(j+1)/2);
end
end
end
Iycbcr(:,:,1)=Y0;
Iycbcr(:,:,2)=Cb0;
Iycbcr(:,:,3)=Cr0;
Iycbcr=uint8(Iycbcr);
Y0=uint8(Y0);
Cb0=uint8(Cb0);
Cr0=uint8(Cr0);
Cb1=uint8(Cb1);
Cr1=uint8(Cr1);
CbCr=uint8(CbCr);
figure(1),
subplot(211),imshow(I),title('RGB');
subplot(212),imshow(Iycbcr),title('YCbCr444');
figure(2),
subplot(221),imshow(Cb1),title('Cb1');
subplot(222),imshow(Cr1),title('Cr1');
subplot(223),imshow(Cb0),title('Cb0');
subplot(224),imshow(Cr0),title('Cr0');
figure(3),
subplot(211),imshow(Y0),title('Y0');
subplot(212),imshow(CbCr),title('CbCr');
YCbCr444转YCbCr422:首先将rgb图像转为YCbCr444然后再由YCbCr444转为YCbCr422.
好像扯得远了,继续说,树莓派得文档里面说,国外最容易买得就是:
这个板子。
我又找到一点东西:
这个25FPS,是因为树莓派的限制,而且如果有计算模块,可以以60FPS捕获。
如果相机不支持隔行输出也不行。
上面的内容是OpenHD,一共基于树莓派构建的数字FPV系统。
继续说树莓派的事情:
树莓派因为没有BIOS,所以Raspbian对设备的加载都是依赖在/boot/config.txt中的配置来加载。当Linux内核加载时,会读取/boot/config.txt中的设备配置和设备参数配置来把设备动态加载到Device Tree(DT)中。
配置语法:
dtoverlay=
dtparam=
, ,...
dtoverlay上配你想要加载设备,这些设备都必须是Raspbian支持的,它们位于/boot/overlays
下。这是设备他们的说明位于/boot/overlays/README
,可以在这里查看到Raspbian支持的每个设备的具体信息和参数(也可以直接在官方Github查阅最新的设备支持)
dtparam是设备的参数,具体信息可根据/boot/overlays/README
中的说明来配置
TC358743 将 HDMI 接口连接到 CSI-2 和 I2S 输出。它由TC358743 内核模块支持。
该芯片支持高达 1080p60 的 RGB888、YUV444 或 YUV422 输入 HDMI 信号。它可以转发RGB888,或者将其转换为YUV444或YUV422,并在YUV444和YUV422之间转换。仅测试了 RGB888 和 YUV422 支持。使用 2 个 CSI-2 通道时,可以支持的最大速率为 1080p30 RGB888 或 1080p50 YUV422。在计算模块上使用 4 个通道时,可以以任一格式接收 1080p60。
HDMI 通过广播它可以支持的所有模式的EDID的接收设备来协商分辨率。内核驱动程序不知道您希望接收的分辨率、帧速率或格式,因此由用户提供合适的文件。这是通过 VIDIOC_S_EDID ioctl 完成的,(里面都是系统级别的配置,具体使用需要查文档)或者更容易使用v4l2-ctl --fix-edid-checksums --set-edid=file=filename.txt
如上所述,使用DV_TIMINGS
ioctl 配置驱动程序以匹配传入的视频。最简单的方法是使用命令v4l2-ctl --set-dv-bt-timings query
。如果您希望编写应用程序来处理不断变化的源,驱动程序确实支持生成 SOURCE_CHANGED 事件。更改输出像素格式是通过 VIDIOC_S_FMT 设置来实现的,但是只有像素格式字段将被更新,因为分辨率是由 dv 时序配置的。
此驱动程序使用config.txt
dtoverlay加载tc358743
。
音频没有这方面的需求,我就不写了
还找到一个输出YUV的Github库
https://github.com/circpeoria/raspividYUV
https://github.com/ylj2000/HDMI_To_MIPI
https://github.com/ylj2000/MSATA_HDMI_MIPI
https://github.com/hoglet67/RGBtoHDMI
另外一个和树莓派有关系的
https://github.com/peng-zhihui/HDMI-PI
大佬的项目可不能不写
以上全为东芝原厂的原理图,最后一共是最简单的系统连线。
最后这个数据手册。。。送走我。。。
网上现在就是150的价钱。。。怎么说呢,我也没有用过,不知道这个玩起来怎么样。
因为OBS在Linux AARCH64下好像不能用,这就算无奈之举了。。。
至于更多的玩法,我有了再玩,但是哪个时候我可能有了更喜欢玩的东西。
https://www.arducam.com/raspberry-pi-camera-pinout/#:~:text=Raspberry%20Pi%20Camera%20Pinout%20%2822-Pin%29%20%20%20,%20%20Ground%20%2018%20more%20rows%20
https://thepihut.com/blogs/raspberry-pi-roundup/raspberry-pi-camera-board-raspistill-command-list
https://github.com/raspberrypi/linux/blob/rpi-5.4.y/drivers/media/i2c/tc358743.c
https://www.kernel.org/doc/html/latest/
https://toshiba.semicon-storage.com/ap-en/semiconductor/product/interface-bridge-ics-for-mobile-peripheral-devices/hdmir-interface-bridge-ics/detail.TC358743XBG.html
https://en.wikipedia.org/wiki/Extended_Display_Identification_Data
https://zh.wikipedia.org/wiki/%E8%89%B2%E5%BD%A9%E6%B7%B1%E5%BA%A6
https://github.com/OpenHD/Open.HD/wiki/General-~-Features
https://www.raspberrypi.com/documentation/accessories/camera.html#shooting-raw-using-the-camera-modules