opencv - 来自 OV5647 树莓派相机 v1 的 640 x 480 图像形成
问题描述
我想弄清楚当我从 OV5647 Pi 相机 v1 创建 640x480 像素图像时发生了什么。
到目前为止,这是我的想法:
我们从宽高比为 4:3 的完整 FoV 2592x1944 像素分辨率开始。
现在 640x480 分辨率的图像也是 4:3 宽高比并基于全 FoV。
我们从分箱开始: | 宽度 | 身高 | |----|----| |2592|1944| |1296|972| |648|486|
例如 2592/2 = 1296;1296/2 = 648
1944/2 = 972;972/2=486
因此,在合并后,我们得到 648 x 486 的分辨率,但我们希望输出为 640 x 480,因此我们必须处理合并后图像上额外的 8 个水平像素和额外的 6 个垂直像素。
我的问题是在以下情况下创建输出图像帧实际上会发生什么:使用 raspivid 例如控制台命令记录 640 x 480 分辨率视频:
raspivid -o myvid.h264 -w 640 -h 480 -t 60000
如果可能的话,有人可以解释我使用 raspivid 和 OpenCV 4.0.0 创建的 640 x 480 图像的细微变化。图像的内容似乎有些不同,例如略有位移,但我不确定这是否是简单的位移,例如取自稍微不同的 FoV,或者是实际对 648x486 分箱图像执行缩放操作以生成 640x480 结果的输出之一,例如 I假设只完成了分箱和 FoV 裁剪,但实际缩放也是可能的,尤其是对于 opencv。使用 OpenCV 4.0.0 捕获相机图像的代码:
cv::VideoCapture* video_capture_cap_;
video_capture_cap_ = new cv::VideoCapture();
video_capture_cap_->open(0);
if (video_capture_cap_->isOpened()) {
video_capture_cap_->set(
cv::CAP_PROP_FRAME_WIDTH,
640);
video_capture_cap_->set(
cv::CAP_PROP_FRAME_HEIGHT,
480);
video_capture_cap_->set(
cv::CAP_PROP_FPS,
49);
解决方案
答案似乎如下:
raspivid -o myvid.h264 -w 640 -h 480 -t 60000
生成 .h264 格式的视频文件。
视频帧由 4x4 合并然后按比例生成。
由于输出为 640 x 480 帧,因此完成以下操作。
2592/2 = 1296;1296/2 = 648
1944/2 = 972;972/2=486
然后使用 (640.0/648.0) 的比例因子将 648 x 486 缩放到 640 x 480。
我不确定这是否与 raspivid 文档一致,这似乎暗示了相反的情况,例如从文档中我期望裁剪到正确的图像大小而不是缩放。然而,检查视频输出表明发生了缩放而不是裁剪。
方法是像上面那样拍摄相机校准棋盘格的视频。从视频中提取帧,并将棋盘格的大小和位置与通过 cv::VideoCapture 拍摄的相应图像进行比较。
来自 cv::VideoCapture 的图像按照 Christoph Rackwitz 的描述制定,例如
如上所述进行分箱以获得 648 x 486 图像,然后裁剪为所需的 640 x 480 图像尺寸。裁剪似乎采用中央 640 x 480 图像区域,例如 它删除 648 x 486 图像的前 3 行和后 3 行,并删除每行中的第一列和最后 4 列。
推荐阅读
- android - 在 android studio 中创建项目。它每次都会下载一些文件
- javascript - 当我们使用反应查询库时如何测试组件它正在询问 queryclient
- flutter - Flutter ios 应用程序在调用 ImagePicker.getImage() 时失去连接,没有错误
- vim - 如何在vim中将嵌套参数传递给fzf?
- spring-boot - java.lang.IllegalStateException:无法从“http://localhost:8888”加载配置数据
- c# - 直接在函数内部调用 OnPropertyChanged()
- cloud - Agora 云录制自定义布局不起作用
- python - 无法使用熊猫写入 csv
- python - 在将所述值分配给变量时更改列表值
- r - R中的传单:根据一层自动设置视图