using ChoiceTech.Halcon.Control; using HalconDotNet; using Rs.Framework; using Rs.MotionPlat.Flow; 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.Tasks; using System.Windows.Forms; using static System.Net.Mime.MediaTypeNames; namespace Rs.MotionPlat.SysConfig { public partial class DownCameraCalibration : BaseForm { public DownCameraCalibration() { InitializeComponent(); cameraTemplate1.ItemName = "下相机标定"; cameraTemplate1.SetFindShapeMode(EFindShapeMode.SelfDefine); cameraTemplate1.FindShapeEvent += CameraTemplate1_FindShapeEvent; } private void CameraTemplate1_FindShapeEvent(ChoiceTech.Halcon.Control.HWindow_Final win, HObject sourceImage) { HOperatorSet.Threshold(sourceImage, out HObject Region, new HTuple(0), new HTuple(100)); HOperatorSet.Connection(Region, out HObject connectedRegion); if (connectedRegion.IsInitialized() && connectedRegion.CountObj() > 0) { HOperatorSet.SelectShape(connectedRegion, out HObject selectedRegion, "area", "and", new HTuple(2000), new HTuple(3000)); if (selectedRegion.IsInitialized() && selectedRegion.CountObj() > 0) { HOperatorSet.SelectShape(selectedRegion, out HObject lastRegion, "circularity", "and", new HTuple(0.8), new HTuple(1)); if (lastRegion.IsInitialized() && lastRegion.CountObj() > 0) { HOperatorSet.SmallestCircle(lastRegion, out HTuple row, out HTuple column, out HTuple radius); HOperatorSet.GenCrossContourXld(out HObject cross, row, column, new HTuple(20), new HTuple(0)); win.DispObj(cross, "green"); int rowIndex = dgvPixCalib.Rows.Add(); dgvPixCalib.Rows[rowIndex].Cells[0].Value = row.DArr[0].ToString("0.000"); dgvPixCalib.Rows[rowIndex].Cells[1].Value = column.DArr[0].ToString("0.000"); } } } //HOperatorSet.GetImageSize(sourceImage, out HTuple imgWidth, out HTuple imgHeight); //HOperatorSet.GenCrossContourXld(out HObject camCenter, imgHeight / 2, imgWidth / 2, Math.Max(imgHeight, imgWidth), 0); //win.DispObj(camCenter); //HOperatorSet.Threshold(sourceImage, out HObject regions, 40, 130); //HOperatorSet.Connection(regions, out HObject connectedRegions); //HOperatorSet.SelectShape(connectedRegions, out HObject selectedRegion, "circularity", "and", 0.8, 1); //HOperatorSet.SelectShape(selectedRegion, out HObject selectedRegion1, "area", "and", 800, 1500); ////HOperatorSet.FillUp(selectedRegion, out HObject regionFillUp); ////win.DispObj(regionFillUp, "green"); //HOperatorSet.SmallestCircle(selectedRegion1, out HTuple row, out HTuple column, out HTuple radius); //HOperatorSet.GenCrossContourXld(out HObject cross, row, column, 30, 0); //HOperatorSet.GenCircle(out HObject cicle, row, column, radius); //win.DispObj(cicle, "green"); //win.DispObj(cross, "green"); //File.AppendAllText("c:test.csv",$"camerX:{imgHeight / 2},camerX:{imgWidth / 2},row:{row},column:{column}\r\n"); } private void DownCameraCalibration_FormClosing(object sender, FormClosingEventArgs e) { cameraTemplate1.RemoveGrabEvent(); } private void btnGetMatchResult_Click(object sender, EventArgs e) { cameraTemplate1.GetMatchResult(out double row, out double column, out double angle, out double score); int rowIndex = dgvPixCalib.Rows.Add(); dgvPixCalib.Rows[rowIndex].Cells[0].Value = row.ToString("0.000"); dgvPixCalib.Rows[rowIndex].Cells[1].Value = column.ToString("0.000"); dgvPixCalib.Rows[rowIndex].Cells[2].Value = angle.ToString("0.000"); dgvPixCalib.Rows[rowIndex].Cells[3].Value = score.ToString("0.000"); Msg.ShowInfo($"{row},{column},{angle},{score}"); } private void DownCameraCalibration_Load(object sender, EventArgs e) { dgvRotateCenter.AutoGenerateColumns = false; dgvPixCalib.AutoGenerateColumns = false; } private void btnMove_Click(object sender, EventArgs e) { AxisControl.LoadY.MoveOffset(double.Parse(txtMoveOffset.Text), 10); } private void btnCalcPix_Click(object sender, EventArgs e) { int count = dgvPixCalib.Rows.Count; if(count<2) { Msg.ShowError("移动次数少于一次"); return; } double columnValY1 = double.Parse(dgvPixCalib.Rows[0].Cells[1].Value.ToString()); double columnValY2 = double.Parse(dgvPixCalib.Rows[1].Cells[1].Value.ToString()); double mmPerPix = (double.Parse(txtMoveOffset.Text) / (columnValY2 - columnValY1)); txtMmPerPixX.Text = mmPerPix.ToString("0.0000"); txtMmPerPixY.Text = mmPerPix.ToString("0.0000"); } } }