目次
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以降
現象:Operator 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 テンプレート マッチングやその他のコントロールをどのように使用しますか?
答え
-
まず、WindowsFormsIntegration.dll、System.Windows.Forms.dll の 2 つの DLL ファイルへの参照を追加します。
-
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"
- StackPanel などの WPF のコンテナ コントロールでは、WPF と WinForm を接続するために、まず WinForm コントロールのホスト コンテナを追加する必要があります。サンプルコードは次のとおりです。
C# XAML
<StackPanel>
<wfi:WindowsFormsHost x:Name="host" Margin="0,0,0,0" />
</StackPanel>"
- コードで UserControl1 を定義します user= new UserControl1 (); ここに参照を追加することを忘れないでください。UserControl1 は、コントロールを保存するためのカスタム Winform ユーザー コントロールです。次に、コントロールを WindowsFormsHost に配置します。サンプル コードは次のとおりです。
C# .CS
UserControl1 user= new UserControl1 ();
this.host.Child = user; //使XML文件中的host中的内容为用户控件user
- たとえば、オペレーター 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) の 5 種類の形状変更イベントをサポートします。最も一般的に使用されるグラフィックス追加イベントを例に挙げてみましょう。コードは次のとおりです。
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 以降
現象: Operator SDK の開発中、レンダリング コントロールはどのようにマウス イベントをトリガーしますか?
回答
Operator SDK の開発中、7 種類のマウス イベントがサポートされています。マウスの左ボタンを押す (LButtonDown)、マウスの左ボタンを押す (LButtonUp)、マウスの右ボタンを押す (RButtonDown)、マウスの右ボタンを押す (RButtonUp)、マウスの左ボタンをダブルクリックする (LButtonDblClk)、マウスの移動 (MouseMove)、マウスをカットします。ホイール (マウスホイール)。コントロール上のマウスの位置に従って画像の座標とピクセル値を表示するためによく使用されます。コードは次のとおりです。
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);
}
}
問題の根本原因は、
マウス イベントの実装に慣れていないことです。