1.代码一
//此部分只实现了图像的鼠标滚轮缩放与空格复位功能
private void pictureBox_SingleMain_HMouseWheel(object sender, MouseEventArgs e)
{
HTuple Zoom, Row, Col, Button;
HTuple Row0, Column0, Row00, Column00, Ht, Wt, r1, c1, r2, c2;
if (e.Delta > 0)
{
Zoom = 1.5;
}
else
{
Zoom = 0.5;
}
HOperatorSet.GetMposition(hv_WindowHandle, out Row, out Col, out Button);
HOperatorSet.GetPart(hv_WindowHandle, out Row0, out Column0, out Row00, out Column00);
Ht = Row00 - Row0;
Wt = Column00 - Column0;
if (Ht * Wt < 32000 * 32000 || Zoom == 1.5)//普通版halcon能处理的图像最大尺寸是32K*32K。如果无限缩小原图像,导致显示的图像超出限制,则会造成程序崩溃
{
r1 = (Row0 + ((1 - (1.0 / Zoom)) * (Row - Row0)));
c1 = (Column0 + ((1 - (1.0 / Zoom)) * (Col - Column0)));
r2 = r1 + (Ht / Zoom);
c2 = c1 + (Wt / Zoom);
HOperatorSet.SetPart(hv_WindowHandle, r1, c1, r2, c2);
HOperatorSet.ClearWindow(hv_WindowHandle);
HOperatorSet.DispObj(ho_Image, hv_WindowHandle);
HOperatorSet.SetColor(HDevWindowStack.GetActive(), "red");
HOperatorSet.DispObj(ho_Defect_Regions, HDevWindowStack.GetActive());
if ((int)(new HTuple(hv_Number.TupleGreater(0))) != 0)
{
if (HDevWindowStack.IsOpen())
{
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
HOperatorSet.DispText(HDevWindowStack.GetActive(), "经检测缺陷区域数量为:" + hv_Number,
"window", 6, 3, "red", new HTuple(), new HTuple());
}
}
}
else
{
if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispText(HDevWindowStack.GetActive(), "经检测无缺陷!",
"window", 6, 3, "green", new HTuple(), new HTuple());
}
}
}
}
private void pictureBox_SingleMain_HMouseEnter(object sender, EventArgs e)
{
this.pictureBox_SingleMain.Focus();
}
//空格键按下事件:当按下空格使,主图像框自动复位。
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Space) //按下空格键
{
HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height - 1, hv_Width - 1);
HOperatorSet.ClearWindow(hv_WindowHandle);
HOperatorSet.DispObj(ho_Image, hv_WindowHandle);
HOperatorSet.SetColor(HDevWindowStack.GetActive(), "red");
HOperatorSet.DispObj(ho_Defect_Regions, HDevWindowStack.GetActive());
if ((int)(new HTuple(hv_Number.TupleGreater(0))) != 0)
{
if (HDevWindowStack.IsOpen())
{
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
HOperatorSet.DispText(HDevWindowStack.GetActive(), "经检测缺陷区域数量为:" + hv_Number,
"window", 6, 3, "red", new HTuple(), new HTuple());
}
}
}
else
{
if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispText(HDevWindowStack.GetActive(), "经检测无缺陷!",
"window", 6, 3, "green", new HTuple(), new HTuple());
}
}
}
}
2.代码2
//实现图像的拖拽与缩放 以及 复位 功能
private static double RowDown;//鼠标按下时的行坐标
private static double ColDown;//鼠标按下时的列坐标
private static HObject ho_image; //图像变量
#region 创建Halcon窗口
/// <summary>
/// 创建Halcon窗口
/// </summary>
/// <param name="hWindowControl1"></param>
public static void CreateHalconWindow(HWindowControl hWindowControl1)
{
/图片控件为halcon中的HWindowControl控件时/
WindowID = hWindowControl1.HalconWindow;
}
#endregion
#region 读图
/// <summary>
/// 读图
/// </summary>
public static void readImage()
{
OpenFileDialog openFileDialog = new OpenFileDialog();
//openFileDialog.Filter = "JPEG文件|*.jpg*|BMP文件|*.bmp*|TIFF文件|*.tiff*";
openFileDialog.Filter = "所有图像文件 | *.bmp; *.pcx; *.png; *.jpg; *.gif;*.tif; *.ico; *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
HTuple ImagePath = openFileDialog.FileName;
HOperatorSet.ReadImage(out ho_image, ImagePath);
}
HOperatorSet.GetImageSize(ho_image, out ImageWidth, out ImageHeight);
HOperatorSet.SetPart(WindowID, 0, 0, ImageHeight, ImageWidth);
HOperatorSet.DispObj(ho_image, WindowID);
}
#endregion
#region 缩放图像
/// <summary>
/// 缩放图像
/// </summary>
public static void HMouseWheel()
{
HMouseEventArgs e = null;
HTuple Zoom, Row, Col, Button;
HTuple Row0, Column0, Row00, Column00, Ht, Wt, r1, c1, r2, c2;
if (e.Delta > 0)
{
Zoom = 1.5;
}
else
{
Zoom = 0.5;
}
HOperatorSet.GetMposition(WindowID, out Row, out Col, out Button);
HOperatorSet.GetPart(WindowID, out Row0, out Column0, out Row00, out Column00);
Ht = Row00 - Row0;
Wt = Column00 - Column0;
if (Ht * Wt < 32000 * 32000 || Zoom == 1.5)//普通版halcon能处理的图像最大尺寸是32K*32K。如果无限缩小原图像,导致显示的图像超出限制,则会造成程序崩溃
{
r1 = (Row0 + ((1 - (1.0 / Zoom)) * (Row - Row0)));
c1 = (Column0 + ((1 - (1.0 / Zoom)) * (Col - Column0)));
r2 = r1 + (Ht / Zoom);
c2 = c1 + (Wt / Zoom);
HOperatorSet.SetPart(WindowID, r1, c1, r2, c2);
HOperatorSet.ClearWindow(WindowID);
HOperatorSet.DispObj(ho_image, WindowID);
}
}
#endregion
#region 鼠标按下,记录当前坐标值
/// <summary>
/// 鼠标按下,记录当前坐标值
/// </summary>
public static void HMouseDown()
{
HTuple Row, Column, Button;
HOperatorSet.GetMposition(WindowID, out Row, out Column, out Button);
RowDown = Row; //鼠标按下时的行坐标
ColDown = Column; //鼠标按下时的列坐标
}
#endregion
#region 鼠标抬起,实现图像移动
/// <summary>
/// 鼠标抬起,实现图像移动
/// </summary>
public static void HMouseUp()
{
HTuple row1, col1, row2, col2, Row, Column, Button;
HOperatorSet.GetMposition(WindowID, out Row, out Column, out Button);
double RowMove = Row - RowDown; //鼠标弹起时的行坐标减去按下时的行坐标,得到行坐标的移动值
double ColMove = Column - ColDown;//鼠标弹起时的列坐标减去按下时的列坐标,得到列坐标的移动值
HOperatorSet.GetPart(WindowID, out row1, out col1, out row2, out col2);//得到当前的窗口坐标
HOperatorSet.SetPart(WindowID, row1 - RowMove, col1 - ColMove, row2 - RowMove, col2 - ColMove);//这里可能有些不好理解。以左上角原点为参考点
HOperatorSet.ClearWindow(WindowID);
if (ImageHeight != null)
{
HOperatorSet.DispObj(ho_image, WindowID);
}
else
{
MessageBox.Show("请加载一张图片");
}
}
#endregion
#region 鼠标移动,实时显示当前坐标与灰度值
/// <summary>
/// 鼠标移动,实时显示当前坐标与灰度值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public static void HMouseMove()
{
HTuple Row, Column, Button, pointGray;
HOperatorSet.GetMposition(WindowID, out Row, out Column, out Button); //获取当前鼠标的坐标值
if (ImageHeight != null && (Row > 0 && Row < ImageHeight) && (Column > 0 && Column < ImageWidth))//设置3个条件项,防止程序崩溃。
{
HOperatorSet.GetGrayval(ho_image, Row, Column, out pointGray); //获取当前点的灰度值
}
else
{
pointGray = "_";
}
String str = String.Format("Row:{0} Column:{1} Gray:{2}", Row, Column, pointGray); //格式化字符串
}
#endregion
#region 全屏显示图像,使缩放后的图像回到原始大小
/// <summary>
/// 全屏显示图像,使缩放后的图像回到原始大小
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public static void FullWindow_Click()
{
HOperatorSet.SetPart(WindowID, 0, 0, ImageHeight - 1, ImageWidth - 1);
HOperatorSet.ClearWindow(WindowID);
HOperatorSet.DispObj(ho_image, WindowID);
}
#endregion
private void pictureBox_SingleMain_HMouseWheel(object sender, MouseEventArgs e)
{
HTuple Zoom, Row, Col, Button;
HTuple Row0, Column0, Row00, Column00, Ht, Wt, r1, c1, r2, c2;
if (e.Delta > 0)
{
Zoom = 1.5;
}
else
{
Zoom = 0.5;
}
HOperatorSet.GetMposition(hv_WindowHandle, out Row, out Col, out Button);
HOperatorSet.GetPart(hv_WindowHandle, out Row0, out Column0, out Row00, out Column00);
Ht = Row00 - Row0;
Wt = Column00 - Column0;
if (Ht * Wt < 32000 * 32000 || Zoom == 1.5)//普通版halcon能处理的图像最大尺寸是32K*32K。如果无限缩小原图像,导致显示的图像超出限制,则会造成程序崩溃
{
r1 = (Row0 + ((1 - (1.0 / Zoom)) * (Row - Row0)));
c1 = (Column0 + ((1 - (1.0 / Zoom)) * (Col - Column0)));
r2 = r1 + (Ht / Zoom);
c2 = c1 + (Wt / Zoom);
HOperatorSet.SetPart(hv_WindowHandle, r1, c1, r2, c2);
HOperatorSet.ClearWindow(hv_WindowHandle);
HOperatorSet.DispObj(ho_Image, hv_WindowHandle);
HOperatorSet.SetColor(HDevWindowStack.GetActive(), "red");
HOperatorSet.DispObj(ho_Defect_Regions, HDevWindowStack.GetActive());
if ((int)(new HTuple(hv_Number.TupleGreater(0))) != 0)
{
if (HDevWindowStack.IsOpen())
{
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
HOperatorSet.DispText(HDevWindowStack.GetActive(), "经检测缺陷区域数量为:" + hv_Number,
"window", 6, 3, "red", new HTuple(), new HTuple());
}
}
}
else
{
if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispText(HDevWindowStack.GetActive(), "经检测无缺陷!",
"window", 6, 3, "green", new HTuple(), new HTuple());
}
}
}
}
private void pictureBox_SingleMain_HMouseEnter(object sender, EventArgs e)
{
this.pictureBox_SingleMain.Focus();
}
//空格键按下事件:当按下空格使,主图像框自动复位。
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Space) //按下空格键
{
HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height - 1, hv_Width - 1);
HOperatorSet.ClearWindow(hv_WindowHandle);
HOperatorSet.DispObj(ho_Image, hv_WindowHandle);
HOperatorSet.SetColor(HDevWindowStack.GetActive(), "red");
HOperatorSet.DispObj(ho_Defect_Regions, HDevWindowStack.GetActive());
if ((int)(new HTuple(hv_Number.TupleGreater(0))) != 0)
{
if (HDevWindowStack.IsOpen())
{
using (HDevDisposeHelper dh = new HDevDisposeHelper())
{
HOperatorSet.DispText(HDevWindowStack.GetActive(), "经检测缺陷区域数量为:" + hv_Number,
"window", 6, 3, "red", new HTuple(), new HTuple());
}
}
}
else
{
if (HDevWindowStack.IsOpen())
{
HOperatorSet.DispText(HDevWindowStack.GetActive(), "经检测无缺陷!",
"window", 6, 3, "green", new HTuple(), new HTuple());
}
}
}
}
private static double RowDown;//鼠标按下时的行坐标
private static double ColDown;//鼠标按下时的列坐标
#region 鼠标按下,记录当前坐标值
/// <summary>
/// 鼠标按下,记录当前坐标值
/// </summary>
private void HMouseDown(object sender, HMouseEventArgs e)
{
HTuple Row, Column, Button;
HOperatorSet.GetMposition(hv_WindowHandle, out Row, out Column, out Button);
RowDown = Row; //鼠标按下时的行坐标
ColDown = Column; //鼠标按下时的列坐标
}
#endregion
#region 鼠标抬起,实现图像移动
/// <summary>
/// 鼠标抬起,实现图像移动
/// </summary>
public void HMouseUp(object sender, HMouseEventArgs e)
{
HTuple row1, col1, row2, col2, Row, Column, Button;
HOperatorSet.GetMposition(hv_WindowHandle, out Row, out Column, out Button);
double RowMove = Row - RowDown; //鼠标弹起时的行坐标减去按下时的行坐标,得到行坐标的移动值
double ColMove = Column - ColDown;//鼠标弹起时的列坐标减去按下时的列坐标,得到列坐标的移动值
HOperatorSet.GetPart(hv_WindowHandle, out row1, out col1, out row2, out col2);//得到当前的窗口坐标
HOperatorSet.SetPart(hv_WindowHandle, row1 - RowMove, col1 - ColMove, row2 - RowMove, col2 - ColMove);//这里可能有些不好理解。以左上角原点为参考点
HOperatorSet.ClearWindow(hv_WindowHandle);
if (hv_Height != null)
{
HOperatorSet.DispObj(ho_Image, hv_WindowHandle);
}
else
{
MessageBox.Show("请加载一张图片");
}
}
#endregion
#region 鼠标移动,实时显示当前坐标与灰度值
/// <summary>
/// 鼠标移动,实时显示当前坐标与灰度值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void HMouseMove(object sender, HMouseEventArgs e)
{
HTuple Row, Column, Button, pointGray;
HOperatorSet.GetMposition(hv_WindowHandle, out Row, out Column, out Button); //获取当前鼠标的坐标值
if (hv_Height != null && (Row > 0 && Row < hv_Height) && (Column > 0 && Column < hv_Width))//设置3个条件项,防止程序崩溃。
{
HOperatorSet.GetGrayval(ho_Image, Row, Column, out pointGray); //获取当前点的灰度值
}
else
{
pointGray = "_";
}
String str = String.Format("Row:{0} Column:{1} Gray:{2}", Row, Column, pointGray); //格式化字符串
}
#endregion
详情完整程序见:Workpiece_Defect_Detection
————————————————
版权声明:本文为CSDN博主「NCUTer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_50016546/article/details/124637431