java图片类取rgb不准确,对齐已经捕获的rgb和深度图像

prologue

这个答案基于我以前的答案:

我手动裁剪您的输入图像,所以我分离颜色和深度图像(因为我的程序需要它们分开 . 这可能会导致较小的偏移量变化几个像素 . 另外因为我没有深度(深度图像是 8bit 仅由于灰度 RGB )然后我使用的深度精度非常差,请参阅:

fKhaw.png

所以我的结果受到所有这些负面影响 . 无论如何,这是你需要做的:

determine FOV for both images

因此,在两个图像上都可以看到一些可测量的特征 . 尺寸越大,结果越准确 . 例如,我选择这些:

hI3vW.png

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 初始化和相机设置等 . 这里是未对齐的结果:

6vHfZ.png

align it

如果您注意到我将 ofsx,ofsy 变量添加到 copy_images() . 这是相机之间的偏移 . 我通过 1 像素在箭头按键上更改它们,然后调用 copy_images 并渲染结果 . 这样我就可以非常快速地手动找到偏移:

hUETn.png

如您所见,偏移在x轴上为 +17 像素,在y轴上为 +4 像素 . 这里侧视图可以更好地看到深度:

LQBoc.png

希望它有点帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值