基于WPF Opencv实现一个图像可移动、缩放和可交互的显示窗口

这篇具有很好参考价值的文章主要介绍了基于WPF Opencv实现一个图像可移动、缩放和可交互的显示窗口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习Halcon的HSmartWindowControl窗口控件,用WPF和Opencv仿照了一个。
显示控件的主体是两个Canvas: Root Canvas是背景,刷上了网格; 把要显示的图像作为Image Canvas的图像背景,
后面图像的移动,缩放,实质都是Image Canvas。
基于WPF Opencv实现一个图像可移动、缩放和可交互的显示窗口
可交互,学习的是Halcon的绘图对象,WPF的Path来实现的,Path类有鼠标事件,当Mouse Enter时,绘图对象的线宽增加,离开减少。

		protected virtual void _path_MouseMove(object sender, MouseEventArgs e) { }
        protected virtual void _path_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            _path.Stroke = new SolidColorBrush(_cLineColor);
            mbIsSelected = false;
            (sender as Path).ReleaseMouseCapture();
        }
        protected virtual void _path_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){ }
        protected virtual void _path_MouseLeave(object sender, MouseEventArgs e)
        {
            _dLineWidth -= 3;
        }
        protected virtual void _path_MouseEnter(object sender, MouseEventArgs e)
        {
            _dLineWidth += 3;
        }
        protected virtual void UpdateDrawObjectScaleToImageChange() { }

主要实现了四个绘图对象,其中Rect2DrawingObejct,用的时Opencv的RotateRect来算的坐标(自己算太麻烦了),后期其实还可以实现多边形的绘图对象。
基于WPF Opencv实现一个图像可移动、缩放和可交互的显示窗口
至于绘图对象的回调函数,用委托实现:

 		public delegate void DrawingObjectCallback(string drawingObjectType, DrawingObject drawingObject);
        protected DrawingObjectCallback OnDrag;
        protected DrawingObjectCallback OnResize;
        protected DrawingObjectCallback OnSelect;

至此,整体功能就实现了。
但是还有一个问题,就是Image Canvas控件坐标和图像坐标的转换,其实两个坐标系的转换Factor也很好算:

 mdScaleXToImage = mMat.Cols / (value * 1.0);
 mdScaleYToImage = mMat.Rows / (value * 1.0);

但是当Image Canvas控件的尺寸发生改变(例如,窗口最大化了)时,这两个Factor就也必须更新,对于控件本身来讲,这两个值的更新是很容易的,可以在private void imageCanvas_SizeChanged(object sender, SizeChangedEventArgs e)更新。但在绘图图像类中就比较麻烦,目前的做法是绘图图像类注册了依赖属性,绑定到窗口相应的属性上,然后在依赖属性的回调函数中去更新绘图对象的位置

internal  static readonly DependencyProperty ScaleXToImageProperty =
                  DependencyProperty.Register("ScaleXToImage", typeof(double), typeof(DrawingObject), new PropertyMetadata(1.0, OnScaleToImageChanged));
internal  static readonly DependencyProperty ScaleYToImageProperty =
                  DependencyProperty.Register("ScaleYToImage", typeof(double), typeof(DrawingObject), new PropertyMetadata(1.0, OnScaleToImageChanged));
private   static  void OnScaleToImageChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
	 {
	 		DrawingObject obj = d as DrawingObject;
            if (obj is Rect1DrawingObject)
            {
                (obj as Rect1DrawingObject).UpdateDrawObjectScaleToImageChange();
            }
            else if(obj is CircleDrawingObject)
            {
                (obj as CircleDrawingObject).UpdateDrawObjectScaleToImageChange();
            }
            else if(obj is LineDrawingObject)
            {
                (obj as LineDrawingObject).UpdateDrawObjectScaleToImageChange();
            }
            else if(obj is Rect2DrawingObject)
            {
                (obj as Rect2DrawingObject).UpdateDrawObjectScaleToImageChange();
            }
     }

附上demo的效果,也是参考的Halcon&WPF的例程,在Rect1Object的OnDrag回调函数中执行Sobel元素。
基于WPF Opencv实现一个图像可移动、缩放和可交互的显示窗口
基于WPF Opencv实现一个图像可移动、缩放和可交互的显示窗口
基于WPF Opencv实现一个图像可移动、缩放和可交互的显示窗口文章来源地址https://www.toymoban.com/news/detail-407486.html

到了这里,关于基于WPF Opencv实现一个图像可移动、缩放和可交互的显示窗口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • OpenCV 笔记(23):图像的缩放——图像的缩放——立方插值、Lanczos 插值算法

    立方插值算法也被称为双三次、双立方插值算法。 先介绍一下三次插值算法,它是一种使用三次多项式拟合一组数据的插值方法。三次插值通常用于图像缩放和重采样。 三次插值的实现方式有很多种,例如牛顿多项式插值、拉格朗日多项式插值、Hermite 三次多项式插值、三次

    2024年04月26日
    浏览(50)
  • 【OpenCV • c++】图像几何变换 | 图像缩放

    🚀 个人简介:CSDN「 博客新星 」TOP 10 , C/C++ 领域新星创作者 💟 作    者: 锡兰_CC ❣️ 📝 专    栏: 【OpenCV • c++】计算机视觉 🌈 若有帮助,还请 关注➕点赞➕收藏 ,不行的话我再努努力💪💪💪

    2024年02月16日
    浏览(53)
  • (opencv)图像几何变换——缩放

    图像缩放是指将图像的尺寸变小或变大的过程,也就是减少或增加源图像数据的像素个数。图像缩放一定程度上会造成信息的丢失,因此需要考虑适宜的方法进行操作。 下面介绍两种常用的图像缩放方法的原理及实现 1.基于等间隔提取图像缩放 等间隔提取图像缩放是通过对

    2024年02月16日
    浏览(38)
  • Python Opencv实践 - 图像缩放

         

    2024年02月13日
    浏览(42)
  • 【OpenCV】图像变换(缩放、平移、旋转、仿射)

    图像变换是指通过对图像进行缩放、平移、旋转、仿射、透视等变换来改变图像的形状和大小。在本篇博客中,我们将详细介绍OpenCV中的图像变换函数,并提供示例代码以帮助读者更好地理解这些函数的使用方法。 缩放变换是指通过改变图像的大小来改变图像的形状。在Op

    2024年02月07日
    浏览(57)
  • opencv 图像的缩放(放大,缩小),翻转,旋转

    opencv 图像的缩放(放大,缩小),翻转,旋转 opencv 最常用的图像缩放方法是使用 cv2::resize() 函数,它需要指定输出图像的大小,和插值算法; opencv 最常用的图像翻转方法是使用 cv::flip() 函数,它需要指定图像翻转方式; opencv 最常用的图像旋转方法是使用 cv::warpAffine() 函数,

    2024年02月07日
    浏览(59)
  • OpenCV图像的仿射变换、旋转和缩放

    以下是对代码的逐行解释:

    2024年02月13日
    浏览(51)
  • opencv006图像处理之仿射变换(旋转,缩放,平移)

    空间变换中的仿射变换对应着五种变换,平移,缩放,旋转,翻转,错切。而这五种变化由原图像转变到变换图像的过程,可以用仿射变换矩阵进行描述。而这个变换过程可以用一个2*3的矩阵与原图进行相乘得到。关键就是这个矩阵M:  平移,旋转   透视 M: 变换矩阵 desi

    2024年01月21日
    浏览(50)
  • opencv-22 图像几何变换01-缩放-cv2.resize()(图像增强,图像变形,图像拼接)

    几何变换是计算机图形学中的一种图像处理技术,用于对图像进行空间上的变换,而不改变图像的内容。这些变换可以通过对图像中的像素位置进行调整来实现。 常见的几何变换包括: 平移(Translation) :将图像在水平和/或垂直方向上进行平移,即将图像的每个像素沿着指

    2024年02月15日
    浏览(42)
  • 用OpenCV实现创建一个新的图像并排显示左右两个输入图像

    创建一个并排显示左右两个输入图像程序的关键在于正确地使用 OpenCV 的 cv::Mat 类和图像处理函数。 下面是一个简单的示例代码,展示了如何实现这个功能。 这段代码假设你已经有了两个图像文件(左图和右图),并将它们并排显示在一个窗口中。 请确保在您的系统上安装

    2024年01月18日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包