using ChoiceTech.Halcon.Control; using HalconDotNet; using Rs.Camera; using Rs.Framework; using Rs.MotionPlat.Commom; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using static System.Net.Mime.MediaTypeNames; namespace Rs.MotionPlat { public enum ERoiShape { Rectange, Circle, Any } public partial class CameraTemplate : UserControl { ProductModel pm = new ProductModel(); HWindow winHandle = null; HObject hImage = null; HObject final_Region = new HObject(); public CameraTemplate() { InitializeComponent(); HikCamera.Instance.GrabOkEvent += Instance_GrabOkEvent; winHandle = hWindow_Final1.hWindowControl.HalconWindow; HOperatorSet.GenEmptyObj(out final_Region); } private void Instance_GrabOkEvent(int arg1, HObject arg2) { hImage = arg2; hWindow_Final1.HobjectToHimage(hImage); } HObject ho_image; private void btnLoadImage_Click(object sender, EventArgs e) { HOperatorSet.GenEmptyObj(out ho_image); OpenFileDialog fileOpen=new OpenFileDialog(); DialogResult dr = fileOpen.ShowDialog(); if(dr == DialogResult.OK) { string filename = fileOpen.FileName; HOperatorSet.ReadImage(out HObject img, filename); HOperatorSet.SetDraw(hWindow_Final1.hWindowControl.HalconWindow, "margin"); // HOperatorSet.DispCross(hWindow_Final1.hWindowControl.HalconWindow, hWindow_Final1.Width / 2, hWindow_Final1.Height / 2, 300, 0); hWindow_Final1.HobjectToHimage(img); ho_image = img; pm.SourceImage = ho_image; HOperatorSet.GetImageSize(pm.SourceImage,out HTuple imgWidth,out HTuple imgHeight); HOperatorSet.GenCrossContourXld(out HObject cross, imgHeight/2, imgWidth/2, Math.Max(imgHeight,imgWidth), 0); hWindow_Final1.DispObj(cross); } } private void btnGrab_Click(object sender, EventArgs e) { bGrabContinue = false; HikCamera.Instance.Grab("MV-CA050-10GM (00C32922251)"); } bool bGrabContinue = false; private void btnGrabContinue_Click(object sender, EventArgs e) { bGrabContinue = true; Task.Run(() => { while(bGrabContinue) { HikCamera.Instance.Grab("MV-CA050-10GM (00C32922251)"); Thread.Sleep(200); } }); } HObject imageReduced, partImage; private void btnCreateModel_Click(object sender, EventArgs e) { hWindow_Final1.Focus(); hWindow_Final1.DrawModel = true; //winHandle.SetColor("green"); //winHandle.SetDraw("margin"); //HTuple row = new HTuple(), column = new HTuple(), radius = new HTuple(); //HOperatorSet.DrawRegion(out final_Region, winHandle); //hWindow_Final1.DispObj(final_Region, "green"); //HTuple row1 = new HTuple(), col1 = new HTuple(), row2 = new HTuple(), col2 = new HTuple(); //HOperatorSet.DrawRectangle1(winHandle, out row1, out col1, out row2, out col2); // HObject rect = new HObject(); //HOperatorSet.GenEmptyObj(out rect); //HOperatorSet.GenRectangle1(out rect, row1, col1, row2, col2); //hWindow_Final1.DispObj(rect, "green"); //HOperatorSet.DispObj(rect, hWindow_Final1.hWindowControl.HalconWindow); try { winHandle.SetColor("green"); winHandle.SetDraw("margin"); HOperatorSet.GenEmptyObj(out imageReduced); HOperatorSet.GenEmptyObj(out partImage); HTuple row1 = new HTuple(), column1 = new HTuple(), row2 = new HTuple(), column2 = new HTuple(); HOperatorSet.DrawRectangle1(winHandle, out row1, out column1, out row2, out column2); HOperatorSet.GenRectangle1(out final_Region, row1, column1, row2, column2); pm.RoiRegion = final_Region; HOperatorSet.CropPart(ho_image, out partImage, row1, column1, column2 - column1, row2 - row1); HOperatorSet.ReduceDomain(ho_image,final_Region,out imageReduced); pm.TemplateImage= partImage; HOperatorSet.InspectShapeModel(imageReduced, out HObject shapeModel, out HObject modelRegions, 1, 30); hWindow_Final1.DispObj(modelRegions); hWindow_Final2.HobjectToHimage(partImage); HOperatorSet.SetColor(winHandle, "green"); //HOperatorSet.DispObj(pm.RoiRegion, winHandle); hWindow_Final1.DispObj(pm.RoiRegion); } catch (Exception) { } finally { hWindow_Final1.DrawModel = false; } } private void button4_Click(object sender, EventArgs e) { HObject removedRegion; HTuple hv_Button = null; HTuple hv_Row = null, hv_Column = null; HObject brushRegion, brushRegionAffine; HOperatorSet.GenCircle(out brushRegion, 50, 50, 20); HTuple brushRow, brushColumn, brushArea; //HOperatorSet.GenEmptyObj(out brushRegion); HOperatorSet.GenEmptyObj(out brushRegionAffine); HOperatorSet.GenEmptyObj(out removedRegion); hWindow_Final1.DrawModel = true; Task.Run(() => { hv_Button = 0; int a = 0; HOperatorSet.AreaCenter(brushRegion, out brushArea, out brushRow, out brushColumn); while(true) { try { HOperatorSet.GetMposition(winHandle, out hv_Row, out hv_Column, out hv_Button); } catch (Exception ex) { //MessageBox.Show(ex.Message); } if (removedRegion.IsInitialized()) { try { //////HOperatorSet.DispObj(final_region, Frm_ShapeMatchTool.Instance.hWindow_Final1.HWindowHalconID); HObject image1, image2, resultImage; resultImage = new HObject(); HObject iamgeR, iamgeG, iamgeB; //HOperatorSet.Decompose3(ho_image, out iamgeR, out iamgeG, out iamgeB); int c = removedRegion.CountObj(); if(c>0) { HOperatorSet.PaintRegion(removedRegion, ho_image, out image1, 120, "fill"); HOperatorSet.Compose3(image1, image1, ho_image, out resultImage); HOperatorSet.SetSystem("flush_graphic", "false"); HOperatorSet.DispObj(resultImage, winHandle); } //hWindow_Final1.HobjectToHimage(resultImage); if (hv_Row >= 0 && hv_Column >= 0) { //当鼠标移动时,画出画笔 //生成移动矩阵 HOperatorSet.SetColor(winHandle, "gray"); HOperatorSet.VectorAngleToRigid(brushRow, brushColumn, 0, hv_Row, hv_Column, 0, out HTuple homMoveMat2D); brushRegionAffine.Dispose(); //移动 HOperatorSet.AffineTransRegion(brushRegion, out brushRegionAffine, homMoveMat2D, "nearest_neighbor"); HOperatorSet.SetSystem("flush_graphic", "true"); HOperatorSet.DispObj(brushRegionAffine, winHandle); if (hv_Button == 1) { if(a==1) { HOperatorSet.Difference(removedRegion, brushRegionAffine, out removedRegion); } else { HOperatorSet.ConcatObj(removedRegion, brushRegionAffine,out removedRegion); } } } //HOperatorSet.SetPart(Frm_ShapeMatchTool.Instance.hWindow_Final1.HWindowHalconID, row1 - 20, col1 - 20, row2 + 20, col2 + 20); // HOperatorSet.DispObj(resultImage, Frm_ShapeMatchTool.Instance.hWindow_Final1.HWindowHalconID); //HOperatorSet.SetColor(Frm_ShapeMatchTool.Instance.hWindow_Final1.HWindowHalconID, "gray"); //HOperatorSet.DispObj(final_region, Frm_ShapeMatchTool.Instance.hWindow_Final1.HWindowHalconID); } catch { } } } }); } private void button5_Click(object sender, EventArgs e) { } private void trackBar2_ValueChanged(object sender, EventArgs e) { lblContrast.Text = tbarContrast.Value.ToString(); HOperatorSet.ClearWindow(winHandle); HOperatorSet.ReduceDomain(pm.SourceImage, pm.FinalRegion, out HObject imageReduced); HOperatorSet.InspectShapeModel(imageReduced, out HObject modelImages, out HObject modelRegions, 1, tbarContrast.Value); hWindow_Final1.DispObj(pm.SourceImage); hWindow_Final1.DispObj(modelRegions, "green"); } private void btnStudy_Click(object sender, EventArgs e) { if(pm.FinalRegion== null || pm.FinalRegion.CountObj()==0) { MessageBox.Show("请先绘制ROI区域"); return; } HOperatorSet.ClearWindow(hWindow_Final2.hWindowControl.HalconWindow); HOperatorSet.ReduceDomain(pm.SourceImage, pm.FinalRegion, out HObject imageReduced); HOperatorSet.InspectShapeModel(imageReduced, out HObject modelImages, out HObject modelRegions, 1, 30); hWindow_Final1.DispObj(pm.SourceImage); hWindow_Final1.DispObj(modelRegions, "green"); //HOperatorSet HOperatorSet.SmallestRectangle1(pm.FinalRegion,out HTuple row1,out HTuple column1,out HTuple row2,out HTuple column2); //HOperatorSet.SetPart(hWindow_Final2.hWindowControl.HalconWindow, pm.RoiRow1 - 20, pm.RoiColumn1 - 20, pm.RoiRow2 + 20, pm.RoiColumn2 + 20); HOperatorSet.SetPart(hWindow_Final2.hWindowControl.HalconWindow, row1 - 20, column1 - 20, row2 + 20, column2 + 20); HOperatorSet.DispObj(imageReduced, hWindow_Final2.hWindowControl.HalconWindow); //HOperatorSet.CropPart(ho_image, out partImage, row1, column1, column2 - column1, row2 - row1); } private void btnDrawRectangle(object sender, EventArgs e) { DrawRoi(ERoiShape.Rectange); } private void btnDrawCircle_Click(object sender, EventArgs e) { DrawRoi(ERoiShape.Circle); } bool bPaint = true; bool isPaint = false; private void btnPaint_Click(object sender, EventArgs e) { bPaint = true; PaintOrClear(); } private void btnClear_Click(object sender, EventArgs e) { bPaint = false; PaintOrClear(); } private void PaintOrClear() { if (isPaint) { return; } HObject removedRegion; HObject hoImage; HOperatorSet.GenEmptyObj(out removedRegion); HTuple hv_Button = null; HTuple hv_Row = null, hv_Column = null; HObject brushRegion, brushRegionAffine; HOperatorSet.GenEmptyObj(out brushRegionAffine); HOperatorSet.GenCircle(out brushRegion, 50, 50, 20); HTuple brushRow, brushColumn, brushArea; hWindow_Final1.DrawModel = true; if (pm.RemovedRegion != null && pm.RemovedRegion.CountObj() > 0) { removedRegion = pm.RemovedRegion; } Task.Run(() => { isPaint = true; hv_Button = 0; int a = 0; HOperatorSet.ReduceDomain(pm.SourceImage, pm.RoiRegion, out HObject imageReduced); HOperatorSet.InspectShapeModel(imageReduced, out HObject modelImages, out HObject modelRegions, 1, 30); HOperatorSet.SetColor(winHandle, "green"); HOperatorSet.DispObj(modelRegions, winHandle); //hWindow_Final1.DispObj(modelRegions); HOperatorSet.AreaCenter(brushRegion, out brushArea, out brushRow, out brushColumn); while (true) { try { //HOperatorSet.GetMbutton(winHandle, out HTuple mrow, out HTuple mcol, out hv_Button); //获取鼠标位置信息 HOperatorSet.GetMposition(winHandle, out hv_Row, out hv_Column, out hv_Button); if (hv_Button == 4) { break; } } catch (Exception ex) { //MessageBox.Show(ex.Message); } if (removedRegion.IsInitialized()) { try { //////HOperatorSet.DispObj(final_region, Frm_ShapeMatchTool.Instance.hWindow_Final1.HWindowHalconID); HObject image1, image2, resultImage; resultImage = new HObject(); HObject iamgeR, iamgeG, iamgeB; //HOperatorSet.Decompose3(ho_image, out iamgeR, out iamgeG, out iamgeB); int c = removedRegion.CountObj(); if (c > 0) { HOperatorSet.PaintRegion(removedRegion, pm.SourceImage, out image1, 120, "fill"); HOperatorSet.Compose3(image1, image1, pm.SourceImage, out resultImage); HOperatorSet.SetSystem("flush_graphic", "false"); HOperatorSet.SetColor(winHandle, "green"); HOperatorSet.DispObj(resultImage, winHandle); HOperatorSet.DispObj(modelRegions, winHandle); } //HOperatorSet.DispObj(modelRegions, winHandle); //hWindow_Final1.HobjectToHimage(pm.SourceImage); if (hv_Row >= 0 && hv_Column >= 0) { //当鼠标移动时,画出画笔 //生成移动矩阵 HOperatorSet.SetColor(winHandle, "gray"); HOperatorSet.VectorAngleToRigid(brushRow, brushColumn, 0, hv_Row, hv_Column, 0, out HTuple homMoveMat2D); brushRegionAffine.Dispose(); //移动 HOperatorSet.AffineTransRegion(brushRegion, out brushRegionAffine, homMoveMat2D, "nearest_neighbor"); HOperatorSet.SetSystem("flush_graphic", "true"); HOperatorSet.DispObj(brushRegionAffine, winHandle); if (hv_Button == 1) { if(bPaint) { HOperatorSet.ConcatObj(removedRegion, brushRegionAffine, out removedRegion); } else { HOperatorSet.Difference(removedRegion, brushRegionAffine, out removedRegion); } pm.RemovedRegion = removedRegion; } } } catch { } } } HOperatorSet.ClearWindow(winHandle); //HOperatorSet.DispObj(pm.SourceImage,winHandle); HObject img, rltimg; HOperatorSet.PaintRegion(removedRegion, pm.SourceImage, out img, 120, "fill"); HOperatorSet.Compose3(img, img, pm.SourceImage, out rltimg); hWindow_Final1.DispObj(rltimg); //hWindow_Final1.DispObj(pm.SourceImage); //HOperatorSet.ClearWindow(winHandle); HOperatorSet.ReduceDomain(pm.SourceImage, pm.RoiRegion, out imageReduced); HOperatorSet.InspectShapeModel(imageReduced, out modelImages, out modelRegions, 1, 30); //HOperatorSet.SetColor(winHandle, "green"); hWindow_Final1.DispObj(modelRegions, "green"); //HOperatorSet.DispObj(modelRegions, winHandle); isPaint = false; //hWindow_Final1.DispObj(modelRegions); hWindow_Final1.DrawModel = false; }); } private void btnWholePaint_Click(object sender, EventArgs e) { if(pm.RoiRegion==null || pm.RoiRegion.CountObj()<=0) { Msg.ShowError("请选绘制ROI区域后再进行涂抹"); return; } pm.RemovedRegion = pm.RoiRegion; //显示涂抹区域 HOperatorSet.ClearWindow(winHandle); //把ROI区域画到原图上 HOperatorSet.PaintRegion(pm.RoiRegion,pm.SourceImage,out HObject imageResult,150,"fill"); HOperatorSet.Compose3(imageResult, imageResult, pm.SourceImage, out HObject multiChannelImage); hWindow_Final1.DispObj(multiChannelImage); } private void btnSaveModel_Click(object sender, EventArgs e) { pm.SaveModel(); } private void btnTestModel_Click(object sender, EventArgs e) { //先加载模板 dataGridView1.Rows.Clear(); HOperatorSet.ReadShapeModel("Recipe/Test/m.shm", out HTuple modelID); HOperatorSet.GetShapeModelContours(out HObject modelContours, modelID, 1); HOperatorSet.FindShapeModel(pm.SourceImage, modelID, AngleTool.Deg2Rad(-10), AngleTool.Deg2Rad(200), 0.1, 1, 0.5, "least_squares", 0, 0.9, out HTuple row, out HTuple column, out HTuple angle, out HTuple score); if(score!=null&&score.Length>0) { HOperatorSet.VectorAngleToRigid(0, 0, 0, row, column, angle, out HTuple homMat2D); HOperatorSet.AffineTransContourXld(modelContours, out HObject contoursAffineTrans, homMat2D); hWindow_Final1.DispObj(contoursAffineTrans, "green"); int len = score.Length; for (int i = 0; i < len; i++) { double rVal = row.DArr[i]; double cVal = column.DArr[i]; double angleVal = angle.DArr[i]; double scoreVal = score.DArr[i]; int rowIndex = dataGridView1.Rows.Add(); dataGridView1.Rows[rowIndex].Cells[0].Value = rVal.ToString("0.000"); dataGridView1.Rows[rowIndex].Cells[1].Value = cVal.ToString("0.000"); dataGridView1.Rows[rowIndex].Cells[2].Value = angleVal.ToString("0.000"); dataGridView1.Rows[rowIndex].Cells[3].Value = scoreVal.ToString("0.000"); HOperatorSet.GenCrossContourXld(out HObject cross, rVal, cVal, 100, angle); hWindow_Final1.DispObj(cross, "black"); } } else { Msg.ShowError("未定位到产品"); } } private void btnDrawAny_Click(object sender, EventArgs e) { DrawRoi(ERoiShape.Any); } private void DrawRoi(ERoiShape roiShape) { if(pm.SourceImage== null || pm.SourceImage.CountObj()<=0) { Msg.ShowError("请先拍照或者选择照片"); return; } hWindow_Final1.Focus(); HalconTool.SetDisplayFont(winHandle, 50, "sans", new HTuple("true"), new HTuple("false")); HalconTool.DispMessage(winHandle, "请在图像窗口中绘制ROI区域,点击右键结束", 20, 20, "red", "false"); HOperatorSet.SetDraw(winHandle, "margin"); HOperatorSet.SetColor(winHandle, "green"); hWindow_Final1.DrawModel = true; HObject roiRegion; HOperatorSet.GenEmptyObj(out roiRegion); if(roiShape== ERoiShape.Rectange) { HOperatorSet.DrawRectangle1(winHandle, out HTuple row1, out HTuple column1, out HTuple row2, out HTuple column2); HOperatorSet.GenRectangle1(out roiRegion, row1, column1, row2, column2); } else if(roiShape== ERoiShape.Circle) { HOperatorSet.DrawCircle(winHandle, out HTuple row, out HTuple column, out HTuple radius); HOperatorSet.GenCircle(out roiRegion, row, column, radius); } else { HOperatorSet.DrawRegion(out roiRegion, winHandle); } pm.RoiRegion = roiRegion; //pm.RoiRow1 = row1; pm.RoiRow2 = row2; //pm.RoiColumn1 = column1; pm.RoiColumn2 = column2; hWindow_Final1.DispObj(pm.RoiRegion, "green"); hWindow_Final1.DrawModel = false; } } }