来自 OV5647 raspberry pi 相机 v1 的 640 x 480 成像

640 x 480 image formation from OV5647 raspberry pi camera v1

我想弄清楚当我从 OV5647 Pi 相机 v1 创建 640x480 像素图像时到底发生了什么。

这是我目前的想法:

我们从全 FoV 2592x1944 像素分辨率开始,宽高比为 4:3。

现在 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 个垂直像素。

我的问题是为以下情况创建输出图像帧时实际发生了什么: 640 x 480 分辨率的视频是用 raspivid 录制的,例如控制台命令:

raspivid -o myvid.h264 -w 640 -h 480 -t 60000

如果可能,有人可以解释我看到的使用 raspivid 和 OpenCV 4.0.0 创建的 640 x 480 图像的细微变化。图像的内容似乎有些不同,例如稍微移位,但我不确定这是否是简单的移位,例如从稍微不同的 FoV 中获取或者是实际对 648x486 合并图像执行缩放操作以生成 640x480 结果的输出之一,例如我假设只完成合并和 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 列和后 4 列。