【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();
}
问题根因
不熟悉掩膜工具的使用。