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

news2024/12/22 23:23:21

目录

  • 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.coloradmin.cn/o/473925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈软件质量与度量

本文从研发角度探讨下高质量软件应具备哪些特点&#xff0c;以及如何度量软件质量。 软件质量的分类 软件质量通常可以分为&#xff1a;内部质量和外部质量。 内部质量 内部质量是指软件的结构和代码质量&#xff0c;以及其是否适合维护、扩展和重构。它关注的是软件本身的…

数据结构 | 常见的数据结构是怎样的?

本文简单总结数据结构的概念及常见的数据结构种类 1’ 2。 更新&#xff1a;2023 / 04 / 05 数据结构 | 常见的数据结构是怎样的&#xff1f; 总览概念分类 常用的数据结构数组链表跳表栈队列树二叉树完全二叉树、满二叉树 平衡二叉树单旋转左旋右旋 红黑树红黑树 V.S 平衡二叉…

2 天:我用文字 AI-ChatGPT 写了绘画 AI-Stable Diffusion 跨平台绘画应用

文本 AI - ChatGPT 和绘画 AI - Stable Diffusion&#xff0c;平地惊雷&#xff0c;突然进入寻常百姓家。 如果时间可以快进&#xff0c;未来的人们对于我们这段时光的历史评价&#xff0c;大概会说&#xff1a; 当时的人们在短时间连续经历了这几种情感。从不信&#xff0c;…

java多线程BlockingDeque的三种线程安全正确退出方法

本文介绍两种BlockingDeque在多线程任务处理时正确结束的方法 一般最开始简单的多线程处理任务过程 把总任务放入BlockingDeque创建多个线程&#xff0c;每个线程内逻辑时&#xff0c;判断BlockingDeque任务是否处理完&#xff0c;处理完退出&#xff0c;还有任务就BlockingDe…

对顶堆模板!!【DS对顶堆】ABC281 E - Least Elements

我想的思路和正解是差不多的 就是滑动窗口&#xff0c;每过去一个用DS维护一下前k个元素和sum 本来想的是用优先队列维护前k个 然后想着multiset维护前k个&#xff0c;但是具体不知道怎么操作 这里用的是multiset维护对顶堆 关于对顶堆&#xff0c;我在寒假的时候总结过 …

【Java笔试强训】(1)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f9be;&#x1f9be;&#x1f9be; 目录 一、选择题 二、编程题 &#x1f525;组队竞…

Github创建一个新仓库,关联本地数据并上传文件的图文步骤

工作中&#xff0c;我们经常会使用github来承享别人的代码果实&#xff0c;同时我们也会把自己的成果分享给别人&#xff0c;互相帮助。 今天的这篇图文教程非常重要&#xff0c;目标是使用Github来创建一个远程仓库&#xff0c;并和本地仓库对接&#xff0c;同时要做上传新内容…

初始Vue3【Vue3】

1.Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09;耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址&#xff1a;https://github.com/vuejs/vue-next/releases/tag/v3.0.0 …

使用docker容器化部署mysql8.0.27,并更改其默认端口3306为3306全流程记录。

使用docker容器化部署mysql8.0.27,并更改其默认端口3306为3306全流程记录。 1.创建镜像 #查看镜像 docker images|grep mysql #搜索镜像 docker search mysql #拉取镜像 docker pull mysql&#xff1a;latest #运行镜像&#xff0c;--name 后的参数自己命名&#xff0c;我的数…

js逆向之rpc远程调用(你强任你强,我无视一切)

一、找到加密函数位置 二、在其下面注入ws服务 &#xff08;1)注入准备 资源>>替换>>随便选一个空文件夹 &#xff08;2&#xff09;进行注入 进行&#xff08;1&#xff09;操作后可直接编辑js代码了&#xff0c;做以下修改 (function() {var ws new WebSocket(…

ChatGPT实现代码生成

代码生成 就代码生成而言&#xff0c;ChatGPT 是一款卓越的工具&#xff0c;它为开发者提供强大的功能。ChatGPT 可以运用其出色的自然语言处理技术&#xff0c;深入理解和解释开发者的需求&#xff0c;快速生成适合的代码片段。对于那些繁琐的任务或者重复的代码&#xff0c;…

肝一肝设计模式【三】-- 原型模式

系列文章目录 肝一肝设计模式【一】-- 单例模式 传送门 肝一肝设计模式【二】-- 工厂模式 传送门 文章目录 系列文章目录前言一、什么是原型模式二、浅克隆三、深克隆写在最后 前言 前文中我们知道设计模式可以分为三大类&#xff1a;创建型模式、结构型模式、行为型模式。创…

Baumer工业相机堡盟相机如何使用偏振功能(偏振相机优点和行业应用)(C#)

项目场景&#xff1a; Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0…

tp6.1 bingher/ueditor(百度编辑器)(七牛、阿里OSS第三方云)详情图文教程(2023年第二版)

之前做过一版&#xff1a;tp6 bingher/ueditor(百度编辑器)(七牛、阿里OSS第三方云)详情图文教程_我是高手高手高高手的博客-CSDN博客 登录权限是Session&#xff0c;现在系统是Cookie加jwt的Token方式验证 一、修改验证登录权限 修改文件&#xff1a; vendor\bingher\uedito…

react native ios 添加启动页 xcode14 react-native-splash-screen

最近更新xcode&#xff0c;有些配置有些不同&#xff0c;网上查的方法都是过时的&#xff0c;导致配了一段时间卡在这里&#xff0c;最后访问官网才弄好了&#xff0c;所以以后解决问题的办法先看官网再查其他各路神仙的办法。 官网的步骤&#xff1a;https://github.com/crazy…

ChatGPT原理剖析

文章目录 ChatGPT常见误解1. 罐头回应2. 网络搜寻重组 ChatGPT真正做的事——文字接龙ChatGPT背后的关键技术——预训练&#xff08;Pre-train&#xff09;一般机器是怎样学习的&#xff1f; ChatGPT带来的研究问题1. 如何精准提出需求2. 如何更改错误3. 侦测AI生成的物件4. 不…

众人围剿,GPT-5招惹了谁

目录 千人呼吁暂停AI训练代表人物分析反对原因分析信息安全人身安全失业利益 总结 GPT-4 火爆全球&#xff0c;引发了人工智能大浪潮。过去的一个月&#xff0c;OpenAI、微软、谷歌加上百度不断释放王炸&#xff0c;所有人都相信&#xff0c;AI 的就是未来的生产力。俗话说&…

如何在本地搭建Maven环境并整合进IDEA中以及创建web工程?【2023最新版】

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 目录 一. 为什么要使用Maven&#xff1f;1.1 获取jar包1.2 添加jar包1.3 使用Maven便于解决jar包冲突及依赖问题 二. 什么是Maven?三. 如何…

Elasticsearch查询文档--常见API篇(附详细代码和案例图文)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将介绍Elasticsearch在Java中的几种API的使用&#xff0c;这块内容不作为面试中的重点。 如果文章有什么需要改进的地方还请大佬不吝赐教&#x1f44f;&#x1f4…

Linux Ansible任务控制(循环判断、处理程序、失败任务)

目录 Ansible的Loop循环 简单的Loop循环 数组列表方式的Loop循环 字典方式的Loop循环 基于外部变量的Loop循环 Ansible的When判断 通过魔法变量、事实变量作为条件 通过剧本执行结果的变量来作为条件 Ansible处理程序 Ansible处理失败任务 处理失败任务ignore_error…