C#/halcon联合编程 三维点云数据可视化(ActiViz实现)

前言(已有方案的问题)

由于甲方需要,最近开始做的一个项目的框架旋转的是C#/halcon联合编程进行的,主要设计一些三维ocr、三维缺陷检测等等。之前类似的项目框架选的是C++/Qt/PCL/vtk,突然这么一变,还是有些不适应,在第一步点云可视化就被难倒了。
在超人视觉的罗超老师的视频中找到了一种解决方案,主要思路是:
1.将halcon的算子visualize_object_model_3d导成C#代码。
2.在winform组件里拖入一个PictureBox。
3.在C#代码里将hv_ObjectModel3D点云句柄(可由要从其他数据格式想halcon的数据格式转换)代入到visualize_object_model_3d算子得到halcon_window的窗口句柄。
4.定义halcon_window窗口的位置与PictureBox一致。完成。
这样做的问题在于HDevelop的窗口显示并不美观,交互做的确实不好,用起来不爽。另外很要命的一点是,halcon_window是阻塞式的,就是代码停在这一步才能进行交互,按右下角的continue按程序往下走之后就不能了。

不过对这个方案有兴趣的同学可以私信,我这里有相应的教程。

解决方案介绍

这里隆重推荐一款可视化库ActiViz(C#版VTK),三维计算机图形学、图像处理和可视化的开源库。安装简单,功能强大,可以说是非常优秀了。下面我详细介绍一下其安装和使用方案。

安装与环境配置

VS、Halcon等的安装这里就不赘述了,网上一大堆文章。这里以VS2017为例子进行ActiViz的安装介绍。
首先新建一个C#的windows窗体应用项目。然后配置上halcon环境(引用和工具箱里分别里面添加halcondotnet.dll即可)

点击 工具-NuGut包管理器-解决方案的NuGut程序包
在这里插入图片描述
在NuGut解决方案中选择浏览想,输入ActiViz搜索,得到很多版本的ActiViz,选择最新版本且适合自己电脑位数的版本,勾选项目,然后点击右边的安装:
在这里插入图片描述

到这里其实已经安装完成了。可以运行一下是否可以通过,如果出现报错,很有可能是版本位数不匹配的问题(尤其是安装64位ActiViz很有可能出现这个情况)。解决方案是右键启动项,选择属性:
在这里插入图片描述
在生产里务必将 首选 32 位 取消勾选。
在这里插入图片描述
再运行下,应该是没有问题了。
不过这个时候可能会遇到一个比较蛋疼想问题(有的人可能没遇到)。就是在工具栏里拖入RenderWindowCintrol的时候报错,然后组件就没有了。
Alt
在这里插入图片描述
不过这个并不会影响使用。可以在代码里定义RenderWindowCintrol的对象。

实现一个demo

拖入一个Panel空间,在Form中调整好它的大小(一会的窗口就是附着在其上的)。
在这里插入图片描述
然后在Form类下定义RenderWindowControl空间

private RenderWindowControl renderwindowcontrol1;

然后在Form1_Load函数(或者直接在Form1的构造函数中)开辟renderwindowcontrol1的内存空间,将其与panel1结合。

private void Form1_Load(object sender, EventArgs e)
        {
            renderwindowcontrol1 = new RenderWindowControl();
            renderwindowcontrol1.Dock = System.Windows.Forms.DockStyle.Fill;
            renderwindowcontrol1.Location = new System.Drawing.Point(0, 0);
            renderwindowcontrol1.Name = "renderwindowControl1";
            renderwindowcontrol1.Size = new System.Drawing.Size(100, 100);
            renderwindowcontrol1.TabIndex = 0;
            renderwindowcontrol1.TestText = null;
            //renderwindowcontrol1.BackColor = System.Drawing.Color.FromName("MediumSeaGreen");
            // 将控件添加进Pane1
            panel1.Controls.Add(renderwindowcontrol1);

            renderWindow = renderwindowcontrol1.RenderWindow;
            renderer = renderWindow.GetRenderers().GetFirstRenderer();
            renderer.SetBackground(0.2, 0.3, 0.4);
        }

运行可看到一个蓝色窗口(因为将背景颜色设置为(0.2,0.3,0.4)了)。
在这里插入图片描述

找个点云,可视化它!

为了配合halcon,在这里的实现我选择了om3格式的点云数据,需要的同学可以私信,我这找到的是罗超老师分享的一个文件。
主要思想是,利用halcon的ReadObjectModel3d算子来读取点云至hv_ObjectModel3D句柄中。然后自定义h2v_cloud()函数实现hv_ObjectModel3D数据类型向vtkPoints的转换。进而将vtkPoints points传入
自定义的show_cloud()实现点云显示。

主要的代码如下,可以根据自己的需要稍作修改。

 private void button1_Click(object sender, EventArgs e)
        {
            hv_ObjectModel3D = new HTuple();
            hv_Status = new HTuple();

            HTuple hv_x = new HTuple(); HTuple hv_y = new HTuple(); HTuple hv_z = new HTuple();
            HTuple hv_num = new HTuple();
            //加载点云
            HOperatorSet.ReadObjectModel3d("D:/2023工作/基于机器视觉的轮胎表面缺陷检测/轮胎模型/2020-01-10-235331.om3",
          "mm", new HTuple(), new HTuple(), out hv_ObjectModel3D, out hv_Status);


            vtkPoints points = h2v_cloud(hv_ObjectModel3D);
            show_cloud(points, 1.0, 0, 0, 2);

        }
static vtkPoints h2v_cloud(HTuple hv_ObjectModel3D)
        {
            HTuple hv_x = new HTuple();
            HTuple hv_y = new HTuple();
            HTuple hv_z = new HTuple();
            HTuple hv_num = new HTuple();

            HOperatorSet.GetObjectModel3dParams(hv_ObjectModel3D, "point_coord_x", out hv_x);
            HOperatorSet.GetObjectModel3dParams(hv_ObjectModel3D, "point_coord_y", out hv_y);
            HOperatorSet.GetObjectModel3dParams(hv_ObjectModel3D, "point_coord_z", out hv_z);
            HOperatorSet.GetObjectModel3dParams(hv_ObjectModel3D, "num_points", out hv_num);

            int num = hv_num[0].I;
            vtkPoints points = new vtkPoints();

            for (int i = 1; i < num; i++)
            {
                points.InsertPoint(i, hv_x.DArr[i], hv_y.DArr[i], hv_z.DArr[i]);
            }

            return points;
        }
public void show_cloud(vtkPoints points, double r = 1.0, double g = 1.0, double b = 1.0, float size = 4f)
        {
            m_points = null;
            m_points = points;

            vtkPolyData polydata = vtkPolyData.New();
            polydata.SetPoints(points);
            vtkVertexGlyphFilter glyphFilter = vtkVertexGlyphFilter.New();
            glyphFilter.SetInputConnection(polydata.GetProducerPort());

            vtkPolyDataMapper mapper = vtkPolyDataMapper.New();
            mapper.SetInputConnection(glyphFilter.GetOutputPort());
            vtkActor actor = vtkActor.New();
            actor.SetMapper(mapper);
            actor.GetProperty().SetPointSize(size);
            actor.GetProperty().SetColor(r, g, b);

            renderer.AddActor(actor);
        }

结果展示

这是我这两天做的一个demo,深度渲染等方法的代码暂时先不贴上来了哈。
在这里插入图片描述
可以看出效果还是不错的,比较美观。键盘、鼠标事件的交互也很流畅。基本上满足我的需求,目前来看与C++/Qt/PCL/vtk框架相比也是八九不离十了。之后有空会持续更新相关文章的。
更多问题可私信,非常渴望在halcon3d的探索道路上多几个朋友!

  • 19
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值