You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
5.4 KiB
C#

2 years ago
using HalconDotNet;
using Rs.Framework;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Rs.MotionPlat.Commom
{
public class ProductModel
{
public string ModelName { get; set; } = "default";
/// <summary>
/// 搜索区域
/// </summary>
public HObject SearchRegion { get; set; }
/// <summary>
/// ROI区域
/// </summary>
public HObject RoiRegion { get; set; }
/// <summary>
/// 移除的区域
/// </summary>
public HObject RemovedRegion { get; set; }
/// <summary>
/// 最终的模板区域
/// </summary>
public HObject FinalRegion
{
get {
if(RoiRegion != null && RoiRegion.CountObj()>0) {
if (RemovedRegion != null && RemovedRegion.CountObj() > 0)
{
HOperatorSet.Difference(RoiRegion, RemovedRegion, out HObject diffRegion);
return diffRegion;
}
return RoiRegion;
}
return null;
}
}
/// <summary>
/// 模板图片
/// </summary>
public HObject TemplateImage { get; set; }
public HObject SourceImage { get; set; }
public int Contrast { get; set; }
public int AngleStart { get; set; }
public int AngleExtent { get; set; }
public double Score { get; set; }
/// <summary>
/// 模板中心X
/// </summary>
public double ModelCenterX { get; set; }
/// <summary>
/// 模板中心Y
/// </summary>
public double ModelCenterY { get; set; }
public int SaveModel(string savePath)
{
//string dirPath = Path.Combine(GlobalVar.RecipeDir, ItemName);
if(!Directory.Exists(savePath))
{
Directory.CreateDirectory(savePath);
}
IniHelper ini = new IniHelper(Path.Combine(savePath, "default.ini"));
ini.WriteValue("ModelParam", "Contrast", Contrast.ToString());
ini.WriteValue("ModelParam", "AngleStart", AngleStart.ToString());
ini.WriteValue("ModelParam", "AngleExtent", AngleExtent.ToString());
ini.WriteValue("ModelParam", "Score", Score.ToString());
//保存原图
string dirname = Path.Combine(savePath);
if(!Directory.Exists(dirname))
{
Directory.CreateDirectory(dirname);
}
if(SourceImage!= null && SourceImage.CountObj()>0)
{
HOperatorSet.WriteImage(SourceImage, "bmp", 0, savePath + "\\" + ModelName);
}
else
{
return -1;
}
//保存ROI区域
if (SearchRegion != null && SearchRegion.CountObj() > 0)
{
HOperatorSet.WriteRegion(SearchRegion, savePath + "\\" + "search.reg");
}
//保存ROI区域
if (RoiRegion!=null && RoiRegion.CountObj()>0)
{
HOperatorSet.WriteRegion(RoiRegion, savePath + "\\" + "roi.reg");
}
else { return -1; }
if (RemovedRegion != null && RemovedRegion.CountObj() > 0)
{
//保存Removed区域
HOperatorSet.WriteRegion(RemovedRegion, savePath + "\\" + "remove.reg");
}
//保存最后的区域
if (FinalRegion != null && FinalRegion.CountObj() > 0)
{
//保存Removed区域
HOperatorSet.WriteRegion(FinalRegion, savePath + "\\" + "last.reg");
HOperatorSet.ReduceDomain(SourceImage, FinalRegion, out HObject image);
TemplateImage= image;
}
else { return -1; }
if (SourceImage != null && SourceImage.CountObj() > 0)
{
HOperatorSet.ReduceDomain(SourceImage, RoiRegion, out HObject imageReduaced);
//保存
HOperatorSet.WriteImage(imageReduaced, "bmp", 0, savePath + "\\" + "reduce");
}
//保存模板
HOperatorSet.CreateShapeModel(TemplateImage, "auto", AngleTool.Deg2Rad(AngleStart), AngleTool.Deg2Rad(Math.Abs(AngleExtent-AngleStart)), "auto", "auto", "use_polarity", new HTuple(Contrast), "auto", out HTuple modelID);
HOperatorSet.GetShapeModelContours(out HObject modelContours, modelID, 1);
HOperatorSet.FindShapeModel(SourceImage, modelID, AngleTool.Deg2Rad(double.Parse(AngleStart.ToString())), AngleTool.Deg2Rad(Math.Abs((double.Parse(AngleExtent.ToString()) - double.Parse(AngleStart.ToString())))), new HTuple(double.Parse(Score.ToString())), 1, 0.7, "least_squares", 0, 0.9, out HTuple row, out HTuple column, out HTuple angle, out HTuple score);
if (score != null && score.Length > 0)
{
HTuple hTuple = new HTuple();
hTuple.Append(row.DArr[0]);
hTuple.Append(column.DArr[0]);
hTuple.Append(angle.DArr[0]);
hTuple.Append(score.DArr[0]);
HOperatorSet.WriteTuple(hTuple, savePath + "//param.tup");
}
HOperatorSet.WriteShapeModel(modelID, $"{savePath}/model.shm");
return 0;
}
}
}