前言(已有方案的问题)
由于甲方需要,最近开始做的一个项目的框架旋转的是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的时候报错,然后组件就没有了。
不过这个并不会影响使用。可以在代码里定义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()实现点云显示。
主要的代码如下,可以根据自己的需要稍作修改。文章来源:https://www.toymoban.com/news/detail-435503.html
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的探索道路上多几个朋友!文章来源地址https://www.toymoban.com/news/detail-435503.html
到了这里,关于C#/halcon联合编程 三维点云数据可视化(ActiViz实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!