设为首页收藏本站 距【华南国际工业博览会】宝安新馆开幕 : :

Halcon视觉之家 - 51Halcon专注于机器视觉技术

 找回密码
 会员注册

QQ登录

只需一步,快速开始

扫一扫,微信登录

查看: 3904|回复: 23

[待解决] 3D点云显示问题

[复制链接]
  • TA的每日心情

    2021-2-23 17:05
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    6

    主题

    22

    帖子

    395

    积分

    Rank: 6Rank: 6

    积分
    395

    切换助手验证会员

    发表于 2020-4-15 19:56:06 | 显示全部楼层 |阅读模式

    51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

    您需要 登录 才可以下载或查看,没有帐号?会员注册

    x
    Halcon有关于根据点云深度信息来个点云着色的示例吗?就是每个点云的颜色代表不同的深度。类似于LMI。不同高度颜色不同。
    图片1.png
  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 845 天

    连续签到: 2 天

    [LV.10]以坛为家III

    185

    主题

    910

    帖子

    5432

    积分

    Rank: 9

    积分
    5432

    热心会员突出贡献切换助手验证会员最佳新人

    发表于 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, 下载次数: 43)

  • TA的每日心情

    2021-2-23 17:05
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    6

    主题

    22

    帖子

    395

    积分

    Rank: 6Rank: 6

    积分
    395

    切换助手验证会员

     楼主| 发表于 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);的思路或者源码吗?
  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1237 天

    连续签到: 2 天

    [LV.10]以坛为家III

    415

    主题

    1714

    帖子

    6040

    积分

    Rank: 9

    积分
    6040

    突出贡献优秀版主荣誉管理论坛元老切换助手验证会员最佳新人

    发表于 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图没有问题!
    无效附件更新 权限提升操作 删帖申请 举报以及其他需要帮助请加入QQ群:214663141 广告位招商 有意者联系
  • TA的每日心情

    2021-2-23 17:05
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    6

    主题

    22

    帖子

    395

    积分

    Rank: 6Rank: 6

    积分
    395

    切换助手验证会员

     楼主| 发表于 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);
    实现过程是?可以给出源码参考下。
  • TA的每日心情

    2021-2-23 17:05
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    6

    主题

    22

    帖子

    395

    积分

    Rank: 6Rank: 6

    积分
    395

    切换助手验证会员

     楼主| 发表于 2020-4-16 18:22:05 | 显示全部楼层
    Criss 发表于 2020-4-16 17:55
    深度图怎么可能是8位呢,8位最高深度值才255啊?如果是LMI默认是16位的就要用short,其他如果是32位的就要 ...

    受教了。
  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1237 天

    连续签到: 2 天

    [LV.10]以坛为家III

    415

    主题

    1714

    帖子

    6040

    积分

    Rank: 9

    积分
    6040

    突出贡献优秀版主荣誉管理论坛元老切换助手验证会员最佳新人

    发表于 2020-4-16 18:52:46 | 显示全部楼层
    醉梦甜心 发表于 2020-4-16 18:19
    大佬好,我把short[]改成byte[]成功了,如果最终获得是彩色点云,而不仅仅是将深度灰度图变为彩色图,比如 ...

    你可以改变颜色映射方向,无非就是RGB三个分量的方向和叠加!
    无效附件更新 权限提升操作 删帖申请 举报以及其他需要帮助请加入QQ群:214663141 广告位招商 有意者联系
  • TA的每日心情

    2021-2-23 17:05
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    6

    主题

    22

    帖子

    395

    积分

    Rank: 6Rank: 6

    积分
    395

    切换助手验证会员

     楼主| 发表于 2020-4-17 09:11:32 | 显示全部楼层
    Criss 发表于 2020-4-16 18:52
    你可以改变颜色映射方向,无非就是RGB三个分量的方向和叠加!

    那LMI有关于根据点云深度信息,直接给点云上色的dll吗?
  • TA的每日心情
    开心
    8 小时前
  • 签到天数: 1237 天

    连续签到: 2 天

    [LV.10]以坛为家III

    415

    主题

    1714

    帖子

    6040

    积分

    Rank: 9

    积分
    6040

    突出贡献优秀版主荣誉管理论坛元老切换助手验证会员最佳新人

    发表于 2020-4-17 09:49:08 | 显示全部楼层
    醉梦甜心 发表于 2020-4-17 09:11
    那LMI有关于根据点云深度信息,直接给点云上色的dll吗?

    点云的目前我们用的是VTK的渲染方式,你可以试试!
    无效附件更新 权限提升操作 删帖申请 举报以及其他需要帮助请加入QQ群:214663141 广告位招商 有意者联系
  • TA的每日心情

    2020-11-26 16:08
  • 签到天数: 37 天

    连续签到: 1 天

    [LV.5]常住居民I

    3

    主题

    42

    帖子

    104

    积分

    Rank: 1

    积分
    104
    发表于 2020-4-17 15:36:26 | 显示全部楼层
    看我下面的帖子,C#加halcon实现3D点云
    http://www.ihalcon.com/read-13017.html
    您需要登录后才可以回帖 登录 | 会员注册

    本版积分规则

    视觉培训招生

    建议您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流浏览器浏览本网站

    51Halcon会员技术交流会员技术交流 | 51Halcon官方客服咨询官方客服咨询 | Halcon切换助手使用反馈切换助手使用

    算子查询| 申请友链| 小黑屋| 手机版| Archiver|

    © 2015-2021 51Halcon机器视觉  X3.4  粤ICP备15095995号 粤公网安备44030602000670号

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