WPF HALCON HSmartWindowControlWPF 鼠标绘制ROI

这篇具有很好参考价值的文章主要介绍了WPF HALCON HSmartWindowControlWPF 鼠标绘制ROI。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

更新:放出完整源码,供大家学习参考

yStack/SoupImgViewer (github.com)https://github.com/yStack/SoupImgViewer

0. 需求

在HSmartWindowsControlWPF上用鼠标绘制ROI,且显示绘制时的鼠标交互过程,最终效果如下:

hsmartwindowcontrolwpf,wpf,c#,视觉检测,Powered by 金山文档

1. 基本思路

  • 在HSmartWindowControl上布置一层透明的Canvas,用于实时显示鼠标绘制ROI的过程

  • 鼠标移动时,在Canvas上用鼠标实时绘制Rectangle等ROI形状,

  • 鼠标在Canvas坐标系中的Position信息(x,y)坐标转换到HALCON图像坐标系,变换为Row、Column等信息

  • 根据Row、Column信息调用HDrawingObject.CreateDrawingObject()方法生成Halcon原生ROI

  • 鼠标左键释放时,隐藏Canvas,将原生ROI附加到窗口中

UI布局如下:

  <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100"></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <StackPanel Grid.Column="0" Orientation="Vertical">
            <Button Width="75" Height="25" Content="LoadImg" Margin="2.5" Click="Button_Click"></Button>
            <CheckBox Content="Rect" Margin="2.5" x:Name="rect_roi" Checked="rect_roi_Checked" Unchecked="rect_roi_Unchecked"></CheckBox>
            <CheckBox Content="Ellipse" Margin="2.5" x:Name="ellipse_roi" Checked="ellipse_roi_Checked" Unchecked="ellipse_roi_Unchecked"></CheckBox>
        </StackPanel>
        <halcon:HSmartWindowControlWPF HKeepAspectRatio="True" Grid.Column="1" x:Name="HalconWindowControl" HInitWindow="HWind_HInitWindow"></halcon:HSmartWindowControlWPF>
        <Canvas x:Name="Canvas" Visibility="Collapsed" Grid.Column="1" Background="Transparent" MouseLeftButtonDown="Canvas_MouseLeftButtonDown" MouseUp="Canvas_MouseUp" MouseMove="Canvas_MouseMove"></Canvas>
    </Grid>

2. 鼠标事件处理

  1. 初始化时,在Canvas中添加Rectangle等对象,并将其设置为不可见


	   private void Init()
        {
            Canvas.Children.Add(_canvasRect);
            Canvas.Children.Add(_canvasEllipse);
            Canvas.Children.Add(_cross);

            //矩形
            _canvasRect.Stroke = new SolidColorBrush(StokeColor);
            _canvasRect.StrokeThickness = StokeThickness;
            _canvasRect.Width = 0;
            _canvasRect.Height = 0;

            //圆形
            _canvasEllipse.Stroke = new SolidColorBrush(StokeColor);
            _canvasEllipse.StrokeThickness = StokeThickness;

            //十字
            _cross.Stroke = new SolidColorBrush(StokeColor);
            _cross.StrokeThickness = StokeThickness;
            _cross.Data = PathGeometry.Parse("M0,0 L8,8 M8,0 L0,8");
            _cross.Width = 0;
            _cross.Height = 0;

            // HImagePart随着窗口大小变化实时变动,注册事件用于实时更新坐标变换信息
            var dpd = DependencyPropertyDescriptor.FromProperty(HSmartWindowControlWPF.HImagePartProperty, typeof(HSmartWindowControlWPF));
            dpd.AddValueChanged(HalconWindowControl, (o, e) =>
            {
                var imgPart = HalconWindowControl.HImagePart;
                _k = imgPart.Height / HalconWindowControl.ActualHeight;
                _tx = imgPart.X;
                _ty = imgPart.Y;
            });
        }
  1. 鼠标左键单击,记录开始点startPoint


		private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                _startPoint = e.GetPosition(Canvas);
            }
        }
  1. 鼠标移动,在Canvas上实时绘制Rectangle


	    private void Canvas_MouseMove(object sender, MouseEventArgs e)
		{
            if (e.LeftButton == MouseButtonState.Pressed && rect_roi.IsChecked == true)
            {
                _endPoint = e.GetPosition(Canvas);

                _canvasRect.Height = Math.Abs(_endPoint.Y - _startPoint.Y);
                _canvasRect.Width = Math.Abs(_endPoint.X - _startPoint.X);
				
				// 左上往右下拖动
                if (_endPoint.X > _startPoint.X && _endPoint.Y > _startPoint.Y)
                {
                    Canvas.SetLeft(_canvasRect, _startPoint.X);
                    Canvas.SetTop(_canvasRect, _startPoint.Y);
                    
					//坐标转换,Canvas => HWindow
                    ConvertPoint(_startPoint.X, _startPoint.Y, _k, _tx, _ty, out double sx, out double sy);
                    ConvertPoint(_endPoint.X, _endPoint.Y, _k, _tx, _ty, out double ex, out double ey);
                    
                    _r1 = sy;
                    _c1 = sx;
                    _r2 = ey;
                    _c2 = ex;
                }

				// 右下往左上拖动
                if (_endPoint.X < _startPoint.X && _endPoint.Y < _startPoint.Y)
                {
                    Canvas.SetLeft(_canvasRect, _endPoint.X);
                    Canvas.SetTop(_canvasRect, _endPoint.Y);
                }
		}
  1. 鼠标释放时,添加ROI到HalconWindow中


		private void Canvas_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if(rect_roi.IsChecked == true)
            {
                _roi = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, _r1, _c1, _r2, _c2);
                _hwind.AttachDrawingObjectToWindow(_roi);
                rect_roi.IsChecked = false;
            }
            
            if(ellipse_roi.IsChecked == true)
            {
                _roi = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.CIRCLE, _cr, _cc, _cRadius);
                _hwind.AttachDrawingObjectToWindow(_roi);
                ellipse_roi.IsChecked = false;
            }
        }

