Halcon测试代码如下:
- dev_get_window (WindowHandle)
- read_object_model_3d ('bmc_mini', 'mm', [], [], ObjectModel3D, Status)
- visualize_object_model_3d (WindowHandle, ObjectModel3D, [], [], [], [], [], [], [], PoseOut)
复制代码
导出到C#中运行,始终不显示图像(Halcon12中是完全没有问题的)
通过变量检测可以看到ho_ImageDump变量是有图的,但是就是显示不出来,在continue按钮出现的大概黑色附近点击,还是可以显示最后的图像(才刷新)。
所以,笔者认为这个地方可能出现了图像刷新的堵塞,所以我们尝试加入主程序主线程刷新消息看看。
添加下面代码:
- System.Windows.Forms.Application.DoEvents();
复制代码
在主程序visualize_object_model_3d函数里面找到并添加如下:
- dump_image_output(ho_Image, hv_WindowHandleBuffer, hv_Scene3D, hv_AlphaOrig,
- hv_ObjectModel3D, hv_GenParamName_COPY_INP_TMP, hv_GenParamValue_COPY_INP_TMP,
- hv_CamParam_COPY_INP_TMP, hv_Poses, hv_ColorImage, hv_Title, hv_Information,
- hv_Label_COPY_INP_TMP, hv_VisualizeTB, "true", hv_TrackballCenterRow,
- hv_TrackballCenterCol, hv_TBSize, hv_SelectedObject, hv_WindowCenteredRotation,
- hv_TBCenter);
- ho_ImageDump.Dispose();
- HOperatorSet.DumpWindowImage(out ho_ImageDump, hv_WindowHandleBuffer);
- HDevWindowStack.SetActive(hv_WindowHandle);
- if (HDevWindowStack.IsOpen())
- {
- HOperatorSet.DispObj(ho_ImageDump, hv_WindowHandle);
- System.Windows.Forms.Application.DoEvents();
- }
复制代码
初步测试已经可以了,就是消息所在的位置导致可能会出现卡顿情况,尝试几个while地方都加上应该会好些。
暂时先这样吧。
接下来,我们再继续研究看看高版本是否还有其他解决方式。
解决方法一:尝试导出Halcon后,初始化让halcon使用windows线程机制!
- set_system('use_window_thread','true')
复制代码
=================华丽的分割线==========================
后面重新用19.05测试了下,其实阻塞在主线程处理主线程消息也会导致卡顿,甚至可能导致无法响应鼠标消息。
最好的解决办法:让visualize_object_model_3d 算子运行在子线程中!
visualize_object_model_3d算子自带例子(修改了下窗口句柄是获取不是打开新的窗口):
- dev_get_window (WindowHandle)
- read_object_model_3d ('pipe_joint', 'm', [], [], ObjectModel3D1, Status)
- read_object_model_3d ('clamp_sloped', 'mm', [], [], ObjectModel3D2, Status)
- gen_cam_par_area_scan_division (0.016, 0, 5e-6, 5e-6, 320, 240, 640, 480, CamParam)
- get_cam_par_data (CamParam, 'image_width', Width)
- get_cam_par_data (CamParam, 'image_height', Height)
- create_pose (-0.02, 0.01, .6, 110, 5, 320, 'Rp+T', 'gba', 'point', Pose1)
- create_pose (0.01, 0.03, .6, 130, 315, 340, 'Rp+T', 'gba', 'point', Pose2)
- visualize_object_model_3d (WindowHandle, [ObjectModel3D1, ObjectModel3D2], \
- CamParam, [Pose1, Pose2], \
- ['alpha', 'color_0', 'color_1', 'disp_pose'], \
- [0.5, 'orange', 'yellow', 'true'], \
- ['3D visualization demo'], ['pipe joint', 'clamp'], \
- ['Use mouse to change view'], PoseOut)
复制代码
导出为C#函数,然后新建winform工程并在界面添加HWindowControl控件,并在Form1添加代码:
- private void Form1_Load(object sender, EventArgs e)
- {
- HDevWindowStack.Push(this.hWindowControl1.HalconWindow);
- HDevWindowStack.SetActive(this.hWindowControl1.HalconWindow);
- Thread th = new Thread(HalconProc);
- th.IsBackground = true;
- th.Start();
- }
-
- private void HalconProc()
- {
- HDevelopExport hal = new HDevelopExport();
- }
复制代码
记得顶部引用命名空间:using HalconDotNet;
编译测试,功能完全正常!
如果鼠标不在图像控件区域内则会引发异常,这是正常的:
- 引发的异常:“HalconDotNet.HOperatorException”(位于 halcondotnet.dll 中)
复制代码
测试代码:
WindowsFormsApplication1.rar
(42.39 KB, 下载次数: 116)
|