halcon联合C#测量十字Mark中心
函数说明
public void FitRectangleMeasure(HWindow 窗口句柄, HImage 图像, out double 中心Y坐标, out double 中心X坐标)
操作步骤,首先绘制两个矩形测量框;之后就可进行自动计算。
public void FitRectangleMeasure(HWindow hWindow, HImage hImage, out double Row, out double Col){try{int rtCount = 2;double[] rtRows = new double[rtCount];double[] rtCols = new double[rtCount];double[] rtAngles = new double[rtCount];double[] rtLen1s = new double[rtCount];double[] rtLen2s = new double[rtCount];hWindow.SetColor("red");hWindow.SetDraw("margin");HTuple hv_Row1, hv_Column1, hv_Row2, hv_Column2, hv_RectangleParameter;//绘制测量矩形for (int rtIndex = 0; rtIndex < rtCount; rtIndex++){HOperatorSet.DrawRectangle1Mod(hWindow, 1000, 1000, 1200, 1200, out hv_Row1, out hv_Column1, out hv_Row2, out hv_Column2);double dRowCenter = (hv_Row1.D + hv_Row2.D) / 2;double dColCenter = (hv_Column1.D + hv_Column2.D) / 2;double dL1 = (hv_Column2.D - hv_Column1.D) / 2;double dL2 = (hv_Row2.D - hv_Row1.D) / 4;rtRows[rtIndex] = dRowCenter;rtCols[rtIndex] = dColCenter;rtAngles[rtIndex] = 0;rtLen1s[rtIndex] = dL1;rtLen2s[rtIndex] = dL2;}//测量宽度int nHalfBorder = (int)(Math.Min(rtLen1s[0], rtLen2s[0]) + Math.Min(rtLen1s[1], rtLen2s[1])) / 2;//矩形测量句柄的创建HTuple hv_MetrologyHandle = null, hv_MetrologyRectangleIndices = null;HOperatorSet.CreateMetrologyModel(out hv_MetrologyHandle);HOperatorSet.AddMetrologyObjectRectangle2Measure(hv_MetrologyHandle, new HTuple(rtRows),new HTuple(rtCols), new HTuple(rtAngles), new HTuple(rtLen1s), new HTuple(rtLen2s), nHalfBorder, nHalfBorder / 4,1, 10, new HTuple(), new HTuple(), out hv_MetrologyRectangleIndices);HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, hv_MetrologyRectangleIndices, "num_instances", 1);HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, hv_MetrologyRectangleIndices, "min_score", 0.1);HOperatorSet.SetMetrologyObjectParam(hv_MetrologyHandle, hv_MetrologyRectangleIndices, "measure_transition", "uniform");HOperatorSet.ApplyMetrologyModel(hImage, hv_MetrologyHandle);//测量出的信息HObject ho_MeasureContours;//测量框 HObject ho_Cross; //测量出来的交界点HOperatorSet.GenEmptyObj(out ho_MeasureContours);HOperatorSet.GenEmptyObj(out ho_Cross);ho_MeasureContours.Dispose();ho_Cross.Dispose();HOperatorSet.GetMetrologyObjectMeasures(out ho_MeasureContours, hv_MetrologyHandle, "all", "all", out hv_Row1, out hv_Column1);HOperatorSet.GenCrossContourXld(out ho_Cross, hv_Row1, hv_Column1, 20, 0.785398);hWindow.DispObj(ho_MeasureContours);//hWindow.DispObj(ho_Cross);HOperatorSet.GetMetrologyObjectResult(hv_MetrologyHandle, "all", "all", "result_type","all_param", out hv_RectangleParameter);//测量出来的矩形框HObject ho_ResultContour;HOperatorSet.GenEmptyObj(out ho_ResultContour);ho_ResultContour.Dispose();HOperatorSet.GetMetrologyObjectResultContour(out ho_ResultContour, hv_MetrologyHandle, "all", "all", 1.5);hWindow.DispObj(ho_ResultContour);//测量出矩形的数据HTuple hv_Sequence, hv_RectangleRow, hv_RectangleColumn, hv_RectanglePhi, hv_RectangleLength1, hv_RectangleLength2;hv_Sequence = HTuple.TupleGenSequence(0, (new HTuple(hv_RectangleParameter.TupleLength())) - 1, 5);hv_RectangleRow = hv_RectangleParameter.TupleSelect(hv_Sequence);hv_RectangleColumn = hv_RectangleParameter.TupleSelect(hv_Sequence + 1);hv_RectanglePhi = hv_RectangleParameter.TupleSelect(hv_Sequence + 2);hv_RectangleLength1 = hv_RectangleParameter.TupleSelect(hv_Sequence + 3);hv_RectangleLength2 = hv_RectangleParameter.TupleSelect(hv_Sequence + 4);if (hv_RectangleRow.TupleLength() == rtCount){Row = (hv_RectangleRow[0].D + hv_RectangleRow[1].D) / 2;Col = (hv_RectangleColumn[0].D + hv_RectangleColumn[1].D) / 2;}else{Row = 0;Col = 0;}HOperatorSet.ClearMetrologyModel(hv_MetrologyHandle);//释放HObjectho_MeasureContours.Dispose();ho_Cross.Dispose();ho_ResultContour.Dispose();}catch{Row = 0;Col = 0;}}
不懂的话可以问我哦,下边评论看到了第一时间回复。如果觉得有用点赞哦。
PS
我的博客不定时分享日常工作中觉得有价值的内容,包括C#、C++、halcon、运动控制等等内容,喜欢的点赞,关注我。