摄像头工程师说 Camera-如何控制摄像头的输出尺寸(分辨率)

摄像头工程师说 Camera-如何控制摄像头的输出尺寸(分辨率)

摄像头 sensor 的技术手册中往往标识了其支持的最大输出尺寸,如下:
在这里插入图片描述
在最大尺寸为 2688 x 1944 的情况下,如何获取一个适合自己的输出尺寸,如 1920 x 1080,有多种方法。典型的有:windowing、crop、subsample、skip、binning、scaling 几种。今天我们就来唠唠这几种方法的区别和基本原理。

windowing

Windowing 方法是通过控制 camera sensor 的输出像素窗口来控制最终得到的图像分辨率大小的。
举例:
如下是一个像素矩阵,左下角为坐标(0,0)处。通过控制 sensor 输出窗口的起始坐标,以及输出窗口的长、宽就可以得到想要的分辨率。如起始坐标为(0,0),长、宽分别为 340 x 240,就可以得到一个 340 x 240 分辨率的输出。这种方法的优势是真正工作的 sensor pixel 减少了,曝光时间等参数缩小了,因此可以增加帧率。但是很显然,这种方式减小了 sensor 的视角。
在这里插入图片描述

Cropping

Cropping,即裁剪通常发生在 Camera sensor 的下级处理单元中,比如 ISP 或者 Codec。裁剪是指对于一个 1920*1080 的 sensor 输出图像,我们只裁剪其中的一部分。
如下,我们在原图中裁剪出一小部分作为最终的输出:
在这里插入图片描述
在这里插入图片描述
显然,与 windowing 不同,crop 是在得到图像后,指定一个起始地址和裁剪的长、宽来框定一个裁剪范围。有时在一些图像处理软件中,裁剪的过程称为 ROI,即 Region of interest,其意就是框定一个感兴趣的范围。如果 sensor 支持 crop,那么其实也是在原始数据输出后,从大尺寸上裁剪出来的,因此并不能改善帧率,同时,这种方法缩减了最终图像的视场角。

Skip/Subsample

Skip 和 Subsample 的原理类似,都是在 sensor 完成采集,输出数据(Readout)阶段,按照一定的规则只抽取部分像素点的数据作为输出来实现的。
如下所示,在输出数据时,可以隔列输出,将原本 8 列的数据,舍弃 4 列,仅输出剩余四列的像素对应的数据。
在这里插入图片描述
当然也可以行、列都仅输出部分的数据:
在这里插入图片描述
这种抽取部分像素的值进行输出方式承认会损失一部分图像细节,但因为像素点排列很紧密,还是能还原原始图像的大部分轮廓和颜色的。这种方式没有影响参与曝光的像素点的个数,仅仅是在 readout 阶段作了取舍。因此 Subsample 后的帧率与原始尺寸的帧率一样,不会加快帧率;此外Subsample 后的图像视角与原始尺寸基本一样,不会缩小图像视角。

Scale

Scaling 即缩放。Scaling 又分为 scale down 即缩小、scale up 放大。可以水平\垂直方向缩放,也可以水平、垂直同比例缩放,本质是相关位置的像素的分解与融合成更少、更多的像素。这种控制图像大小的方式,多出现在图像处理的后端,如 ISP 和 LCD 控制器上。
如下是一个水平缩放的效果示例:
在这里插入图片描述

Binning

Binning 发生在像素 readout 阶段,是一种合并读出的处理策略。与 Skip 不同的是,Binning 不是舍弃部分像素值,而是将所有相同颜色(通道)的像素值融合为一个像素值(可以简单认为是均值处理)输出。如下图所示为 2 x 2 binning(即水平、垂直方向均 2 倍融合),4 x 4 的 16 个像素的值,通过融合,变成了一个 2 x 2 的 4 个像素的值。这将数据量减小了 4 倍。
在这里插入图片描述
binning 通常可以加快帧率,改善低光照下的图像质量(多个像素感光性能好,信噪比高),并且保留了原始曝光像素的视角。

总结

1)本文讲述了几种控制 Camera 系统的输出图像尺寸-分辨率的方法,包含 windowing、Cropping、Skip、Subsample、Scale、Binning 几种方法。
2)不同的 sensor 、不同的 Camera 系统支持的控制输出尺寸的方法不同。不同的方法对图像的视场角、帧率、图像质量等的影响也不同。大家应该结合具体 sensor 的特性、产品需求使用合适的方法。
(感谢点赞或收藏,关注不迷路)

  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
首先,你需要确保已经导入了onvifcamera-jvm的类库,并且已经建立了与摄像头的连接。然后,可以通过以下步骤来实现控制海康摄像头转动: 1. 创建PTZ控制对象 ```java OnvifDevice device = new OnvifDevice("http://192.168.1.100/onvif/device_service"); OnvifProfile profile = device.getMedia().getProfiles()[0]; OnvifPtz ptz = device.getPtz(profile.getToken()); ``` 其中,"http://192.168.1.100/onvif/device_service"是海康摄像头的设备服务地址,可以根据实际情况进行修改。 2. 获取PTZ节点信息 ```java OnvifPtzNode[] nodes = ptz.getNodes(); OnvifPtzNode panNode = null; OnvifPtzNode tiltNode = null; for (OnvifPtzNode node : nodes) { if (node.getName().toLowerCase().contains("pan")) { panNode = node; } if (node.getName().toLowerCase().contains("tilt")) { tiltNode = node; } } ``` 通过调用getNodes()方法可以获取到PTZ节点信息,包括名称、范围等。在海康摄像头中,通常会有一个"pan"节点和一个"tilt"节点,分别控制摄像头水平和垂直方向的转动。 3. 控制PTZ转动 ```java // 控制摄像头向左转动 ptz.continuousMove(panNode.getToken(), -0.1f, 0.0f, null); // 控制摄像头向右转动 ptz.continuousMove(panNode.getToken(), 0.1f, 0.0f, null); // 控制摄像头向上转动 ptz.continuousMove(tiltNode.getToken(), 0.0f, -0.1f, null); // 控制摄像头向下转动 ptz.continuousMove(tiltNode.getToken(), 0.0f, 0.1f, null); ``` 通过调用continuousMove()方法可以控制摄像头的转动。其中,第一个参数为节点的Token,第二个参数为水平方向的速度,第三个参数为垂直方向的速度,第四个参数为可选参数,用于设置持续间等。在这个例子中,我们通过控制速度的正负来控制转动方向。 注意:以上代码仅为示例,实际使用中需要根据具体情况进行修改。另外,需要注意的是,海康摄像头的PTZ控制可能存在一些特殊的问题,需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

物联网老王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值