2026-06-05 13:44:39 +09:00

188 lines
7.2 KiB
C#

using Aurora.Api;
using MilCommon;
using VisionCommon;
using Hermes;
using Matrox.MatroxImagingLibrary;
using System;
using System.Collections.Generic;
using Aurora.Api.DataType;
namespace MilPattern {
public enum ePolarity {
Any = MIL.M_ANY,
Negative = MIL.M_NEGATIVE,
Positive = MIL.M_POSITIVE,
Opposite = MIL.M_OPPOSITE
}
internal static class MilMeasureCommon {
private static Logger _Logger = new Logger(typeof(MilMeasureCommon).Name);
public static MIL_ID CreateContext(MIL_ID milSystem, MIL_ID markerType) {
MIL_ID contextId = MIL.M_NULL;
MIL.MmeasAllocMarker(milSystem, markerType, MIL.M_DEFAULT, ref contextId);
MIL.MmeasSetMarker(contextId, MIL.M_SUB_REGIONS_NUMBER, 10, MIL.M_NULL);
return contextId;
}
public static MIL_ID LoadContext(MIL_ID milSystem, string filePath) {
MIL_ID contextId = MIL.M_NULL;
MIL.MmeasRestoreMarker(filePath, milSystem, MIL.M_DEFAULT, ref contextId);
return contextId;
}
public static int SaveContext(MIL_ID contextId, string filePath) {
if (contextId != MIL.M_NULL && filePath != null) {
MIL.MmeasSaveMarker(filePath, contextId, MIL.M_DEFAULT);
return E1.OK;
}
return E1.GENERIC;
}
public static void FreeContext(MIL_ID contextId) {
if (contextId != MIL.M_NULL) {
MIL.MmeasFree(contextId);
}
}
private static MIL_ID CreateResultContext(MIL_ID contextId) {
var milSystem = GetSystemOfContext(contextId);
return MIL.MmeasAllocResult(milSystem, MIL.M_DEFAULT, MIL.M_NULL);
}
private static MIL_ID GetSystemOfContext(MIL_ID contextId) {
return (MIL_ID)MIL.MmeasInquire(contextId, MIL.M_OWNER_SYSTEM, MIL.M_NULL, MIL.M_NULL);
}
public static ROI GetFindROI(MIL_ID contextId) {
double boxCenterX = 0, boxCenterY = 0;
double width = 0, height = 0;
double angleDeg = 0;
MIL.MmeasInquire(contextId, MIL.M_BOX_CENTER, ref boxCenterX, ref boxCenterY);
MIL.MmeasInquire(contextId, MIL.M_BOX_SIZE, ref width, ref height);
MIL.MmeasInquire(contextId, MIL.M_BOX_ANGLE, ref angleDeg, MIL.M_NULL);
return new ROI(
new ImagePoint(boxCenterX, boxCenterY),
width, height,
Angle.CreateWithDegree(angleDeg));
}
public static int SetFindROI(MIL_ID contextId, ROI findRoi) {
MIL.MmeasSetMarker(contextId, MIL.M_BOX_ANGLE_REFERENCE, MIL.M_BOX_CENTER, MIL.M_NULL);
MIL.MmeasSetMarker(contextId, MIL.M_BOX_CENTER, findRoi.CenterX, findRoi.CenterY);
MIL.MmeasSetMarker(contextId, MIL.M_BOX_SIZE, findRoi.Width, findRoi.Height);
MIL.MmeasSetMarker(contextId, MIL.M_BOX_ANGLE, findRoi.Angle.Degree, MIL.M_NULL);
return E1.OK;
}
public static PatternResult Find(
MIL_ID contextId,
MIL_ID image,
Func<MIL_ID, double, PatternResult> funcExtractResults,
ROI findRoi) {
var patternResult = new PatternResult();
var oldFindRoi = GetFindROI(contextId);
try {
SetFindROI(contextId, findRoi);
patternResult = Find(contextId, image, funcExtractResults);
}
catch (Exception e) {
_Logger.FuncE(e.Message);
}
finally {
SetFindROI(contextId, oldFindRoi);
}
return patternResult;
}
public static PatternResult Find(
MIL_ID contextId,
MIL_ID image,
Func<MIL_ID, double, PatternResult> funcExtractResults) {
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_RESET + MIL.M_SYNCHRONOUS, MIL.M_NULL);
if (MilEnvironment.IsColorImage(image)) {
var grayImageId = MilEnvironment.ConvertToGray(image);
MIL.MmeasFindMarker(MIL.M_DEFAULT, grayImageId, contextId, MIL.M_DEFAULT);
MilEnvironment.FreeImage(grayImageId);
}
else {
MIL.MmeasFindMarker(MIL.M_DEFAULT, image, contextId, MIL.M_DEFAULT);
}
double tactTime = 0;
MIL.MappTimer(MIL.M_DEFAULT, MIL.M_TIMER_READ + MIL.M_SYNCHRONOUS, ref tactTime);
return funcExtractResults(contextId, tactTime);
}
public static void DrawSubPositions(MIL_ID contextId, IMilCameraDisplay milCameraDisplay) {
MIL_INT subRegionNumber = 0;
MIL.MmeasInquire(contextId, MIL.M_SUB_REGIONS_NUMBER + MIL.M_TYPE_MIL_INT, ref subRegionNumber, MIL.M_NULL);
if (0 < subRegionNumber) {
var subEdgeFirstX = new double[subRegionNumber];
var subEdgeFirstY = new double[subRegionNumber];
var subEdgeSecondX = new double[subRegionNumber];
var subEdgeSecondY = new double[subRegionNumber];
MIL.MmeasGetResult(contextId, MIL.M_SUB_EDGES_POSITION + MIL.M_EDGE_FIRST, subEdgeFirstX, subEdgeFirstY);
MIL.MmeasGetResult(contextId, MIL.M_SUB_EDGES_POSITION + MIL.M_EDGE_SECOND, subEdgeSecondX, subEdgeSecondY);
int crossLength = 3;
var crosses = new List<Cross>();
for (int i = 0; i < subEdgeFirstX.Length; i++) {
crosses.Add(new Cross(new ImagePoint(subEdgeFirstX[i], subEdgeFirstY[i]), crossLength));
crosses.Add(new Cross(new ImagePoint(subEdgeSecondX[i], subEdgeSecondY[i]), crossLength));
}
milCameraDisplay.AddCrosses(crosses, GraphicColors.PatternAdditionInfo);
}
}
public static void DrawPosition(MIL_ID contextId, IMilCameraDisplay milCameraDisplay) {
MIL_INT numOfResult = 0;
MIL.MmeasGetResult(contextId, MIL.M_NUMBER + MIL.M_TYPE_MIL_INT, ref numOfResult);
if (0 < numOfResult) {
double positionX = 0, positionY = 0;
var crosses = new List<Cross>();
MIL.MmeasGetResultSingle(contextId, MIL.M_POSITION, ref positionX, ref positionY, 0);
var color = GraphicColors.PatternFoundOK;
var cross = new Cross(new ImagePoint(positionX, positionY), 5);
crosses.Add(cross);
milCameraDisplay.SetPatternTracking(cross);
milCameraDisplay.AddCross(cross, color);
milCameraDisplay.DrawPatternTrackings(crosses);
}
}
public static Line<ImagePoint> GetMinLengthLine(
LineEquation lineEquation, ImageSize imageSize) {
var line1 = new Line<ImagePoint>(
new ImagePoint(0, lineEquation.GetY(0)),
new ImagePoint(imageSize.Width, lineEquation.GetY(imageSize.Width)));
var line2 = new Line<ImagePoint>(
new ImagePoint(lineEquation.GetX(0), 0),
new ImagePoint(lineEquation.GetX(imageSize.Height), imageSize.Height));
return line1.Length < line2.Length ? line1 : line2;
}
}
}