当前位置: 首页 > article >正文

【VM服务管家】VM4.x算子SDK开发_3.3 模块工具类

目录

  • 3.3.1 位置修正:位置修正算子工具的使用方法
  • 3.3.2 模板保存:实现模板自动加载的方法
  • 3.3.3 模板匹配: 获取模板匹配框和轮廓点的方法
  • 3.3.4 模板训练:模板训练执行完成的判断方法
  • 3.3.5 图像相减:算子SDK开发图像相减的方法
  • 3.3.6 图像修正:图像修正工具的使用方法
  • 3.3.7 Blob工具:Blob工具的使用方法
  • 3.3.8 点点测量:点点测量工具的使用方法
  • 3.3.9 亮度测量:亮度测量工具的使用方法
  • 3.3.10 圆查找:圆查找的方法
  • 3.3.11 仿射变换:图像仿射变换的使用方法
  • 3.3.12 直线查找:直线查找工具的使用方法
  • 3.3.13 缺陷检测:直线边缘缺陷检测工具的使用方法
  • 3.3.14 N点标定:N点标定的使用方法
  • 3.3.15 畸变校正:畸变校正的使用方法
  • 3.3.16 字符识别:多线程同时读取同一个本地模型的方法
  • 3.3.17 字符识别:VM自带字符识别模型的区分
  • 3.3.18 设置掩膜:给模块设置掩膜的方法

3.3.1 位置修正:位置修正算子工具的使用方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:位置修正工具使用方法
解答
示例代码如下:

1.	C# 
2.	 
3.	bool re = true;
4.	//位置修正基准参数
5.	 CPositionFixTool PosFixToolObj = new CPositionFixTool();
6.	 CPositionFixBasicParam BasicParam = PosFixToolObj.BasicParam;
7.	 VisionDesigner.PositionFix.MVD_FIDUCIAL_POINT_F stBasinInit = new VisionDesigner.PositionFix.MVD_FIDUCIAL_POINT_F();
8.	 stBasinInit.stPosition.fX = MatchPoint.X;
9.	 stBasinInit.stPosition.fY = MatchPoint.Y;
10.	 stBasinInit.fAngle = Angle;
11.	 BasicParam.BasePoint = stBasinInit;//设置基准点
12.	//位置修正运行参数
13.	 VisionDesigner.PositionFix.MVD_FIDUCIAL_POINT_F stBasicRun = new VisionDesigner.PositionFix.MVD_FIDUCIAL_POINT_F();
14.	 stBasicRun.stPosition.fX = stPositionfX;
15.	 stBasicRun.stPosition.fY = stPositionfY;
16.	 stBasicRun.fAngle = stPositionAngle;
17.	 BasicParam.RunningPoint = stBasicRun;//设置运行点
18.	 //获取工具位置修正后Roi
19.	 MVD_SIZE_I stImageSize = new MVD_SIZE_I();
20.	 stImageSize.nWidth = ImageWidth;
21.	 stImageSize.nHeight = ImageHeight;
22.	 BasicParam.RunImageSize = stImageSize;
23.	 BasicParam.FixMode = MVD_POSFIX_MODE.MVD_POSFIX_MODE_HVA;
24.	 PosFixToolObj.BasicParam.InitialShape = SrcRegionROI;
25.	 PosFixToolObj.Run();
26.	 DesRegionROI = PosFixToolObj.Result.CorrectedShape;

问题根因
不熟悉位置修正算子工具使用方法

3.3.2 模板保存:实现模板自动加载的方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
问题:用户在使用算子SDK开发的模板匹配功能时,希望能在程序运行时可以自动加载之前训练过的模板。
解答
可以使用模板的导入导出方法,步骤如下:
第一步:程序初始化时导入模板

1.	C# 
2.	 
3.	public FrmMain()
4.	{
5.	    InitializeComponent();
6.	    if (File.Exists(savePatternPath))//判断文件是否存在
7.	    {
8.	        pattern.ImportPattern(savePatternPath);
9.	    }
10.	}

第二步:加载模板训练窗口时进行赋值

11.	C# 
12.	 
13.	private void FrmTempleteMatch_Load(object sender, EventArgs e)
14.	{
15.	    mvdAlmightyPatternEdit1.SetSubject(savePattern);
16.	}

第三步:在关闭训练窗口时导出模板:

