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"; /// /// 搜索区域 /// public HObject SearchRegion { get; set; } /// /// 二维码搜索区域 /// public HObject BarCodeRegion { get; set; } /// /// ROI区域 /// public HObject RoiRegion { get; set; } /// /// 移除的区域 /// public HObject RemovedRegion { get; set; } /// /// 最终的模板区域 /// 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; } } /// /// 模板图片 /// 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; } public int Exposure { get; set; } = 50; public int Gain { get; set; } = 0; /// /// 模板中心X /// public double ModelCenterX { get; set; } /// /// 模板中心Y /// 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()); ini.WriteValue("ModelParam", "Exposure", Exposure.ToString()); ini.WriteValue("ModelParam", "Gain", Gain.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"); } //保存二维码区域 if (BarCodeRegion != null && BarCodeRegion.CountObj() > 0) { HOperatorSet.WriteRegion(BarCodeRegion, savePath + "\\" + "barcode.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; } } }