我试图使用MATLAB将两个图像 - 一个rgb和另一个深度对齐 . 请注意,我已经为此检查了几个地方 - 例如需要kinect设备的here,here和here here,其中说校准需要相机参数 . 我还建议使用EPIPOLAR GEOMETRY来匹配这两个图像,虽然我不知道如何 . 我所指的数据集在rgb-d-t face dataset中给出 . 下面举例说明一个这样的例子:
已经提供了基本上意味着指定感兴趣的面部区域的边界框的基本事实,并且我仅使用它们来裁剪面部区域 . matlab代码如下所示:
I = imread('1.jpg');
I1 = imcrop(I,[218,198,158,122]);
I2 = imcrop(I,[243,209,140,108]);
figure, subplot(1,2,1),imshow(I1);
subplot(1,2,2),imshow(I2);
两个裁剪的图像rgb和深度如下所示:
有什么方法可以注册/分配图像 . 我从here中获取了提示,其中基本的sobel算子已用于rgb和深度图像以生成边缘图,然后需要生成关键点以用于匹配目的 . 这里生成两个图像的边缘图 .
.
然而它们是如此嘈杂,以至于我认为我们不能为这些图像进行关键点匹配 .
Can anybody suggest some algorithms in matlab to do the same ?
2 回答
prologue
这个答案基于我以前的答案:
我手动裁剪您的输入图像,所以我分离颜色和深度图像(因为我的程序需要它们分开 . 这可能会导致较小的偏移量变化几个像素 . 另外因为我没有深度(深度图像是
8bit
仅由于灰度 RGB )然后我使用的深度精度非常差,请参阅:所以我的结果受到所有这些负面影响 . 无论如何,这是你需要做的:
因此,在两个图像上都可以看到一些可测量的特征 . 尺寸越大,结果越准确 . 例如,我选择这些:
我使用深度图像作为参考,所以我的点 Cloud 在 FOV . 由于我没有距离而是
8bit
值,而是通过乘以常数将其转换为某个距离 . 所以我扫描整个深度图像,对于每个像素,我在点 Cloud 阵列中创建点 . 然后将dept像素坐标转换为彩色图像 FOV 并复制其颜色 . 像这样(在 C++ ):其中
**xyz
是我的点 Cloud 2D阵列分配的深度图像分辨率 .picture
是 DIP 的图像类,所以这里有一些相关成员:xs,ys
是以像素为单位的图像分辨率p[ys][xs]
是图像直接像素访问作为DWORD dd; BYTE db[4];
的并集,所以我可以分别访问单个32位变量或每个颜色通道的颜色 .rgb2bgr(DWORD col)
只需将颜色通道从 RGB 重新排序到 BGR .render it
我使用 OpenGL 这样代码:
您需要添加粗略的 OpenGL 初始化和相机设置等 . 这里是未对齐的结果:
如果您注意到我将
ofsx,ofsy
变量添加到copy_images()
. 这是相机之间的偏移 . 我通过1
像素在箭头按键上更改它们,然后调用copy_images
并渲染结果 . 这样我就可以非常快速地手动找到偏移:如您所见,偏移在x轴上为
+17
像素,在y轴上为+4
像素 . 这里侧视图可以更好地看到深度:希望它有点帮助
好吧,我在阅读了很多博客之后尝试过这样做 . 我仍然不确定我是否正确 . 如果发现有问题,请随时发表评论 . 为此,我使用了一个mathworks fex提交,可以在这里找到:ginputc function .
matlab代码如下:
第1步
我使用sobel边缘检测器来提取深度和rgb图像的边缘,然后使用阈值来获得边缘图 . 我将主要使用梯度幅度 . 这给了我两个图像:
第2步
接下来,我使用
ginput
或ginputc
函数标记两个图像上的关键点 . 点之间的对应关系是由我预先确定的 . 我尝试使用SURF
功能,但它们在深度图像上效果不佳 .第3步
使用
estimategeometrictransform
获取转换矩阵tform
然后使用此矩阵恢复移动图像的原始位置 . 下一组图片讲述了这个故事 .当然,如果更明智地完成任一图像中的关键点选择,我仍然相信结果可以进一步改善 . 我也认为@Specktre方法更好 . 我只是注意到我在答案中使用了一个单独的图像对,而不是问题 . 两个图像都来自同一个数据集vap rgb-d-t dataset .