17.	C# 
18.	 
19.	private void FrmTempleteMatch_FormClosing(object sender, FormClosingEventArgs e)
20.	{
21.	    savePattern.ExportPattern(savePatternPath);
22.	}

问题根因
不熟悉SDK算子的相关方法。

3.3.3 模板匹配: 获取模板匹配框和轮廓点的方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:如何获取模板匹配轮廓点?
解答
依次实例化模板匹配工具、设置输入图像、设置ROI、运行、获取匹配点、轮廓点,示例代码如下:

C#
cHPFeaturePattern = new CHPFeaturePattern();
cHPFeaturePatMatchTool.InputImage = cMvdImage;
cHPFeaturePatMatchTool.Pattern = cHPFeaturePattern;
cHPFeaturePatMatchTool.ROI = cROI;
cHPFeaturePatMatchTool.BasicParam.ShowOutlineStatus = true; // 显示轮廓
cHPFeaturePatMatchTool.Run();
CHPFeaturePatMatchResult cHPFeaturePatMatchResult = cHPFeaturePatMatchTool.Result;
var OutlineList = cHPFeaturePatMatchResult.OutlineList;
foreach (var item in cHPFeaturePatMatchResult.MatchInfoList)
{
    var matchBox = new CMvdRectangleF(item.MatchBox.CenterX, item.MatchBox.CenterY, item.MatchBox.Width, item.MatchBox.Height);
    matchBox.Angle = item.MatchBox.Angle;
    matchBox.BorderColor = new MVD_COLOR(255, 0, 0, 255);
    mvdRenderActivex1.AddShape(matchBox);
}
if (cHPFeaturePatMatchTool.BasicParam.ShowOutlineStatus)
{
    foreach (var item in cHPFeaturePatMatchResult.OutlineList)
    {
        CMvdPointSetF pointSetG = new CMvdPointSetF();
        CMvdPointSetF pointSetY = new CMvdPointSetF();
        CMvdPointSetF pointSetR = new CMvdPointSetF();
        foreach (var point in item.EdgePointList)
        {
            if (0 == point.Score)
            {
                pointSetG.AddPoint(point.Position.fX, point.Position.fY);
            }
            else if (1 == point.Score)
            {
                pointSetY.AddPoint(point.Position.fX, point.Position.fY);
            }
            else if (2 == point.Score)
            {
                pointSetR.AddPoint(point.Position.fX, point.Position.fY);
            }
        }
        pointSetG.BorderColor = new MVD_COLOR(0, 255, 0, 255);//绿色得分高的点
        pointSetY.BorderColor = new MVD_COLOR(255, 255, 0, 255);//黄色得分低的点
        pointSetR.BorderColor = new MVD_COLOR(255, 0, 0, 255);//红色丢弃的点

        if (0 != pointSetG.PointsList.Count)
        {
            mvdRenderActivex1.AddShape(pointSetG);
            matchOutlineList.Add(pointSetG);
        }
		if (0 != pointSetY.PointsList.Count)
        {
            mvdRenderActivex1.AddShape(pointSetY);
            matchOutlineList.Add(pointSetY);
        }
		if (0 != pointSetR.PointsList.Count)
        {
            mvdRenderActivex1.AddShape(pointSetR);
            matchOutlineList.Add(pointSetR);
        }
    }
}

问题根因
不熟悉如何获取匹配框和匹配点

3.3.4 模板训练:模板训练执行完成的判断方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象: 算子SDK开发打开模板匹配后未训练模板,但模板状态不为null。.
解答
模板是否训练完成的条件不应以模板是否等于null来判断,模板是否训练成功以模板的结果来判断,C#代码如下:

1.	C#
2.	 
3.	if(pattern != null){}//判断模板是否为空
4.	if(pattern.ReginList.Count != 0){}//判断模板训练的区域个数是否为0
5.	if( pattern1.GetPatternResult() != null){}//判断模板是否训练成功

问题根因
不熟悉SDK算子的相关方法。

3.3.5 图像相减:算子SDK开发图像相减的方法

描述
环境:MVDAlgrithm SDK3.4及以上+ VS2013及以上
现象:WinForm下的算子SDK图像相减的使用方法
解答
WinForm下进行算子SDK开发时图像相减的使用方法,先定义一个图像基准图像CMvdImageimage1,图像修正后的图像CMvdImage image2,注意,image2是图像修正后的图像。

