引用 HWindow_Tool.dll 文件
控件功能
1,支持鼠标中键缩放和左键拖动
2,支持在图像缩放后,region,xld,roi能够复现
3,支持region,xld按照指定颜色显示,并在缩放后复现
4,支持矩形1,矩形2,圆,和直线roi的绘制
5,可以显示当前鼠标左键所在位置的图像灰度值
6,可以保存原图,或者截屏当前窗口
追加项:
1),图像按自身长宽比例自适应显示
2),追加了点,扇形类
3),追加了容许/禁止编辑功能
4 , 追加了选中手柄尺寸调整功能
5),追加了演示序列化保存与加载
6),追加了演示记录缩放平移及恢复位置功能
7),追加了演示在鼠标所在位置绘制点线原等图形功能
8),追加了演示修改已有坐标//下面是运行环境
private HObject image = new HObject();//图片
private HObject brush_region = new HObject();//笔刷
private HObject final_region = new HObject();//需要获得的区域
private HTuple hv_WindowHandle;
因为HWindow_Tool控件是用winform开发的,用在WPF中只能通过WinFormHost:WindowsFormsHost
通过xaml mvvm:EventToCommand,viewmodel获取HWindow_Final控件对象
try
{
//获取HWindowControlWPF控件对象
form_Host_hw = (WindowsFormsHost)o;
hWindow_Fit1 = (HWindow_Final)form_Host_hw.Child;
hv_WindowHandle = hWindow_Fit1.getHWindowControl().HalconWindow;
ho_ModelImage = new HObject();
HOperatorSet.ReadImage(out this.ho_ModelImage, "测试.bmp");
//显示背景图
hWindow_Fit1.HobjectToHimage(ho_ModelImage);
//注册窗口鼠标事件
hWindow_Fit1.hWindowControl.MouseDown += HWindowControl_MouseDown;
}
catch (Exception)
{
Growl.Error("获取HWindow_Final控件失败!");
}
//显示提示信息
hWindow_Fit1.ClearWindow();
hWindow_Fit1.HobjectToHimage(image);
//设置字体属性
HOperatorSet.SetFont(“default-Normal-35”);
HOperatorSet.SetFont(“default-Bold-35”);
//显示为黄色
HOperatorSet.SetColor(hv_WindowHandle, “yellow”);
//设置线宽
HOperatorSet.SetLineWidth(hv_WindowHandle, 3);
//显示位置
HalconTool.disp_message(hv_WindowHandle, “在窗口画出” + brushType + “,点击右键结束”, “window”, 20, 20, “red”, “false”);
//如果通过上个步骤显示消息,放大或缩小图片后,消息就会消失
//我在HWindow_Final控件上添加了一个label,通过label显示消息,颜色默认是红色
hWindow_Fit1.DispInfo(“请框选模板区域:”);
hWindow_Fit1.DispInfo(“请框选模板区域:”, System.Drawing.Color.Yellow);
//画图模式打开的情况下,会关闭放大缩小,右键功能
hWindow_Final1.DrawModel = true;
//绘制区域先把画图模式打开
hWindow_Final1.DrawModel = true;
//显示为黄色
HOperatorSet.SetColor(hv_WindowHandle, “yellow”);
HTuple hv_Row1 = null, hv_Column1 = null, hv_Row2 = null, hv_Column2 = null;
HObject brush_region = new HObject();
//绘制矩形1
HOperatorSet.DrawRectangle1(hv_WindowHandle, out hv_Row1, out hv_Column1, out hv_Row2, out hv_Column2);
brush_region.Dispose();
HOperatorSet.GenRectangle1(out brush_region, hv_Row1, hv_Column1, hv_Row2, hv_Column2);
//绘制矩形2
HTuple phi, lenght1, length2;
HOperatorSet.DrawRectangle2(hv_WindowHandle, out hv_Row1, out hv_Column1, out phi, out lenght1, out length2);
brush_region.Dispose();
HOperatorSet.GenRectangle2(out brush_region, hv_Row1, hv_Column1, phi, lenght1, length2);
//绘制圆
HTuple radius;
HOperatorSet.DrawCircle(hv_WindowHandle, out hv_Row1, out hv_Column1, out radius);
brush_region.Dispose();
HOperatorSet.GenCircle(out brush_region, hv_Row1, hv_Column1, radius);
HHalcon11以前,一般用成员函数Id()来判断,但是Halcon11以后,这个成员函数已过时,默认下不能用了,其实Halcon11以后有一个更简单明了的函数IsInitialized(),通过查看Halcon11头文件,其实可以发现IsInitialized()和Id()是等效的
if (ho_select_region.IsInitialized()) 为真的话,说明不为空
class MyTool{
public static void Save2File(T obj, string filename)
{
FileStream fs = null;
try
{
fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, obj);
fs.Flush();
}
catch(Exception ex)
{
//
}
finally
{
if(fs != null) fs.close();
}
}
//将文件反序列化为类型
public static T FormByteFile(string path)
{
try
{
using (FileStream stream = new FileStream(path, FileMode.Open))
{
BinaryFormatter formatter = new BinaryFormatter();
return (T)formatter.Deserialize(stream);
}
}
catch(Exception ex)
{
return default(T);
}
}
}
alarm: Halcon Error #4056: Image data management:object-ID is NULL(0) in Operater*
定义参数的时候 HObject SearchRegion = new HObject(); 是不能序列化的
HObject SearchRegion;可以序列化
https://blog.csdn.net/pudongdong/article/details/53573952
减少HObject装箱和拆箱的问题,提高速度。C#中Obj有装箱和拆箱的操作。
…
//将Hobject对象转换为Himage对象
HobjectToHimage(hobject,ref image);
//函数原型
private void HobjectToHimage(HObject hobject, ref HImage image)
{
HTuple pointer, type, width, height;
HOperatorSet.GetImagePointer1(hobject, out pointer, out type, out width, out height);
image.GenImage1(type, width, height, pointer);
}
定义ROI区域
ListL_search_region = new List ();
…
生成区域
hWindow_Final.viewWindow.genRect1(row1, col1, row2, col2, ref L_search_region, “搜索区域”);
L_search_region[0]类型是 ROI, 转换成region(L_search_region[0].getRegion())
…
获取生成区域的中心
HOperatorSet.AreaCenter(L_search_region[0].getRegion(), out area, out row, out col);
…
移除生成区域
hWindow_Final.viewWindow.removeActiveROI(ref L_search_region);
…
HOperatorSet.SetColor(hv_WindowHandle, “blue”);
HOperatorSet.DispArrow(hv_WindowHandle, 0.0, 0.0, 0, 50, 2);
HOperatorSet.DispArrow(hv_WindowHandle, 0.0, 0, 50, 0, 2);
HOperatorSet.SetTposition(hv_WindowHandle, 0, 52);
HOperatorSet.SetFont(hv_WindowHandle, “default-Normal-35”);
HOperatorSet.WriteString(hv_WindowHandle, “X”);
HOperatorSet.SetTposition(hv_WindowHandle, 52, 0);
HOperatorSet.SetFont(hv_WindowHandle, “default-Normal-35”);
HOperatorSet.WriteString(hv_WindowHandle, “Y”);