首页 > 解决方案 > 来自 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);

标签: opencvimage-processingraspberry-picamera

解决方案


答案似乎如下:

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 列。


推荐阅读