1.	C#
2.	
3.	if (image1.Width == image2.Width && image1.Height == image2.Height && image1.PixelFormat == image2.PixelFormat)
4.	{
5.	   CMvdImage diffImage = new CMvdImage();
6.	   diffImage.InitImage(image1.Width,image1.Height, image1.PixelFormat);
7.	   for (uint row = 0; row < image1.Height; row++)
8.	   {
9.	      uint nStep = image1.GetImageData(0).nRowStep;
10.	      for (uint col = 0; col < nStep; col++)
11.	      {
12.	         diffImage.GetImageData(0).arrDataBytes[row * nStep + col] = (byte)Math.Abs(image1.GetImageData(0).arrDataBytes[row * nStep + col] -image2.GetImageData(0).arrDataBytes[row * nStep + col]);
13.	      }
14.	   }
15.	   return diffImage;
16.	}

问题根因
不熟悉SDK算子的相关方法。

3.3.6 图像修正:图像修正工具的使用方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:算子SDK开发图像修正的使用方法
解答
首先将工具实例化、工具参数赋值,示例代码如下

1.	C# 
2.	 
3.	CImageFixtureTool tool = new CImageFixtureTool();
4.	tool.InputImage = inputImage;
5.	tool.BasicParam.FixMode = MVD_IMGFIX_MODE.MVD_IMGFIX_MODE_HVA;
6.	tool.BasicParam.BasePoint = new VisionDesigner.ImageFixture.MVD_FIDUCIAL_POINT_F(basePoint, baseAngle);//基准点
7.	tool.BasicParam.RunningPoint = new VisionDesigner.ImageFixture.MVD_FIDUCIAL_POINT_F(runPoint, runAngle);//运行点
8.	tool.Run();

问题根因
不熟悉SDK算子的相关方法。

3.3.7 Blob工具:Blob工具的使用方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:算子SDK开发Blob工具的使用方法
解答
首先将工具实例化、工具参数赋值,然后使用位置修正工具进行位置修正,最后绘制Blob框。示例代码如下

1.	C# 
2.	CBlobFindTool tool = new CBlobFindTool();
3.	tool.BasicParam.ShowOutlineStatus = true;
4.	tool.BasicParam.ShowBlobImageStatus = true;
5.	tool.InputImage = inputImage;
6.	if (BlobRoi != null){  tool.ROI = BlobRoi;}
7.	tool.SetRunParam("Polarity", "BrightObject");//Blob工具参数设置
8.	tool.SetRunParam("LowThreshold", "180");
9.	tool.SetRunParam("HightThreshold", "255");
10.	tool.SetRunParam("MinArea", "5");
11.	tool.SetRunParam("MaxArea", "5000");
12.	tool.Run();
13.	List<CBlobInfo> blobInfoList = tool.Result.BlobInfo;
14.	CPositionFixTool fixTool = new CPositionFixTool();//位置修正
15.	fixTool.BasicParam.BasePoint = new VisionDesigner.PositionFix.MVD_FIDUCIAL_POINT_F(basePoint, baseAngle);
16.	fixTool.BasicParam.RunImageSize = new MVD_SIZE_I((int)inputImage.Width, (int)inputImage.Height);
17.	mvdRenderActivex1.ClearShapes();
18.	foreach (var blobInfo in blobInfoList)//绘制blob框数据
19.	{
20.	     CMvdRectangleF rectangleF = blobInfo.BoxInfo;
21.	     rectangleF.BorderColor = new MVD_COLOR(0xFF, 0x00, 0x00);
22.	     rectangleF.BorderWidth = 2;
23.	     fixTool.BasicParam.InitialShape = rectangleF;
24.	     fixTool.BasicParam.RunningPoint = new VisionDesigner.PositionFix.MVD_FIDUCIAL_POINT_F(runPoint, runAngle);
25.	     fixTool.BasicParam.FixMode = MVD_POSFIX_MODE.MVD_POSFIX_MODE_HVA;
26.	     fixTool.Run();
27.	     mvdRenderActivex1.AddShape(fixTool.Result.CorrectedShape);
28.	}

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

3.3.8 点点测量:点点测量工具的使用方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:算子SDK开发点点测量工具的使用方法
解答
首先将工具实例化,然后选择两个点,下面以测量两个圆的圆心距为例,示例代码如下

