Halcon3D 點雲染色(蒙皮)


根據halcon例程 Moments_Object_Model_3D

可以設置“lut”,“color_attrib”等參數來使點雲根據某個方向上的尺度顯示ColorSpace里的顏色

* Set visualization parameters for the 3d object model
* A lookup table (lut) is set that transforms attribute values into
* a color. In this example the color encodes the value of the
* z-component of the data. The alpha parameter defines the
* transparency of the object model.
GenParamName := ['lut','color_attrib','light_position','disp_pose','alpha']
GenParamValue := ['color1','coord_z','0.0 0.0 -0.3 1.0','true',0.9]

 

同樣,可以使用

xyz_attrib_to_object_model_3d

這個算子 在生成點雲的時候,添加亮度圖進3D模型中

xyz_attrib_to_object_model_3d (X, Y, Z, ImageRGB, ['&red', '&green', '&blue'], ObjectModel3D)
prepare_object_model_3d (ObjectModel3D, 'segmentation', 'true', [], [])
visualize_object_model_3d (WindowHandle, ObjectModel3D, [], [], ['red_channel_attrib', 'green_channel_attrib', 'blue_channel_attrib'], ['&red', '&green', '&blue'], [], [], [], PoseOut)

生成的Object 3D 包含了一張單通道的灰度圖


 可以通過Intensity參數來顯示 亮度圖

 

GenParamName := ['light_position','disp_pose','alpha','intensity','point_size']
GenParamValue := ['0.0 0.0 -0.3 1.0','true',0.9,'&gray',1]
sample_object_model_3d (ObjectModel3D, 'fast', 0.05, [], [], SampledObjectModel3D)
visualize_object_model_3d (WindowHandle, SampledObjectModel3D, [], [], GenParamName, GenParamValue, [], [], [], PoseOut)

在.NET中 略微有些區別,因為 xyz_attrib_to_object_model_3d 這是個halcon函數,並不是一算子;

仔細看了看這個函數,發現以前很多語句都是防呆的,比較重要的語句就是:

 

 

 所以換到NET中的代碼 則為

                PCObjectModel3D.XyzToObjectModel3d(X,Y,DeepImage);
                //使用亮度圖着色 
                HRegion DomainRegion = IntensityImage.GetDomain();
                HTuple Rows, Cols;
                DomainRegion.GetRegionPoints(out Rows,out Cols);
                double[] val =  IntensityImage.GetGrayval(Rows, Cols);
                PCObjectModel3D.SetObjectModel3dAttribMod("&gray","points", val);
                InfoWindow.ShowMessage("亮度圖着色 完成");

根據以上步驟:

生成點雲 並根據Z方向渲染顏色 顯示

 

 

 而需要貼上亮度圖顯示的話,可以在顯示參數中加上'intensity'-'&gray'這對參數(詳細代碼在上面已經貼出來了)

 

 

 

根據上面對比可以看出,根據Z方向着色可以很好的看出高度差異,但是產品表面的紋路看不清;

而貼圖是亮度圖的話 可以很好的看出產品表面的反光情況,但是高度上不明顯 不直觀;

根據Keyence提供的halcon代碼,有一個折中的辦法:

*將產品的高度信息 轉換成HSV顏色通道中的H通道 色調

*手動創建一張單通道圖 作為飽和度通道 S通道

*將亮度圖 作為 明度通道 V通道

*將HSV圖片轉成RGB圖片 並把RGB三個通道分別添加到模型中去

           double min_Color = 255;
            double max_Color = 0;
            double gray_mix_percent = 0.7;

            double DeepMin = 0;
            double DeepMax = 30;

            double Convert_K = (max_Color - min_Color) / (DeepMax - DeepMin);
            double Convert_B = min_Color - Convert_K * DeepMin;

            HImage HSV_H = DeepImage.ScaleImage(Convert_K, Convert_B);
            HSV_H = HSV_H.ConvertImageType("byte");
            //HSV_H.WriteImage("tiff",0,"D:\\TImage.tiff");

            //HRegion ZeroRegion = IntensityImage.Threshold(0.0, 0.0);
            //HRegion FullRegion = IntensityImage.GetDomain();
            //HRegion ResultRegion = FullRegion.Difference(ZeroRegion);

            //HImage IntensityBlobImage = IntensityImage.ReduceDomain(ResultRegion);
            HImage HSV_V = IntensityImage.ScaleImage(gray_mix_percent, 255 * (1 - gray_mix_percent));
            //HSV_V.WriteImage("tiff", 0, "D:\\TImageIntensity.tiff");

            int Imagewidth, imageheight;
            IntensityImage.GetImageSize(out Imagewidth,out imageheight);

            double Saturation = (1 - gray_mix_percent) * 512;
            HImage HSV_S = new HImage();
            HSV_S.GenImageSurfaceFirstOrder("byte",0,0, Saturation,0,0, Imagewidth, imageheight);

            HImage ChannelRed =  HSV_H.TransToRgb(HSV_S,HSV_V,out HImage ChannelGreen,out HImage ChannelBlue,"hsv");
            RainBowImage =  ChannelRed.Compose3(ChannelGreen, ChannelBlue);
                //使用彩虹圖着色
                HImage Cred =  RainBowImage.AccessChannel(1);
                HRegion DomainRegion = Cred.GetDomain();
                HTuple Rows, Cols;
                DomainRegion.GetRegionPoints(out Rows, out Cols);
                double[] val = Cred.GetGrayval(Rows, Cols);
                PCObjectModel3D.SetObjectModel3dAttribMod("&red", "points", val);

                HImage Cgreen = RainBowImage.AccessChannel(2);
                val = Cgreen.GetGrayval(Rows, Cols);
                PCObjectModel3D.SetObjectModel3dAttribMod("&green", "points", val);

                HImage Cblue = RainBowImage.AccessChannel(3);
                val = Cblue.GetGrayval(Rows, Cols);
                PCObjectModel3D.SetObjectModel3dAttribMod("&blue", "points", val);
                InfoWindow.ShowMessage("彩虹圖着色 完成");
                //彩虹圖着色顯示
                HTuple paraname = new HTuple( "disp_pose", "alpha", "point_size", "disp_normals", "red_channel_attrib", "green_channel_attrib", "blue_channel_attrib");
                HTuple paraValue = new HTuple("true", 1, 1, "false","&red", "&green", "&blue");

 

彩虹圖效果,調整飽和度通道,可以顯示更偏明度通道一些還是更偏色調通道一些。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM