【VM服务管家】VM4.x算子SDK开发_3.4 控件嵌入类

3.4.1 图片存储:图片保存的方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:算子SDK开发如何存储图片。
解答
调用SaveImage(图片储存),以存储图片到E盘为例,示例代码如下,其中要判断路径中的文件夹已经创建。

1.	C#
2.	
3.	string imageName="a";
4.	MVD_FILE_FORMAT ms=MVD_FILE_FORMAT.MVD_FILE_BMP;//图片格式
5.	//保存原图
6.	runImage.SaveImage(“E:\\”+imageName+”_origin.bmp”);
7.	//保存渲染图,参数分别为图片路径,图片格式,图片质量(0-100)
8.	mvdRenderActivex1.SaveImage(“E:\\”+imageName+”_render.bmp”,ms,100,MVD_SAVE_TYPE.MVD_SAVE_RESULT_IMAGE);

问题根因
不熟悉相关接口的使用。

3.4.2 辅助十字线:给图像添加辅助十字线的方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:有的用户在使用算子SDK开发时,希望能够在图像上显示辅助十字线。
解答
算子SDK在图像上显示辅助十字线的方法如下:

1.	c#
2.	 
3.	CMvdLineSegmentF line1 = new CMvdLineSegmentF(new MVD_POINT_F(mvdimage.Width/2, 0),new MVD_POINT_F(mvdimage.Width / 2, mvdimage.Height ));//定义线段
4.	CMvdLineSegmentF line2 = new CMvdLineSegmentF(new MVD_POINT_F(0, mvdimage.Height/2),new MVD_POINT_F(mvdimage.Width, mvdimage.Height/2));//定义线段
5.	line1.BorderStyle = MVD_DASH_STYLE.MvDashStyleDashDot;//设置线型
6.	line1.BorderColor = new MVD_COLOR(250, 0, 0);//设置线的颜色
7.	line2.BorderStyle = MVD_DASH_STYLE.MvDashStyleDashDot;//设置线型
8.	line2.BorderColor = new MVD_COLOR(250, 0, 0);//设置线的颜色
9.	mvdRenderActivex1.AddShape(line1);//添加线段1
10.	mvdRenderActivex1.AddShape(line2);//添加线段2
11.	mvdRenderActivex1.Display();//渲染

问题根因
不了解算子SDK的相关接口

3.4.3 控件调用:在WPF中使用Winform控件的方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:在算子SDK开发过程中,用户如何使用封装好的Winform模板匹配等控件?
解答

  1. 首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,System.Windows.Forms.dll。
    在这里插入图片描述

  2. 在要使用WinForm控件的WPF窗体的XAML文件中添加引用。示例代码如下:

C# 
 
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows. Forms"
xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly= WindowsFormsIntegration"
  1. 在WPF的容器控件内如StackPanel内首先要添加WinForm控件的宿主容器,用于衔接WPF和WinForm。示例代码如下:
C# XAML
 
<StackPanel>
	<wfi:WindowsFormsHost x:Name="host" Margin="0,0,0,0" />      
</StackPanel>"
  1. 在代码中定义UserControl1 user= new UserControl1 (); 这里不要忘记添加引用。UserControl1 是自定义的Winform用户控件,用于存放控件。然后再将控件放入WindowsFormsHost 中,示例代码如下:
C# .CS
 
UserControl1 user= new UserControl1 ();
this.host.Child = user; //使XML文件中的host中的内容为用户控件user
  1. 如算子SDK中渲染控件在WPF中的调用,添加渲染控件dll,示例代码如下。
    在这里插入图片描述
    在这里插入图片描述

问题根因
对于WPF如何使用自定义Winform控件不了解。

3.4.4 图形改变事件:渲染控件上图形改变事件的实现方法

描述
环境:MVDAlgrithm SDK3.4及以上 +VS2013及以上
现象:算子SDK中如何使用图形改变事件?
解答
在算子SDK中支持五种类型的图形改变事件,分别是图形添加事件(MVD_SHAPE_ADDED),图形删除事件(MVD_SHAPE_DELETED),图形编辑事件(MVD_SHAPE_EDITED),图形选中事件(MVD_SHAPE_SELECTED)以及未定义事件(MVD_SHAPE_UNDEFINE)。下面以使用最多的图形添加事件为例,代码如下:

扫描二维码关注公众号,回复: 15232961 查看本文章
C#  
//注册图形改变事件
this.mvdRenderActivex1.MVDShapeChangedEvent += mvdRenderActivex1_MVDShapeChangedEvent;

//实现图形改变事件
private void mvdRenderActivex1_MVDShapeChangedEvent(VisionDesigner.MVDRenderActivex.MVD_SHAPE_EVENT_TYPE enEventType, VisionDesigner.MVD_SHAPE_TYPE enShapeType, VisionDesigner.CMvdShape cShapeObj)
{
    if (MVDRenderActivex.MVD_SHAPE_EVENT_TYPE.MVD_SHAPE_ADDED == enEventType)
    {
        //添加图形时具体执行的逻辑代码
    }
}

问题根因
不熟悉图形改变事件的实现方式。

3.4.5 鼠标事件:渲染控件上鼠标事件实现的方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:算子SDK开发中,渲染控件如何触发鼠标事件
解答
在算子sdk开发过程中,支持7中鼠标事件类型。切鼠标左键按下(LButtonDown),鼠标左键抬起(LButtonUp),鼠标右键按下(RButtonDown),鼠标右键抬起(RButtonUp),鼠标左键双击(LButtonDblClk),鼠标移动(MouseMove),鼠标滚轮(MouseWheel)。比较常用的是根据鼠标在控件上的位置来显示图像坐标及像素值,代码如下所示:

C#
//在初始化的时候,设置交互模式,标准交互+自定义交互(StandardAndCustom)
mvdRenderActivex1.SetConfiguration((uint)MVD_RENDER_PARAM_KEY.MvdRenderInteractType, (int)MVDRenderInteractType.StandardAndCustom);

//事件注册,打开渲染控件属性,选择相应事件可以自动生成
//用户想要实现自定义交互需通过SetConfiguration接口启用自定义交互
//用户可根据enMouseEventType判断鼠标事件类型,编写对应的响应函数
//示例:实时显示鼠标所在位置的图像坐标和像素值
private void mvdRenderActivex1_MVDMouseEvent(MVDMouseEventType enMouseEventType, int nPointX, int nPointY, short nZDelta)
{    
    try
    {
        //窗口坐标转图像坐标
        float fImgX = 0.0f, fImgY = 0.0f;
        mvdRenderActivex1.TransformCoordinate(nPointX, nPointY, ref fImgX, ref fImgY, MVDCoordTransType.Wnd2Img);

        //获取像素信息显示
        do
        {
            if (false == _ImageLoaded)
            {
                break;
            }

            int nImagePointX = (int)fImgX;
            int nImagePointY = (int)fImgY;
            int nWidth = (int)_InputImage.Width;
            int nHeight = (int)_InputImage.Height;
            if (nImagePointX < 0 || nImagePointX >= nWidth
                || nImagePointY < 0 || nImagePointY >= nHeight)
            {
                break;
            }

            string pixelInfo = string.Empty;
            List<byte> pixelValue = _InputImage.GetPixel(nImagePointX, nImagePointY);
            MVD_PIXEL_FORMAT enPixelFormat = _InputImage.PixelFormat;
            if (MVD_PIXEL_FORMAT.MVD_PIXEL_MONO_08 == enPixelFormat)
            {
                pixelInfo = string.Format("X:{0:D4} Y:{1:D4} | R:{2:D3} G:{3:D3} B:{4:D3}", nImagePointX, nImagePointY, pixelValue[0], pixelValue[0], pixelValue[0]);
            }
            else if (MVD_PIXEL_FORMAT.MVD_PIXEL_RGB_RGB24_C3 == enPixelFormat)
            {
                pixelInfo = string.Format("X:{0:D4} Y:{1:D4} | R:{2:D3} G:{3:D3} B:{4:D3}", nImagePointX, nImagePointY, pixelValue[0], pixelValue[1], pixelValue[2]);
            }
            else
            {
                throw new MvdException(MVD_MODULE_TYPE.MVD_MODUL_APP, MVD_ERROR_CODE.MVD_E_SUPPORT, "Unsupported pixel format.");
            }
            this.tbPixelInfo.Text = pixelInfo;
        } while (false);
    }
    catch (MvdException ex)
    {
        this.rtbInfoMessage.Text += String.Format("Fail to respond to mouse event! Module : {0}, ErrorCode : 0x{1}, Message : {2}.\r\n", ex.ModuleType.ToString(), ex.ErrorCode.ToString("X"), ex.Message);
    }
    catch (System.Exception ex)
    {
        this.rtbInfoMessage.Text += String.Format("Fail to respond to mouse event! Message : {0}, StackTrace : {1}.\r\n", ex.Message, ex.StackTrace);
    }
}

问题根因
不熟悉鼠标事件的实现方法

猜你喜欢

转载自blog.csdn.net/MVExpert/article/details/130409640