1.	C# 
2.	 
3.	float distance;
4.	VisionDesigner.P2PMeasure.CP2PMeasureTool cP2PMeasureTool = new VisionDesigner.P2PMeasure.CP2PMeasureTool;
5.	cP2PMeasureTool.BasicParam.Point1 = cCirFindTool1.Result.CircleCenter;
6.	cP2PMeasureTool.BasicParam.Point2 = cCirFindTool2.Result.CircleCenter;
7.	cP2PMeasureTool.Run();
8.	distance= cP2PMeasureTool.Result.Dist();    

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

3.3.9 亮度测量:亮度测量工具的使用方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:算子SDK开发亮度测量工具的使用方法
解答
首先将工具实例化,输入图片,最后设置ROI参数,示例代码如下:

1.	C# 
2.	 
3.	VisionDesigner.IntensityTool.CIntensityToolTool cIntensityToolTool = newVisionDesigner.IntensityTool.CIntensityToolTool();
4.	VisionDesigner.CMvdImage InputImg = new CMvdImage();
5.	InputImg.InitImage("Input.bmp");
6.	cIntensityToolTool.InputImage = InputImg;
7.	cIntensityToolTool.ROI = new VisionDesigner.CMvdRectangleF(InputImg.Width / 2, InputImg.Height / 2, InputImg.Width / 4, InputImg.Height / 4);
8.	cIntensityToolToolObj.Run();

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

3.3.10 圆查找:圆查找的方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:WinForm下的算子SDK圆查找的使用方法
解答
WinForm下进行算子SDK开发时圆查找的使用方法
第一步,初始化参数列表让用户修改参数。
第二步,加载图像,设置ROI等参数,执行找圆操作。

1.	C#
2.	//第一步,初始化参数
3.	try
4.	{
5.	   VisionDesigner.CircleFind.CCircleFindTool m_cCircleFindToolObj =newVisionDesigner.CircleFind.CCircleFindTool();
6.	   //Set input image
7.	   VisionDesigner.CMvdImage cInputImg = new CMvdImage();
8.	   cInputImg.InitImage("InputTest.bmp");
9.	   m_cCircleFindToolObj.InputImage = cInputImg;
10.	   // Set ROI region (optional)
11.	   m_cCircleFindToolObj.ROI = new VisionDesigner.CMvdRectangleF(cInputImg.Width / 2, cInputImg.Height / 2, cInputImg.Width / 4, cInputImg.Height / 4);
12.	   //保存参数设置
13.	   byte[] fileBytes = new byte[256];
14.	   uint nConfigDataSize = 256;
15.	   uint nConfigDataLen = 0;
16.	   try
17.	   {
18.	     m_cCircleFindToolObj.SaveConfiguration(fileBytes, nConfigDataSize, ref nConfigDataLen);
19.	   }
20.	   catch (MvdException ex)
21.	   {
22.	      if (MVD_ERROR_CODE.MVD_E_NOENOUGH_BUF == ex.ErrorCode)
23.	      {
24.	         fileBytes = new byte[nConfigDataLen];
25.	         nConfigDataSize = nConfigDataLen;
26.	         m_cCircleFindToolObj.SaveConfiguration(fileBytes, nConfigDataSize, ref nConfigDataLen);
27.	      }
28.	      else
29.	      {
30.	         throw ex;
31.	      }
32.	   }
33.	}
34.	//第二步,加载图片并运行
35.	m_cCircleFindToolObj.Run();
36.	//输出结果
37.	CCircleFindResult circleFindResult = m_CircleFindTool.Result;

问题原因
参数设置错误

3.3.11 仿射变换:图像仿射变换的使用方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:WinForm下的算子SDK图像仿射变换的使用方法
解答
WinForm下进行算子SDK开发时图像仿射变换的使用方法
第一步,初始化参数列表修改参数
第二步,加载图像,使用当前的参数设置运行工具

