prologue
这个答案基于我以前的答案:
我手动裁剪您的输入图像,所以我分离颜色和深度图像(因为我的程序需要它们分开 . 这可能会导致较小的偏移量变化几个像素 . 另外因为我没有深度(深度图像是 8bit 仅由于灰度 RGB )然后我使用的深度精度非常差,请参阅:
所以我的结果受到所有这些负面影响 . 无论如何,这是你需要做的:
determine FOV for both images
因此,在两个图像上都可以看到一些可测量的特征 . 尺寸越大,结果越准确 . 例如,我选择这些:
form a point cloud or mesh
我使用深度图像作为参考,所以我的点 Cloud 在 FOV . 由于我没有距离而是 8bit 值,而是通过乘以常数将其转换为某个距离 . 所以我扫描整个深度图像,对于每个像素,我在点 Cloud 阵列中创建点 . 然后将dept像素坐标转换为彩色图像 FOV 并复制其颜色 . 像这样(在 C++ ):
picture rgb,zed; // your input images
struct pnt3d { float pos[3]; DWORD rgb; pnt3d(){}; pnt3d(pnt3d& a){ *this=a; }; ~pnt3d(){}; pnt3d* operator = (const pnt3d *a) { *this=*a; return this; }; /*pnt3d* operator = (const pnt3d &a) { ...copy... return this; };*/ };
pnt3d **xyz=NULL; int xs,ys,ofsx=0,ofsy=0;
void copy_images()
{
int x,y,x0,y0;
float xx,yy;
pnt3d *p;
for (y=0;y
for (x=0;x
{
p=&xyz[y][x];
// copy point from depth image
p->pos[0]=2.000*((float(x)/float(xs))-0.5);
p->pos[1]=2.000*((float(y)/float(ys))-0.5)*(float(ys)/float(xs));
p->pos[2]=10.0*float(DWORD(zed.p[y][x].db[0]))/255.0;
// convert dept image x,y to color image space (FOV correction)
xx=float(x)-(0.5*float(xs));
yy=float(y)-(0.5*float(ys));
xx*=98.0/108.0;
yy*=106.0/119.0;
xx+=0.5*float(rgb.xs);
yy+=0.5*float(rgb.ys);
x0=xx; x0+=ofsx;
y0=yy; y0+=ofsy;
// copy color from rgb image if in range
p->rgb=0x00000000; // black
if ((x0>=0)&&(x0
if ((y0>=0)&&(y0
p->rgb=rgb2bgr(rgb.p[y0][x0].dd); // OpenGL has reverse RGBorder then my image
}
}
其中 **xyz 是我的点 Cloud 2D阵列分配的深度图像分辨率 . picture 是 DIP 的图像类,所以这里有一些相关成员:
xs,ys 是以像素为单位的图像分辨率
p[ys][xs] 是图像直接像素访问作为 DWORD dd; BYTE db[4]; 的并集,所以我可以分别访问单个32位变量或每个颜色通道的颜色 .
rgb2bgr(DWORD col) 只需将颜色通道从 RGB 重新排序到 BGR .
render it
我使用 OpenGL 这样代码:
glBegin(GL_QUADS);
for (int y0=0,y1=1;y1
for (int x0=0,x1=1;x1
{
float z,z0,z1;
z=xyz[y0][x0].pos[2]; z0=z; z1=z0;
z=xyz[y0][x1].pos[2]; if (z0>z) z0=z; if (z1
z=xyz[y1][x0].pos[2]; if (z0>z) z0=z; if (z1
z=xyz[y1][x1].pos[2]; if (z0>z) z0=z; if (z1
if (z0 <=0.01) continue;
if (z1 >=3.90) continue; // 3.972 pre vsetko nad .=3.95m a 4.000 ak nechyti vobec nic
if (z1-z0>=0.10) continue;
glColor4ubv((BYTE* )&xyz[y0][x0].rgb);
glVertex3fv((float*)&xyz[y0][x0].pos);
glColor4ubv((BYTE* )&xyz[y0][x1].rgb);
glVertex3fv((float*)&xyz[y0][x1].pos);
glColor4ubv((BYTE* )&xyz[y1][x1].rgb);
glVertex3fv((float*)&xyz[y1][x1].pos);
glColor4ubv((BYTE* )&xyz[y1][x0].rgb);
glVertex3fv((float*)&xyz[y1][x0].pos);
}
glEnd();
您需要添加粗略的 OpenGL 初始化和相机设置等 . 这里是未对齐的结果:
align it
如果您注意到我将 ofsx,ofsy 变量添加到 copy_images() . 这是相机之间的偏移 . 我通过 1 像素在箭头按键上更改它们,然后调用 copy_images 并渲染结果 . 这样我就可以非常快速地手动找到偏移:
如您所见,偏移在x轴上为 +17 像素,在y轴上为 +4 像素 . 这里侧视图可以更好地看到深度:
希望它有点帮助