设为首页收藏本站
授权版本:2024_07
开启左侧

3D点云显示问题

[复制链接]
醉梦甜心 发表于 2020-4-15 19:56:06 | 显示全部楼层 |阅读模式
Halcon有关于根据点云深度信息来个点云着色的示例吗?就是每个点云的颜色代表不同的深度。
类似于LMI,不同高度颜色不同。
图片1.png
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
绝地武士 发表于 2020-4-15 21:17:54 | 显示全部楼层
先导入附件包的LmiColorMap.dll,声明命名空间:
  1. using LmiColorMap;
复制代码

然后得到深度图形的buff缓存数组(pData就是图像指针,nWidth和nHeight分别是图像的宽度和高度)
  1. short[] buff = new short[nWidth * nHeight];
  2. Marshal.Copy(ptData, buff, 0, buff.Length);
复制代码

以后执行下面的转换:
  1. //获取灰度彩色值
  2. ushort[] ZValues = new ushort[buff.Length];
  3. for (int k = 0; k < buff.Length; k++)
  4. {
  5.      ZValues[k] = (ushort)(buff[k] - short.MinValue);
  6. }

  7. ColorMaps MapColor = new ColorMaps();
  8. ushort minValue = 0, maxValue = 0;
  9. MapColor.FindMinMaxForColor(ZValues, (UInt32)buff.Length, 0, ref minValue, ref maxValue);
  10. Color[] colors = new Color[buff.Length];
  11. MapColor.ToColors(ZValues, minValue, maxValue, 0, ref colors, (UInt32)buff.Length);

  12. int Width = (int)nWidth;
  13. int Height = (int)nHeight;

  14. Bitmap Bimage = new Bitmap(Width, Height);
  15. BitmapData bmdata = Bimage.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
  16. IntPtr intptr = bmdata.Scan0;
  17. byte[] Pixlemaps = new byte[bmdata.Width * bmdata.Height * 3];
  18. //int offset = bmdata.Width*3 - bmdata.Width * 3;

  19. unsafe
  20. {
  21.         byte* pp = (byte*)(void*)bmdata.Scan0;
  22.         for (int k = 0; k < bmdata.Height; k++)
  23.         {
  24.              for (int m = 0; m < bmdata.Width; m++)
  25.               {
  26.                       pp[0] = (byte)(colors[k * bmdata.Width + m].R);
  27.                       pp[1] = (byte)(colors[k * bmdata.Width + m].G);
  28.                       pp[2] = (byte)(colors[k * bmdata.Width + m].B);
  29.                       pp += 3;
  30.                 }
  31.                 //pp += bmdata.Width*3 - bmdata.Width * 3;
  32.           }
  33. }

  34. m_objImage.Dispose();
  35. HOperatorSet.GenImageInterleaved(out m_objImage, intptr, "rgb", Width, Height, 0, "byte", Width, Height, 0, 0, -1, 0);
  36. Bimage.UnlockBits(bmdata);
复制代码

我最下面是通过Halcon转换成rgb图的然后显示m_objImage即可,记得声明和初始化,当然你也用用其他的转换!
提醒:工程必须要勾选“允许不安全代码”,不然无法编译通过!
微信截图_20200415213631.png

LmiColorMap.rar (4.66 KB, 下载次数: 72)

奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 醉梦甜心 发表于 2020-4-16 17:53:23 | 显示全部楼层
绝地武士 发表于 2020-4-15 21:17
先导入附件包的LmiColorMap.dll,声明命名空间:

然后得到深度图形的buff缓存数组(pData就是图像指针,nWi ...

short[] buff = new short[nWidth * nHeight];
Marshal.Copy(ptData, buff, 0, buff.Length);

以short为数组时,Marshal.Copy会出现System.AccessViolationException:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”问题。我的深度图是8位的,
能给出
short[] buff = new short[nWidth * nHeight];
Marshal.Copy(ptData, buff, 0, buff.Length);
调用示例吗?

另外能给出public string ToColors(ushort[] ZValues, ushort minValue, ushort maxValue, ushort nullValue, ref Color[] colors, uint count);的思路或者源码吗?
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
Criss 发表于 2020-4-16 17:55:29 | 显示全部楼层
醉梦甜心 发表于 2020-4-16 17:53
short[] buff = new short[nWidth * nHeight];
Marshal.Copy(ptData, buff, 0, buff.Length);

深度图怎么可能是8位呢,8位最高深度值才255啊?如果是LMI默认是16位的就要用short,其他如果是32位的就要用int定义!
这个dll是LMI官方给的,源码我无法提供给你,原理就是计算最大最小深度值,然后按照颜色查找表颜色等分色彩和数值范围,依次设置RGB的颜色过度,最后产生RGB图,这个RGB图是单独产生的和深度图不一样!
此代码已经经过验证,LMI的深度图像转RGB图没有问题!
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 醉梦甜心 发表于 2020-4-16 18:19:17 | 显示全部楼层
绝地武士 发表于 2020-4-15 21:17
先导入附件包的LmiColorMap.dll,声明命名空间:

然后得到深度图形的buff缓存数组(pData就是图像指针,nWi ...

大佬好,我把short[]改成byte[]成功了,如果最终获得是彩色点云,而不仅仅是将深度灰度图变为彩色图,比如三维点云基于基准面低的位蓝色,比基准面高的为红色点云。也是颜色映射吗? MapColor.ToColors(ZValues, minValue, maxValue, 0, ref colors, (UInt32)buff.Length);
实现过程是?可以给出源码参考下。
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 醉梦甜心 发表于 2020-4-16 18:22:05 | 显示全部楼层
Criss 发表于 2020-4-16 17:55
深度图怎么可能是8位呢,8位最高深度值才255啊?如果是LMI默认是16位的就要用short,其他如果是32位的就要 ...

受教了。{:1_310:}
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
Criss 发表于 2020-4-16 18:52:46 | 显示全部楼层
醉梦甜心 发表于 2020-4-16 18:19
大佬好,我把short[]改成byte[]成功了,如果最终获得是彩色点云,而不仅仅是将深度灰度图变为彩色图,比如 ...

你可以改变颜色映射方向,无非就是RGB三个分量的方向和叠加!
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 醉梦甜心 发表于 2020-4-17 09:11:32 | 显示全部楼层
Criss 发表于 2020-4-16 18:52
你可以改变颜色映射方向,无非就是RGB三个分量的方向和叠加!

那LMI有关于根据点云深度信息,直接给点云上色的dll吗?
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
Criss 发表于 2020-4-17 09:49:08 | 显示全部楼层
醉梦甜心 发表于 2020-4-17 09:11
那LMI有关于根据点云深度信息,直接给点云上色的dll吗?

点云的目前我们用的是VTK的渲染方式,你可以试试!
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
tystq 发表于 2020-4-17 15:45:49 | 显示全部楼层
着色显示代码如下
visualize_object_model_3d(hv_ExpDefaultWinHandle, hv_ObjectModel3D, new HTuple(),
                    new HTuple(), new HTuple("lut", "disp_pose", "color_attrib"), new HTuple("temperature", "true", "coord_z"), new HTuple(), new HTuple(), new HTuple(),
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表