1.	C#
2.	 
3.	//第一步,设置参数
4.	//定义仿射变换工具对象
5.	m_stImageAffineTransformToolObj = new CImageAffineTransformTool();
6.	//可修改参数
7.	byte[] fileBytes = new byte[256];
8.	uint nConfigDataSize = 256;
9.	uint nConfigDataLen = 0;
10.	//保存参数
11.	m_stImageAffineTransformToolObj.SaveConfiguration(fileBytes, nConfigDataSize, ref nConfigDataLen);
12.	//设置运行参数,输入图像,ROI面积等,运行
13.	m_stImageAffineTransformToolObj.BasicParam.Aspect = fAspectValue;
14.	m_stImageAffineTransformToolObj.InputImage = m_stInputImage;
15.	m_stImageAffineTransformToolObj.ROIShape = cDefaultRect;
16.	m_stImageAffineTransformToolObj.Run();
17.	//输出结果
18.	CMvdImage stOutputImage = m_stImageAffineTransformToolObj.Result.OutputImage;

问题原因
参数设置错误或者缺少参数设置

3.3.12 直线查找:直线查找工具的使用方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:如何进行直线查找
解答
使用直线查找工具进行直线查找,在算子SDK开发中,工具入口为xxxTool,则直线查找的工具入口为CEdgeFindTool,首先定义接口对象,然后在图片上设置待直线查找的ROI区域,最后通过接口函数Run就可以获得直线的相关结果。

1.	C# 
2.	// 创建对象
3.	VisionDesigner.EdgeFind.CEdgeFindTool cEdgeFindToolObj = new VisionDesigner.EdgeFind.CEdgeFindTool();
4.	// 给定输入图片
5.	VisionDesigner.CMvdImage cInputImg = new CMvdImage();
6.	cInputImg.InitImage("..\\InputTest.bmp");
7.	cEdgeFindToolObj.InputImage = cInputImg;
8.	// 设置ROI
9.	cEdgeFindToolObj.ROI = new VisionDesigner.CMvdRectangleF(cInputImg.Width / 2, cInputImg.Height / 2, cInputImg.Width / 4, cInputImg.Height / 4);
10.	// 运行
11.	cEdgeFindToolObj.Run();
12.	// 获取结果
13.	VisionDesigner.EdgeFind.CEdgeFindResult cEdgeFindRes = cEdgeFindToolObj.Result;
14.	Console.WriteLine("The number of edge: {0}", cEdgeFindRes. SingleEdgeInfo.Count);
15.	List lcEdgePtInfo = cEdgeFindRes.SingleEdgeInfo;
16.	foreach (CEdgeFindSingleEdgeInfo cCurEdgePt in lstEdgePtInfo)
17.	{
18.	    Console.WriteLine("EdgePoint: {0}, Sore={1}", cCurEdgePt.Score);
19.	}

问题根因
不熟悉直线查找工具的使用。

3.3.13 缺陷检测:直线边缘缺陷检测工具的使用方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:算子SDK开发直线边缘缺陷检测的使用方法
解答
首先将直线边缘缺陷检测工具实例化,然后设置输入图片并选择ROI区域,最后获取结果,示例代码如下

1.	C# 
2.	VisionDesigner.LineEdgeFlawInsp.CLineEdgeFlawInspTool cLineEdgeFlawInspToolObj = new VisionDesigner.LineEdgeFlawInsp.CLineEdgeFlawInspTool();//工具实例化
3.	VisionDesigner.CMvdImage InputImg = new CMvdImage();
4.	InputImg.InitImage("InputTest.bmp");//设置输入图片
5.	cLineEdgeFlawInspToolObj.InputImage = InputImg;
6.	cLineEdgeFlawInspToolObj.ROI = new VisionDesigner.CMvdRectangleF(InputImg.Width / 2, InputImg.Height / 2, InputImg.Width / 4, InputImg.Height / 4);//选择ROI区域;
7.	cLineEdgeFlawInspToolObj.Run();//工具执行
8.	VisionDesigner.LineEdgeFlawInsp.CLineEdgeFlawInspResult cLineEdgeFlawInspRes = cLineEdgeFlawInspToolObj.Result;//获取结果
9.	String message= "缺陷数":+ cLineEdgeFlawInspRes.FlawInfoList.Count.Tostring();   

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

3.3.14 N点标定:N点标定的使用方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:算子SDK开发N点标定的使用方法
解答
首先记录文本输入的坐标图像点a、b与物理点c、d,最少需要4组点,如图可每输入一组点点击确认,输入点个数大于等于4时,可点击生成标定文件(CalibRun=true),示例代码如下

