gpt4 book ai didi

c++ - 如何为点云赋予纹理?

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:52 25 4
gpt4 key购买 nike

我有一张使用 OpenCV 获得的视差图像。我能够使用 OpenGL 和 CUDA 显示一个 640 x 360 的点网格,并为每个点赋予一个对应于视差值的 Z 值。结果:

screenshot

现在我想为点云中的每个点赋予一个颜色值,该颜色值对应于具有相同尺寸 (640 x 380) 的立体相机左侧图像中的像素。

这是我的 CUDA 内核和调用函数,其中我有两个图像、视差和包含颜色信息的左图像(灰度):

__global__ void simple_vbo_kernel(float4 *pos, unsigned int width, unsigned int height, float time,
uchar* disp, int stepDisp)
{
const int x = threadIdx.x + blockIdx.x * blockDim.x;
const int y = threadIdx.y + blockIdx.y * blockDim.y;
if ((x < width) && (y < height))
{

float u = x / (float) width;
float v = y / (float) height;
u = u*2.0f - 1.0f;
v = v*2.0f - 1.0f;

const int depth = y * stepDisp + x;
float w = static_cast<float>(disp[depth]);
w/=10;

pos[y*width+x] = make_float4(u, w, v, 1.0f);
}

}

extern "C"
void launch_kernel(dim3 grid, dim3 block, float4 *pos, unsigned int mesh_width,unsigned int mesh_height,
float time, cv::Mat disp, cv::Mat left)
{
if(!disp.empty() && !left.empty()){

uchar* d_image;
int dsize = disp.rows * disp.step;
cudaMalloc((void**)&d_image, dsize);
cudaMemcpy(d_image, disp.ptr(), dsize, cudaMemcpyHostToDevice);

simple_vbo_kernel<<< grid, block>>>(pos, mesh_width, mesh_height, time, d_image, disp.step);
cudaDeviceSynchronize();
cudaFree(d_image);
}
}

我的问题是,为点云中的点赋予纹理或颜色的最简单方法是什么,在这种情况下使用 cv::Mat left?我已经从 CUDA 样本中看到了一些其他示例,但我没有找到如何去做。

最佳答案

对于稀疏点云(如您的点云),通常最好的做法是向顶点添加颜色属性并为其分配所需的颜色。使绘图着色器将该属性的值传递给发出的片段颜色。

关于c++ - 如何为点云赋予纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30204378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com