4. 坐标转换

Canvas坐标系和HWindow坐标系之间仅存在缩放、平移这两种变换关系,和相机标定的原理一样,k为缩放系数,tx、ty为平移量文章来源地址https://www.toymoban.com/news/detail-617472.html


		private void ConvertPoint(double x, double y, double k, double tx, double ty, out double px, out double py)
        {
            px = k * x + tx;
            py = k * y + ty;
        }

到了这里,关于WPF HALCON HSmartWindowControlWPF 鼠标绘制ROI的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • halcon中将xld轮廓或者region区域绘制在图像上并保存

    首先是小白现在没有找到xld轮廓直接绘制在图像上面的方法 , 对于 xld轮廓通过转化为region区域 , 之后再绘制在图像上 (与直接显示在图像窗口句柄上面的轮廓有一定区别) -补发——————时隔多日找到新的方法利用:dump_window_image可以将亚像素轮廓绘制在图片上面 如

    2023年04月08日
    浏览(32)
  • WPF图表绘制(LiveCharts)

    效果如下图: 使用到的DLL:LiveCharts.dll、LiveCharts.Wpf.dll xaml界面代码(前台代码) viewmodel代码(后台代码) xaml界面代码(前台代码) viewmodel代码(后台代码) public void GetColunmSeriesData() { List columnValues = new List { 40, 30, 25, 60 }; for (int i = 0; i titles.Count; i++) { ColumnXLabels.Add(titles[

    2024年02月04日
    浏览(25)
  • WPF随笔收录-实时绘制心率曲线

    在自己的项目中,涉及到实时心率曲线的绘制,项目上的曲线绘制,一般很难找到能直接用的第三方库,而且有些还是定制化的功能,所以还是自己绘制比较方便。很多人一听到自己画就害怕,感觉很难,今天就分享一个完整的实时心率数据绘制心率曲线图的例子;之前的博

    2024年04月17日
    浏览(25)
  • Simple WPF:实现一个透明、无边框、鼠标穿透的WPF窗体

    一个自定义WPF窗体的解决方案,借鉴了吕毅老师的WPF制作高性能的透明背景的异形窗口一文,并在此基础上增加了鼠标穿透的功能。可以使得透明窗体的鼠标事件穿透到下层,在下层窗体中响应。这一功能在开发一些截图工具,直播、会议标注工具的时候会有比较多的应用,

    2024年02月09日
    浏览(81)
  • WPF三大基础元素:键盘、鼠标与焦点

    WPF框架 中内置了 System.Input.Keyboard 基础 键盘类 ,该类提供了丰富的键盘相关功能,包括描述 键盘状态 的属性、 处理键盘操作 的方法以及一系列事件。这些键盘事件不仅直接由 Keyboard类 提供,还通过 UIElement等XAML基元素类 向外传递。 在 处理键盘输入 时,常用的 两个事件

    2024年02月20日
    浏览(23)
  • 【Java AWT 图形界面编程】使用鼠标滚轮缩放 Canvas 画布中绘制的背景图像 ( 绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩放 + 以当前鼠标指针位置为缩放中心 示例 )

    鼠标指针指向界面中的 Canvas 画布某个位置 , Canvas 画布中绘制着一张超大图片 , 以该位置为中心 , 滑动鼠标滚轮时进行缩放 ; 使用鼠标滚轮缩放后 , 在 Canvas 中绘制的图片的尺寸肯定是放大或者缩小了 , 尺寸发生了改变 ; 图片缩放时 , 鼠标指针指向一个位置 , 该位置对应着一

    2024年02月15日
    浏览(26)
  • WPF容器的背景对鼠标事件的影响

    背景:在实现鼠标拖动窗口的过程中发现对父容器设置了鼠标拖动窗口的事件MouseLeftButtonDown 问题:非常困惑的是,竟然有的地方可以被点击拖动,但是有的却不行。 而且只有在设置了Background的这个地方是可以被点击拖动的 搜索了好一会发现确实是Background的问题 当控件(如

    2024年02月03日
    浏览(29)
  • OpenCV鼠标绘制线段

    2024年04月26日
    浏览(27)
  • WPF鼠标、键盘、拖拽事件、用行为封装事件

    本文主要介绍了WPF中常用的鼠标事件、键盘事件以及注意事项,同时使用一个案例讲解了拓展事件。除此之外,本文还讲述如何用行为(Behavior)来封装事件。 Windows中的事件通过消息机制来完成,也就是Windows系统来捕获用户输入(如鼠标点击、键盘输入),然后Windows发送一

    2024年01月23日
    浏览(28)
  • C#开发winform&wpf后台捕获鼠标移动事件

    做 WPF和winform的时候,可以在界面上设置鼠标移动事件来检测鼠标移动,如果项目为后期改造这样做的话改动量很大,今天通过另外一种后台调用windows api的方式进行快速捕获和触发,提高开发效率分享给大家。

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包