1.	C# 
2.	VisionDesigner.NPointCalib.CNPointCalibTool cNPointCalibToolObj =new VisionDesigner.NPointCalib.CNPointCalibTool();//工具实例化
3.	cNPointCalibToolObj.BasicParam.CameraMode = VisionDesigner.NPointCalib.MVD_CAMERA_MODE.MVD_CAMERA_MODE_MOVE;//基本参数设置
4.	MVD_CALIB_POINT_F stCalibPoint = new MVD_CALIB_POINT_F();
5.	stCalibPoint.stImageCoordinate.fX = a;
6.	stCalibPoint.stImageCoordinate.fY = b;//图像点
7.	stCalibPoint.stWorldCoordinate.fX = c;
8.	stCalibPoint.stWorldCoordinate.fY = d;//物理点
9.	cNPointCalibToolObj.BasicParam.OffsetPointList.Add(stCalibPoint);
10.	//至少需要4组点
11.	if (cNPointCalibToolObj.BasicParam.OffsetPointList.Count>=4&&CalibRun==true)
12.	{
13.	     cNPointCalibToolObj.Run();//执行
14.	     VisionDesigner.NPointCalib.CNPointCalibResult cNPointCalibRes = cNPointCalibToolObj.Result;//获取标定结果
15.	     CalibRun = false;
16.	     if(cNPointCalibRes.OffsetPointCalibInfo.HomoEstStatus!=0)
17.	     {
18.	        cNPointCalibToolObj.ExportCalibFile("E://新建文件夹//calib.iccal");
19.	     }                        
20.	}

在这里插入图片描述

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

3.3.15 畸变校正:畸变校正的使用方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:算子SDK开发畸变校正的使用方法
解答
首先将畸变校正工具实例化,然后设置输入图片并选择标定文件,最后获取结果,示例代码如下

1.	C# 
2.	VisionDesigner.ImageCorrectCalib.CImageCorrectCalibTool cImageCorrectCalibToolObj = new VisionDesigner.ImageCorrectCalib.CImageCorrectCalibTool ();
3.	VisionDesigner.CMvdImage cInputImg = new CMvdImage();
4.	cInputImg.InitImage("InputTest.bmp");
5.	cImageCorrectCalibToolObj.InputImage = cInputImg;
6.	cImageCorrectCalibToolObj.ImportCalibFile("calib.iccal");//选择标定文件
7.	cImageCorrectCalibToolObj.Run();
8.	VisionDesigner.ImageCorrectCalib.CImageCorrectCalibResult cImageCorrectCalibRes = cImageCorrectCalibToolObj.Result;

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

3.3.16 字符识别:多线程同时读取同一个本地模型的方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:多线程如何调用本地同一个模型。
解答
读取本地模型数据,在经过深拷贝后,使用LoadModelData接口调用模型。

C#
for (int i = 0; i < 3; i++)
{
int temp = i;
Task.Factory.StartNew(new Action<object>(t => 
{
FileStream fs = new FileStream(modelpath, FileMode.Open);
long size = fs.Length;
byte[] array = new byte[size];
fs.Read(array, 0, array.Length);
CNNOCRTool tool = new CNNOCRTool(MVD_ALGORITHM_PLATFORM_TYPE.MVD_ALGORITHM_PLATFORM_CPU);
byte[] ModelArray= new byte[array.Length];
Array.Copy(array, ModelArray, array.Length);
tool.BasicParam.LoadModelData(ModelArray, ModelArray.Length);
//设置图片等参数
tool.Run();

}), temp);
}

问题根因
不熟悉多线程同时读取同一个本地模型

3.3.17 字符识别:VM自带字符识别模型的区分

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:安装VM和深度学习包之后,VM安装路径下的字符识别模块有两个模型:lpr_ocr.bin和mvb_ocr.bin,分别对应哪个算子。
解答
VM安装路径中,字符识别模块中有两个已经训练好的模型:lpr_ocr.bin和mvb_ocr.bin,分别对应训练平台-字符识别的字符模型类型:文本行识别和文本行识别(拓展)。
在这里插入图片描述

在VM中,使用字符识别模块,两个模型都可以可以调;
在算子SDK开发中,针对自带的两个模型,字符识别算子调用规则是,CNNOCRTool算子调用模型lpr_ocr.bin,CNNCharRecogTool算子调用mvb_ocr.bin。
问题根因
不熟悉字符识别模型。

