C# 基于Halcon的HWindowContol控件实现拖拽与缩放

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

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值