来自 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 列。
我想弄清楚当我从 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 列。