3.3.18 设置掩膜:给模块设置掩膜的方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:如何给模块设置掩膜(针对需要设置多个感兴趣区域及屏蔽区域场景可通过掩膜设置)?
解答
通过掩膜算子CPreproMaskTool获取掩模图像,例如给Blob分析模块设置掩膜示例代码如下;

C#
public void SetBlobMask()
{
    //实例掩膜工具
    CPreproMaskTool cPrepromaskTool = new CPreproMaskTool();
    //创建Shape链表
    List<Tuple<CMvdShape, bool>> maskList = new List<Tuple<CMvdShape, bool>>();
    var rect1 = new CMvdRectangleF(rect.CenterX, rect.CenterY, rect.Width - 200, rect.Height - 200);
    //添加矩形感兴趣区域
    maskList.Add(new Tuple<CMvdShape, bool>(rect1, false));
    var poly1 = new CMvdPolygonF();
    poly1.AddVertex(rect.CenterX - rect.Height / 2, rect.CenterY - rect.Width / 2);
    poly1.AddVertex(rect.CenterX - rect.Height / 2, rect.CenterY - rect.Width / 2 + 200);
    poly1.AddVertex(rect.CenterX - rect.Height / 2 + 200, rect.CenterY - rect.Width / 2);
    //添加多边形感兴趣区域
    maskList.Add(new Tuple<CMvdShape, bool>(poly1, false));
    var poly2 = new CMvdPolygonF();
    poly2.AddVertex(rect.CenterX - rect.Height / 2, rect.CenterY + rect.Width / 2);
    poly2.AddVertex(rect.CenterX - rect.Height / 2, rect.CenterY + rect.Width / 2 - 200);
    poly2.AddVertex(rect.CenterX - rect.Height / 2 + 200, rect.CenterY + rect.Width / 2);
    //添加多边形屏蔽区域
    maskList.Add(new Tuple<CMvdShape, bool>(poly2, true));
    //设置掩膜工具参数
    cPrepromaskTool.InputImage = runImage;
    cPrepromaskTool.RegionList = maskList;
    //运行掩膜工具
    cPrepromaskTool.Run();
    //实例化Blob分析工具
    CBlobFindTool blobTool = new VisionDesigner.BlobFind.CBlobFindTool();
    blobTool.InputImage = runImage;
    //设置掩膜图像
    blobTool.RegionImage = cPrepromaskTool.OutputImage;
    blobTool.SetRunParam("LowThreshold", "60");
    blobTool.SetRunParam("Polarity", "BrightObject");
    blobTool.BasicParam.ShowBlobImageStatus = true;
    //执行Blob算子
    blobTool.Run();
}

问题根因
不熟悉掩膜工具的使用。


http://www.kler.cn/a/15700.html

相关文章:

  • rk3399开发环境使用Android 10初体验蓝牙功能
  • 实战:一文讲透模糊匹配的三种方式的区别
  • 狼蛛F87Pro键盘常用快捷键的使用说明
  • ollama+springboot ai+vue+elementUI整合
  • 摘要与登记
  • 丹摩征文活动 |【前端开发】HTML+CSS+JavaScript前端三剑客的基础知识体系了解
  • 揭秘!我用AI写了一部精彩小说;搭建AI视频创作工作流;一键生成摘要工具清单;大模型创业生死5问 | ShowMeAI日报
  • 〔金融帝国实验室〕(Capitalism Lab)v9.0.00官方重大版本更新!
  • 如何保障网络安全
  • 【计算机网络】网络命令的使用
  • Mysql在大表中删除大量数据的优化
  • C++内存管理之拷贝memcpy、分配malloc 与释放free
  • 人工智能课程笔记(7)强化学习(基本概念 Q学习 深度强化学习 附有大量例题)
  • Ficus: 一款 markdown 编辑管理软件
  • 生成式AI火爆全球,你是否已经做好了准备?
  • Android | View.post 到底是在什么时候执行的
  • Linux网络——Shell编程规范与变量
  • 英语基础-介词
  • 深入浅出Java中参数传递的原理
  • 这4种情况,请直接跳槽!程序员跳槽指南
  • LED子系统
  • C. Multiplicity(DP + 分解因数)
  • Java多线程中Lock的使用
  • 9.pytorch lightning之数据模块LightningDataModule
  • mysql笔记
  • python实战应用讲解-【numpy数组篇】常用函数(六)(附python示例代码)