OpenCV 拼接 RGB 和深度(英特尔实感)
OpenCV Stitching RGB and Depth (Intel RealSense)
我有一个同时使用 realsense2 和 opencv2 库的 C++ 应用程序。我正在从两台 D415 相机中提取深度和 RGB 帧。我可以毫无问题地拼接 RGB 帧;然而,经过大量研究后,我无法找到任何示例来说明如何复制从 RGB 帧拼接到深度帧的步骤。有谁知道如何将一个拼接作业(在我的例子中是 RGB)的拼接步骤复制到另一个拼接作业(在我的例子中是深度)?
我在此处查看了 Stitcher class 参考文档:https://docs.opencv.org/master/d2/d8d/classcv_1_1Stitcher.html
如果有人以前这样做过并且可以提供一些指导,那就太好了。
这是我用来拼接(缩短)的工作代码:
// Start a streaming pipeline for each connected camera
for (auto && device : context.query_devices())
{
string serial = device.get_info(RS2_CAMERA_INFO_SERIAL_NUMBER);
pipeline pipeline(context);
config config;
config.enable_device(serial);
config.enable_stream(RS2_STREAM_COLOR, 1280, 720, RS2_FORMAT_BGR8, 15);
config.enable_stream(RS2_STREAM_DEPTH, 1280, 720);
config.enable_stream(RS2_STREAM_INFRARED, 1);
pipeline.start(config);
pipelines.emplace_back(pipeline);
colorizers[serial] = colorizer();
}
map<int, frame> render_frames;
while(true)
{
vector<Mat> mats;
vector<frame> new_frames;
for (auto && pipeline : pipelines)
{
frameset frameset = pipeline.wait_for_frames();
if (frameset)
{
mats.push_back(frame_to_mat(frameset.get_color_frame()));
}
}
Mat stitchedImage;
Ptr<Stitcher> stitcher = Stitcher::create(Stitcher::PANORAMA);
Stitcher::Status stitcherStatus = stitcher->stitch(mats, stitchedImage);
if (stitcherStatus == Stitcher::OK)
{
imshow("Stitched Image", stitchedImage);
auto k = waitKey(200);
} else {
cout << "Error stitching image.\n";
}
}
谢谢!
如果忽略失真,则拼接只是计算从一个图像原点到另一个图像原点的变换。从技术上讲,您已经拥有了所需的一切。这是一个非常幼稚的方法。
在每个单独的相机中(在硬件规范中提供)有:
depth_origin -> rgb_origin
("->" represents a transform)
OpenCV 拼接器可以 estimate a transform 在两个 rgb 图像之间,所以你有
cam1_rgb_origin -> cam2_rgb_origin
所以你可以计算:
cam1_depth -> cam1_rgb -> cam2_rgb -> cam2_depth
你的方法有点不寻常,但它可能足够有效,因为相机规格在 realsense 文档中提供,而且我认为每个传感器都很好对齐。
不过有点警告:
一般来说,两个相机永远不会完全对齐。因此,对于更复杂的解决方案,我会避免使用通过图像拼接计算的变换。我宁愿校准静态支架上的相机以获得外部相机参数。这只是从相机坐标原点 1 到相机坐标原点 2 的 3D 变换。使用此变换,您将在包含两个相机点的统一坐标系中创建传感器数据的 3D 点云。最后,您可以从您选择的任何角度将此点云渲染为深度图像,并将 rgb 图像投影到它上面,使其适用于您想要使用的面部检测。相机校准可能是一件非常痛苦的事情,尤其是当相机的视角相交不多时。因此,只有在您的结果不充分时才采用这种精心设计的方法。
抱歉,由于时间关系,我无法详细介绍。但我希望这能为您指明正确的方向。
英特尔 SDK 提供单个相机的深度和平移矩阵。使用该矩阵,您可以对齐深度和 rgb 数据。
对于多摄像头,校准多个摄像头并不像我们想象的那么容易。 Intel推荐"vicalib"软件,你可以试试。
我有一个同时使用 realsense2 和 opencv2 库的 C++ 应用程序。我正在从两台 D415 相机中提取深度和 RGB 帧。我可以毫无问题地拼接 RGB 帧;然而,经过大量研究后,我无法找到任何示例来说明如何复制从 RGB 帧拼接到深度帧的步骤。有谁知道如何将一个拼接作业(在我的例子中是 RGB)的拼接步骤复制到另一个拼接作业(在我的例子中是深度)?
我在此处查看了 Stitcher class 参考文档:https://docs.opencv.org/master/d2/d8d/classcv_1_1Stitcher.html
如果有人以前这样做过并且可以提供一些指导,那就太好了。
这是我用来拼接(缩短)的工作代码:
// Start a streaming pipeline for each connected camera
for (auto && device : context.query_devices())
{
string serial = device.get_info(RS2_CAMERA_INFO_SERIAL_NUMBER);
pipeline pipeline(context);
config config;
config.enable_device(serial);
config.enable_stream(RS2_STREAM_COLOR, 1280, 720, RS2_FORMAT_BGR8, 15);
config.enable_stream(RS2_STREAM_DEPTH, 1280, 720);
config.enable_stream(RS2_STREAM_INFRARED, 1);
pipeline.start(config);
pipelines.emplace_back(pipeline);
colorizers[serial] = colorizer();
}
map<int, frame> render_frames;
while(true)
{
vector<Mat> mats;
vector<frame> new_frames;
for (auto && pipeline : pipelines)
{
frameset frameset = pipeline.wait_for_frames();
if (frameset)
{
mats.push_back(frame_to_mat(frameset.get_color_frame()));
}
}
Mat stitchedImage;
Ptr<Stitcher> stitcher = Stitcher::create(Stitcher::PANORAMA);
Stitcher::Status stitcherStatus = stitcher->stitch(mats, stitchedImage);
if (stitcherStatus == Stitcher::OK)
{
imshow("Stitched Image", stitchedImage);
auto k = waitKey(200);
} else {
cout << "Error stitching image.\n";
}
}
谢谢!
如果忽略失真,则拼接只是计算从一个图像原点到另一个图像原点的变换。从技术上讲,您已经拥有了所需的一切。这是一个非常幼稚的方法。
在每个单独的相机中(在硬件规范中提供)有:
depth_origin -> rgb_origin
("->" represents a transform)
OpenCV 拼接器可以 estimate a transform 在两个 rgb 图像之间,所以你有
cam1_rgb_origin -> cam2_rgb_origin
所以你可以计算:
cam1_depth -> cam1_rgb -> cam2_rgb -> cam2_depth
你的方法有点不寻常,但它可能足够有效,因为相机规格在 realsense 文档中提供,而且我认为每个传感器都很好对齐。
不过有点警告:
一般来说,两个相机永远不会完全对齐。因此,对于更复杂的解决方案,我会避免使用通过图像拼接计算的变换。我宁愿校准静态支架上的相机以获得外部相机参数。这只是从相机坐标原点 1 到相机坐标原点 2 的 3D 变换。使用此变换,您将在包含两个相机点的统一坐标系中创建传感器数据的 3D 点云。最后,您可以从您选择的任何角度将此点云渲染为深度图像,并将 rgb 图像投影到它上面,使其适用于您想要使用的面部检测。相机校准可能是一件非常痛苦的事情,尤其是当相机的视角相交不多时。因此,只有在您的结果不充分时才采用这种精心设计的方法。
抱歉,由于时间关系,我无法详细介绍。但我希望这能为您指明正确的方向。
英特尔 SDK 提供单个相机的深度和平移矩阵。使用该矩阵,您可以对齐深度和 rgb 数据。
对于多摄像头,校准多个摄像头并不像我们想象的那么容易。 Intel推荐"vicalib"软件,你可以试试。