先导入附件包的LmiColorMap.dll,声明命名空间:
然后得到深度图形的buff缓存数组(pData就是图像指针,nWidth和nHeight分别是图像的宽度和高度)
- short[] buff = new short[nWidth * nHeight];
- Marshal.Copy(ptData, buff, 0, buff.Length);
复制代码
以后执行下面的转换:
- //获取灰度彩色值
- ushort[] ZValues = new ushort[buff.Length];
- for (int k = 0; k < buff.Length; k++)
- {
- ZValues[k] = (ushort)(buff[k] - short.MinValue);
- }
- ColorMaps MapColor = new ColorMaps();
- ushort minValue = 0, maxValue = 0;
- MapColor.FindMinMaxForColor(ZValues, (UInt32)buff.Length, 0, ref minValue, ref maxValue);
- Color[] colors = new Color[buff.Length];
- MapColor.ToColors(ZValues, minValue, maxValue, 0, ref colors, (UInt32)buff.Length);
- int Width = (int)nWidth;
- int Height = (int)nHeight;
- Bitmap Bimage = new Bitmap(Width, Height);
- BitmapData bmdata = Bimage.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
- IntPtr intptr = bmdata.Scan0;
- byte[] Pixlemaps = new byte[bmdata.Width * bmdata.Height * 3];
- //int offset = bmdata.Width*3 - bmdata.Width * 3;
- unsafe
- {
- byte* pp = (byte*)(void*)bmdata.Scan0;
- for (int k = 0; k < bmdata.Height; k++)
- {
- for (int m = 0; m < bmdata.Width; m++)
- {
- pp[0] = (byte)(colors[k * bmdata.Width + m].R);
- pp[1] = (byte)(colors[k * bmdata.Width + m].G);
- pp[2] = (byte)(colors[k * bmdata.Width + m].B);
- pp += 3;
- }
- //pp += bmdata.Width*3 - bmdata.Width * 3;
- }
- }
- m_objImage.Dispose();
- HOperatorSet.GenImageInterleaved(out m_objImage, intptr, "rgb", Width, Height, 0, "byte", Width, Height, 0, 0, -1, 0);
- Bimage.UnlockBits(bmdata);
复制代码
我最下面是通过Halcon转换成rgb图的然后显示m_objImage即可,记得声明和初始化,当然你也用用其他的转换!
提醒:工程必须要勾选“允许不安全代码”,不然无法编译通过!
LmiColorMap.rar
(4.66 KB, 下载次数: 72)
|