| | |
| | | return res; |
| | | } |
| | | |
| | | public bool GetImage(Layout layout, out HObject InputImage, out HObject RecordImage) |
| | | public bool GetImage(Layout layout, out HImage InputImage, out HObject RecordImage) |
| | | { |
| | | InputImage = null; RecordImage = null; |
| | | try |
| | |
| | | IndexValueName = arrOutputs[2]; |
| | | |
| | | object o_InputImage = ((IProcess)dicContext[IndexProcessName]).OutputImage; |
| | | if (o_InputImage is HObject ho_image && ho_image.IsInitialized()) |
| | | if (o_InputImage is HImage ho_image && ho_image.IsInitialized()) |
| | | InputImage = ho_image; |
| | | else if (o_InputImage is Bitmap) |
| | | { |
| | | //将Mat转换为HObject |
| | | TAlgorithm.Bitmap2HObject((Bitmap)o_InputImage, out HObject ho_RecordImage); |
| | | InputImage = ho_RecordImage; |
| | | using (HImage ho_RecordImage = TAlgorithm.Bitmap2HObject((Bitmap)o_InputImage)) |
| | | { |
| | | InputImage = ho_RecordImage.Clone(); |
| | | } |
| | | } |
| | | else if (o_InputImage is Mat) |
| | | { |
| | | //将Mat转换为HObject |
| | | TAlgorithm.Mat2HObject((Mat)o_InputImage, out HObject ho_RecordImage); |
| | | InputImage = ho_RecordImage; |
| | | using (HImage ho_RecordImage = TAlgorithm.Mat2HObject((Mat)o_InputImage)) |
| | | { |
| | | InputImage = ho_RecordImage.Clone(); |
| | | } |
| | | } |
| | | |
| | | if (InputImage != null && InputImage.IsInitialized()) |
| | |
| | | /// </summary> |
| | | public double RunTime = 0; |
| | | |
| | | public bool GetImage(Forms.Pages.SettingPage.Layout layout, out HObject InputImage, out HObject RecordImage) |
| | | public bool GetImage(Forms.Pages.SettingPage.Layout layout, out HImage InputImage, out HObject RecordImage) |
| | | { |
| | | return ProcessContext.GetImage(layout, out InputImage, out RecordImage); |
| | | } |
| | | |
| | | public bool GetImage(out HObject InputImage, out HObject RecordImage) |
| | | public bool GetImage(out HImage InputImage, out HObject RecordImage) |
| | | { |
| | | InputImage = null; |
| | | RecordImage = null; |
| | |
| | | catch { } |
| | | } |
| | | // 生成图片并显示到控件中 |
| | | HObject InputImage = null; |
| | | HImage InputImage = null; |
| | | HObject RecordImage = null; |
| | | |
| | | foreach (var layout in GlobalVar.dicLayout.Values |
| | |
| | | { |
| | | if (InputImage is Bitmap) |
| | | { |
| | | TAlgorithm.Bitmap2Mat((Bitmap)InputImage, out Mat src); |
| | | Bitmap2Mat((Bitmap)InputImage, out Mat src); |
| | | |
| | | if (Params.Fixture == null) |
| | | Params.Fixture = new Fixture(); |
| | |
| | | |
| | | // 4. 创建与原图大小相同的Mat,并初始化无效值 |
| | | image = new Mat(src.Size(), src.Type()); |
| | | ((Mat)image).SetTo(TAlgorithm.GetInvalidValueForMat(src)); // 全部初始化为无效值 |
| | | ((Mat)image).SetTo(GetInvalidValueForMat(src)); // 全部初始化为无效值 |
| | | |
| | | // 5. 创建遮罩:在result上绘制旋转矩形(白色填充) |
| | | using (Mat cropped = new Mat(src, boundingRect)) |
| | |
| | | |
| | | // 2. 创建与原图大小相同的Mat,并初始化无效值 |
| | | image = new Mat(src.Size(), src.Type()); |
| | | ((Mat)image).SetTo(TAlgorithm.GetInvalidValueForMat(src)); // 全部初始化为无效值 |
| | | ((Mat)image).SetTo(GetInvalidValueForMat(src)); // 全部初始化为无效值 |
| | | |
| | | // 3. 创建圆形遮罩 |
| | | using (Mat mask = Mat.Zeros(src.Rows, src.Cols, MatType.CV_8UC1)) |
| | |
| | | image = ((Bitmap)InputImage)?.Clone(); |
| | | return true; |
| | | } |
| | | TAlgorithm.Mat2Bitmap((Mat)image, out Bitmap bmp); |
| | | Mat2Bitmap((Mat)image, out Bitmap bmp); |
| | | image = bmp; |
| | | return true; |
| | | } |
| | |
| | | |
| | | // 4. 创建与原图大小相同的Mat,并初始化无效值 |
| | | image = new Mat(src.Size(), src.Type()); |
| | | ((Mat)image).SetTo(TAlgorithm.GetInvalidValueForMat(src)); // 全部初始化为无效值 |
| | | ((Mat)image).SetTo(GetInvalidValueForMat(src)); // 全部初始化为无效值 |
| | | |
| | | // 5. 创建遮罩:在result上绘制旋转矩形(白色填充) |
| | | using (Mat cropped = new Mat(src, boundingRect)) |
| | |
| | | |
| | | // 2. 创建与原图大小相同的Mat,并初始化无效值 |
| | | image = new Mat(src.Size(), src.Type()); |
| | | ((Mat)image).SetTo(TAlgorithm.GetInvalidValueForMat(src)); // 全部初始化为无效值 |
| | | ((Mat)image).SetTo(GetInvalidValueForMat(src)); // 全部初始化为无效值 |
| | | |
| | | // 3. 创建圆形遮罩 |
| | | using (Mat mask = Mat.Zeros(src.Rows, src.Cols, MatType.CV_8UC1)) |
| | |
| | | if (InputImage != null) |
| | | { |
| | | if (InputImage is HObject) |
| | | { |
| | | ((HObject)InputImage).Dispose(); |
| | | } |
| | | else if (InputImage is Mat) |
| | | { |
| | | ((Mat)InputImage).Dispose(); |
| | | } |
| | | else if (InputImage is Bitmap) |
| | | { |
| | | ((Bitmap)InputImage).Dispose(); |
| | | |
| | | } |
| | | InputImage = null; |
| | | } |
| | | |
| | | if (OutputImage != null) |
| | | { |
| | | if (OutputImage is HObject) |
| | | { |
| | | ((HObject)OutputImage).Dispose(); |
| | | } |
| | | else if (OutputImage is Mat) |
| | | { |
| | | ((Mat)OutputImage).Dispose(); |
| | | } |
| | | else if (OutputImage is Bitmap) |
| | | { |
| | | ((Bitmap)OutputImage).Dispose(); |
| | | |
| | | } |
| | | OutputImage = null; |
| | | } |
| | | |
| | | if (Record != null) |
| | | { |
| | | Record.Dispose(); |
| | |
| | | if (InputImage != null) |
| | | { |
| | | if (InputImage is HObject ho_image && ho_image.IsInitialized()) |
| | | { |
| | | obj.InputImage = ho_image.CopyObj(1, -1); |
| | | } |
| | | else if (InputImage is Mat mat && !mat.Empty()) |
| | | { |
| | | obj.InputImage = mat.Clone(); |
| | | } |
| | | else if (InputImage is Bitmap bitmap) |
| | | { |
| | | obj.InputImage = bitmap.Clone(); |
| | | } |
| | | |
| | | } |
| | | return obj; |
| | | } |
| | | catch { return (TAlgorithm)MemberwiseClone(); } |
| | |
| | | { |
| | | Result = true; |
| | | bCompleted = false; |
| | | Msg = ""; |
| | | OutputImage = null; |
| | | |
| | | Msg = string.Empty; |
| | | if (InputImage != null) |
| | | { |
| | | if (InputImage is HObject) |
| | | { |
| | | ((HObject)InputImage).Dispose(); |
| | | } |
| | | else if (InputImage is Mat) |
| | | { |
| | | ((Mat)InputImage).Dispose(); |
| | | } |
| | | else if (InputImage is Bitmap) |
| | | { |
| | | ((Bitmap)InputImage).Dispose(); |
| | | } |
| | | InputImage = null; |
| | | } |
| | | if (Record != null) |
| | | { |
| | | Record.Dispose(); |
| | | } |
| | | } |
| | | |
| | | public override bool Run() |
| | | { |
| | | DateTime StartTime = DateTime.Now; |
| | | |
| | | InitRunParams(); |
| | | HOperatorSet.GenEmptyObj(out HObject EmptyObj); |
| | | OutputImage = EmptyObj; |
| | |
| | | |
| | | Thread.Sleep(30); |
| | | } |
| | | |
| | | Msg = "运行超时"; |
| | | Result = false; |
| | | RunTime = (DateTime.Now - StartTime).TotalMilliseconds; |
| | |
| | | try |
| | | { |
| | | if (string.IsNullOrEmpty(fullPath)) |
| | | { |
| | | return false; |
| | | |
| | | } |
| | | if (!fullPath.Contains(".json")) |
| | | { |
| | | Debug.WriteLine("文件路径不完整"); |
| | |
| | | Debug.WriteLine("文件路径不完整"); |
| | | return false; |
| | | } |
| | | |
| | | // 获取不带文件名的目录路径 |
| | | string directoryPath = Path.GetDirectoryName(fullPath); |
| | | strProcessName = Path.GetFileNameWithoutExtension(fullPath); |
| | |
| | | Save(directoryPath); |
| | | return true; |
| | | } |
| | | |
| | | string strJson = string.Empty; |
| | | using (StreamReader streamReader = new StreamReader(fullPath, Encoding.UTF8)) |
| | | { |
| | |
| | | } |
| | | Params = JsonConvert.DeserializeObject<ProcessParams>(strJson); |
| | | if (Params == null) |
| | | { |
| | | return false; |
| | | |
| | | } |
| | | Params.FixDeserializedData(); |
| | | return true; |
| | | } |
| | |
| | | return value; |
| | | } |
| | | |
| | | public static void Bitmap2HObject(Bitmap bmp, out HObject image) |
| | | public static HImage Bitmap2HObject(Bitmap bmp) |
| | | { |
| | | BitmapData srcBmpData; |
| | | |
| | | HImage image = null; |
| | | try |
| | | { |
| | | if (bmp == null || bmp.Width == 0 || bmp.Height == 0) |
| | | { |
| | | image = null; |
| | | return; |
| | | return image; |
| | | } |
| | | |
| | | lock (bmp) |
| | | { |
| | | image = new HImage(); |
| | | switch (bmp.PixelFormat) |
| | | { |
| | | case PixelFormat.Format24bppRgb: |
| | |
| | | int width = bmp.Width; |
| | | int height = bmp.Height; |
| | | int stride = srcBmpData.Stride; |
| | | |
| | | if (stride == width * 3) |
| | | HOperatorSet.GenImageInterleaved(out image, srcBmpData.Scan0, "bgr", bmp.Width, bmp.Height, 0, "byte", 0, 0, 0, 0, -1, 0); |
| | | { |
| | | image.GenImageInterleaved(srcBmpData.Scan0, "bgr", bmp.Width, bmp.Height, 0, "byte", 0, 0, 0, 0, -1, 0); |
| | | } |
| | | else |
| | | { |
| | | image = HandleStrideAlignmentBest(srcBmpData.Scan0, width, height, stride); |
| | | |
| | | } |
| | | bmp.UnlockBits(srcBmpData); |
| | | break; |
| | | default: |
| | | srcBmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format8bppIndexed); |
| | | HOperatorSet.GenImage1(out image, "byte", bmp.Width, bmp.Height, srcBmpData.Scan0); |
| | | image.GenImage1("byte", bmp.Width, bmp.Height, srcBmpData.Scan0); |
| | | bmp.UnlockBits(srcBmpData); |
| | | break; |
| | | } |
| | | } |
| | | return; |
| | | return image; |
| | | } |
| | | catch |
| | | { |
| | | if (image != null) |
| | | { |
| | | image.Dispose(); |
| | | } |
| | | image = null; |
| | | return; |
| | | return image; |
| | | } |
| | | } |
| | | |
| | | private static HObject HandleStrideAlignmentBest(IntPtr scan0, int width, int height, int stride) |
| | | private static HImage HandleStrideAlignmentBest(IntPtr scan0, int width, int height, int stride) |
| | | { |
| | | int expectedStride = width * 3; |
| | | byte[] alignedData = new byte[width * height * 3]; |
| | | |
| | | HImage image = new HImage(); |
| | | unsafe |
| | | { |
| | | byte* srcPtr = (byte*)scan0; |
| | |
| | | expectedStride |
| | | ); |
| | | } |
| | | HOperatorSet.GenImageInterleaved(out HObject ho_img, new IntPtr(dstPtr), "bgr", width, height, 0, "byte", width, height, 0, 0, -1, 0); |
| | | return ho_img; |
| | | image.GenImageInterleaved(new IntPtr(dstPtr), "bgr", width, height, 0, "byte", width, height, 0, 0, -1, 0); |
| | | return image; |
| | | } |
| | | } |
| | | } |
| | | |
| | | public static unsafe void HObject2Bitmap(HObject hObject, out Bitmap bmp) |
| | | public static unsafe void HObject2Bitmap(HImage hImage, out Bitmap bmp) |
| | | { |
| | | try |
| | | { |
| | | if (hObject == null || !hObject.IsInitialized()) |
| | | if (hImage == null || !hImage.IsInitialized()) |
| | | { |
| | | bmp = null; |
| | | return; |
| | | } |
| | | |
| | | // 获取图像信息 |
| | | HOperatorSet.GetImageSize(hObject, out HTuple width, out HTuple height); |
| | | HOperatorSet.CountChannels(hObject, out HTuple channels); |
| | | hImage.GetImageSize(out HTuple width, out HTuple height); |
| | | HTuple channels = hImage.CountChannels(); |
| | | |
| | | if (channels.I == 1) |
| | | { |
| | | // 灰度图处理 |
| | | HTuple ptr, type; |
| | | HOperatorSet.GetImagePointer1(hObject, out ptr, out type, out width, out height); |
| | | ptr = hImage.GetImagePointer1(out type, out width, out height); |
| | | |
| | | bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed); |
| | | |
| | |
| | | { |
| | | // 彩色图处理(BGR顺序) |
| | | HTuple ptrR, ptrG, ptrB, type; |
| | | HOperatorSet.GetImagePointer3(hObject, out ptrR, out ptrG, out ptrB, out type, out width, out height); |
| | | hImage.GetImagePointer3(out ptrR, out ptrG, out ptrB, out type, out width, out height); |
| | | |
| | | bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb); |
| | | BitmapData bmpData = bmp.LockBits( |
| | |
| | | } |
| | | } |
| | | |
| | | public static void Mat2HObject(Mat mat, out HObject image) |
| | | public static HImage Mat2HObject(Mat mat) |
| | | { |
| | | HImage image = null; |
| | | try |
| | | { |
| | | if (mat == null || mat.Empty()) |
| | | { |
| | | image = null; |
| | | return; |
| | | return image; |
| | | } |
| | | |
| | | if (mat.Type() == MatType.CV_8UC3) // 彩色图像 (BGR) |
| | | { |
| | | HOperatorSet.GenImageInterleaved( |
| | | out image, |
| | | image = new HImage(); |
| | | image.GenImageInterleaved( |
| | | mat.Data, |
| | | "bgr", |
| | | mat.Width, |
| | |
| | | } |
| | | else if (mat.Type() == MatType.CV_8UC1) // 灰度图像 |
| | | { |
| | | HOperatorSet.GenImage1( |
| | | out image, |
| | | image = new HImage(); |
| | | image.GenImage1( |
| | | "byte", |
| | | mat.Width, |
| | | mat.Height, |
| | |
| | | { |
| | | throw new ArgumentException($"Mat2HObject不支持的图像格式:{mat.Type()}"); |
| | | } |
| | | return; |
| | | return image; |
| | | } |
| | | catch |
| | | { |
| | | image = null; |
| | | return; |
| | | return image; |
| | | } |
| | | } |
| | | |
| | |
| | | /// <param name="startPoint"></param> |
| | | /// <param name="endPoint"></param> |
| | | /// <returns></returns> |
| | | public static double GetDistanceP2P(HPoint startPoint, HPoint endPoint) |
| | | public double GetDistanceP2P(HPoint startPoint, HPoint endPoint) |
| | | { |
| | | try |
| | | { |
| | |
| | | catch { return 9994; } |
| | | } |
| | | |
| | | public static double GetDistanceP2P(Point startPoint, Point endPoint) |
| | | public double GetDistanceP2P(Point startPoint, Point endPoint) |
| | | { |
| | | return GetDistanceP2P(new HPoint(startPoint), new HPoint(endPoint)); |
| | | } |
| | | |
| | | public static double DistanceP2P(double startX, double startY, double endX, double endY) |
| | | public double DistanceP2P(double startX, double startY, double endX, double endY) |
| | | { |
| | | return GetDistanceP2P(new HPoint(startX, startY), new HPoint(endX, endY)); |
| | | } |
| | |
| | | /// <param name="startPoint"></param> |
| | | /// <param name="endPoint"></param> |
| | | /// <returns></returns> |
| | | public static HPoint GetMidPoint(HPoint startPoint, HPoint endPoint) |
| | | public HPoint GetMidPoint(HPoint startPoint, HPoint endPoint) |
| | | { |
| | | return new HPoint((startPoint.X + endPoint.X) / 2, (startPoint.Y + endPoint.Y) / 2); |
| | | } |
| | | |
| | | public static Point GetMidPoint(Point startPoint, Point endPoint) |
| | | public Point GetMidPoint(Point startPoint, Point endPoint) |
| | | { |
| | | return new Point((startPoint.X + endPoint.X) / 2, (startPoint.Y + endPoint.Y) / 2); |
| | | } |
| | | |
| | | public static System.Drawing.Point GetMidPoint(System.Drawing.Point startPoint, System.Drawing.Point endPoint) |
| | | public System.Drawing.Point GetMidPoint(System.Drawing.Point startPoint, System.Drawing.Point endPoint) |
| | | { |
| | | return new System.Drawing.Point((startPoint.X + endPoint.X) / 2, (startPoint.Y + endPoint.Y) / 2); |
| | | } |
| | |
| | | /// <param name="point"></param> |
| | | /// <param name="segment"></param> |
| | | /// <returns></returns> |
| | | public static bool IsPointOnSegment(HPoint pt, HSegment segment, double tolerance = 1e-3) |
| | | public bool IsPointOnSegment(HPoint pt, HSegment segment, double tolerance = 1e-3) |
| | | { |
| | | // 计算直线方程的系数 |
| | | double A = segment.EndY - segment.StartX; |
| | |
| | | return false; |
| | | } |
| | | |
| | | public static bool IsPointOnSegment(double px, double py, double x1, double y1, double x2, double y2) |
| | | public bool IsPointOnSegment(double px, double py, double x1, double y1, double x2, double y2) |
| | | { |
| | | return IsPointOnSegment(new HPoint(px, py), new HSegment(x1, y1, x2, y2)); |
| | | } |
| | |
| | | catch { return false; } |
| | | } |
| | | |
| | | public static bool IsPointNearRectangleSilde(HPoint pt, HRectangle2 rect, double tolerance = 100) |
| | | public bool IsPointNearRectangleSilde(HPoint pt, HRectangle2 rect, double tolerance = 100) |
| | | { |
| | | return IsPointNearRectangleSilde(new System.Drawing.Point((int)pt.X, (int)pt.Y), new Rectangle((int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height), tolerance); |
| | | } |
| | |
| | | /// <param name="pt2"></param> |
| | | /// <param name="tolerance"></param> |
| | | /// <returns></returns> |
| | | public static bool IsPointNearPoint(HPoint pt1, HPoint pt2, double tolerance = 100) |
| | | public bool IsPointNearPoint(HPoint pt1, HPoint pt2, double tolerance = 100) |
| | | { |
| | | if (GetDistanceP2P(pt1, pt2) <= tolerance) |
| | | return true; |
| | | return false; |
| | | } |
| | | |
| | | public static bool IsPointNearPoint(Point pt1, Point pt2, double tolerance = 100) |
| | | public bool IsPointNearPoint(Point pt1, Point pt2, double tolerance = 100) |
| | | { |
| | | if (GetDistanceP2P(pt1, pt2) <= tolerance) |
| | | return true; |
| | | return false; |
| | | } |
| | | |
| | | public static bool IsPointNearPoint(double x1, double y1, double x2, double y2, int tolerance = 100) |
| | | public bool IsPointNearPoint(double x1, double y1, double x2, double y2, int tolerance = 100) |
| | | { |
| | | return IsPointNearPoint(new HPoint(x1, y1), new HPoint(x2, y2), tolerance); |
| | | } |
| | |
| | | /// <param name="corner"></param> |
| | | /// <param name="tolerance"></param> |
| | | /// <returns></returns> |
| | | public static bool IsPointNearRectangleCorner(Point pt, Rectangle rect, out string corner, double tolerance = 10) |
| | | public bool IsPointNearRectangleCorner(Point pt, Rectangle rect, out string corner, double tolerance = 10) |
| | | { |
| | | try |
| | | { |
| | |
| | | catch { corner = ""; return false; } |
| | | } |
| | | |
| | | public static bool IsPointNearRectangleCorner(HPoint pt, HRectangle2 rect, out string corner, double tolerance = 10) |
| | | public bool IsPointNearRectangleCorner(HPoint pt, HRectangle2 rect, out string corner, double tolerance = 10) |
| | | { |
| | | try |
| | | { |
| | |
| | | /// <param name="p3">线2起始点</param> |
| | | /// <param name="p4"></param> |
| | | /// <returns></returns> |
| | | public static Point2d? GetLineIntersection(Point2d p1, Point2d p2, Point2d p3, Point2d p4, bool bOnSegment = false) |
| | | public Point2d? GetLineIntersection(Point2d p1, Point2d p2, Point2d p3, Point2d p4, bool bOnSegment = false) |
| | | { |
| | | // 直线1的向量 |
| | | double x1 = p1.X, y1 = p1.Y; |
| | |
| | | #region Halcon |
| | | // Chapter: Graphics / Output |
| | | // Short Description: Display 3D object models |
| | | public static void visualize_object_model_3d(HTuple hv_WindowHandle, HTuple hv_ObjectModel3D, |
| | | public void visualize_object_model_3d(HTuple hv_WindowHandle, HTuple hv_ObjectModel3D, |
| | | HTuple hv_CamParam, HTuple hv_PoseIn, HTuple hv_GenParamName, HTuple hv_GenParamValue, |
| | | HTuple hv_Title, HTuple hv_Label, HTuple hv_Information, out HTuple hv_PoseOut) |
| | | { |
| | |
| | | |
| | | // Chapter: Calibration / Camera Parameters |
| | | // Short Description: Set the value of a specified camera parameter in the camera parameter tuple. |
| | | public static void set_cam_par_data(HTuple hv_CameraParamIn, HTuple hv_ParamName, HTuple hv_ParamValue, |
| | | public void set_cam_par_data(HTuple hv_CameraParamIn, HTuple hv_ParamName, HTuple hv_ParamValue, |
| | | out HTuple hv_CameraParamOut) |
| | | { |
| | | // Local iconic variables |
| | |
| | | } |
| | | } |
| | | |
| | | public static void gen_arrow_contour_xld(out HObject ho_Arrow, HTuple hv_Row1, HTuple hv_Column1, |
| | | public void gen_arrow_contour_xld(out HObject ho_Arrow, HTuple hv_Row1, HTuple hv_Column1, |
| | | HTuple hv_Row2, HTuple hv_Column2, HTuple hv_HeadLength, HTuple hv_HeadWidth) |
| | | { |
| | | // Stack for temporary objects |
| | |
| | | } |
| | | } |
| | | |
| | | public static void get_rect2_vertex(HTuple hv_Row, HTuple hv_Column, HTuple hv_Phi, HTuple hv_Length1, |
| | | public void get_rect2_vertex(HTuple hv_Row, HTuple hv_Column, HTuple hv_Phi, HTuple hv_Length1, |
| | | HTuple hv_Length2, out HTuple hv_TopLeft_Row, out HTuple hv_TopLeft_Col, out HTuple hv_TopRight_Row, |
| | | out HTuple hv_TopRight_Col, out HTuple hv_LowLeft_Row, out HTuple hv_LowLeft_Col, |
| | | out HTuple hv_LowRight_Row, out HTuple hv_LowRight_Col) |
| | |
| | | } |
| | | } |
| | | |
| | | public static void pts_to_best_line(out HObject ho_LineXld, HTuple hv_Rows, HTuple hv_Columns, |
| | | public void pts_to_best_line(out HObject ho_LineXld, HTuple hv_Rows, HTuple hv_Columns, |
| | | HTuple hv_IgnoreNum, out HTuple hv_Row1, out HTuple hv_Column1, out HTuple hv_Row2, |
| | | out HTuple hv_Column2) |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | public static (double, double) CalculateTailValues(HTuple minValue, HTuple maxValue, HTuple mean, HTuple deviation, double tailPercentage = 0.3) |
| | | public (double, double) CalculateTailValues(HTuple minValue, HTuple maxValue, HTuple mean, HTuple deviation, double tailPercentage = 0.3) |
| | | { |
| | | // 计算低尾灰度值 |
| | | double lowTailValue = minValue.TupleReal() + (mean.TupleReal() - minValue.TupleReal()) * tailPercentage; |
| | |
| | | /// <param name="hv_Column2">结束横坐标</param> |
| | | /// <param name="hv_ResultRow">结果点集合纵坐标</param> |
| | | /// <param name="hv_ResultColumn">结果点集合横坐标</param> |
| | | public static void Rake(HObject ho_Image, out HObject ho_Regions, HTuple hv_Elements, |
| | | public void Rake(HObject ho_Image, out HObject ho_Regions, HTuple hv_Elements, |
| | | HTuple hv_DetectHeight, HTuple hv_DetectWidth, HTuple hv_Sigma, HTuple hv_Threshold, |
| | | HTuple hv_Transition, HTuple hv_Select, HTuple hv_Row1, HTuple hv_Column1, HTuple hv_Row2, |
| | | HTuple hv_Column2, out HTuple hv_ResultRow, out HTuple hv_ResultColumn) |
| | |
| | | catch { } |
| | | } |
| | | |
| | | public static void scale_gray_map(HObject ho_Image, out HObject ho_Image1, HTuple hv_Min, HTuple hv_Max) |
| | | public void scale_gray_map(HObject ho_Image, out HObject ho_Image1, HTuple hv_Min, HTuple hv_Max) |
| | | { |
| | | HTuple hv_Mult = new HTuple(), hv_Add = new HTuple(); |
| | | HOperatorSet.GenEmptyObj(out ho_Image1); |
| | |
| | | |
| | | #region OpenCVSharp |
| | | // 根据Mat类型返回对应的无效值 |
| | | public static Scalar GetInvalidValueForMat(Mat mat) |
| | | public Scalar GetInvalidValueForMat(Mat mat) |
| | | { |
| | | MatType type = mat.Type(); |
| | | if (type == MatType.CV_8UC1 || type == MatType.CV_8UC3) |
| | |
| | | return new Scalar(0); // 对于8位无符号类型,0是安全的无效值 |
| | | } |
| | | |
| | | public static void RGB2XYZ(double sR, double sG, double sB, out double X, out double Y, out double Z) |
| | | public void RGB2XYZ(double sR, double sG, double sB, out double X, out double Y, out double Z) |
| | | { |
| | | // 输入的颜色值 (sR, sG, sB) 应为 0 到 255 之间的值 |
| | | |
| | |
| | | Z = Math.Round(var_Z / (var_X + var_Y + var_Z), 3); |
| | | } |
| | | |
| | | public static void ExtractFrames(string videoPath, string outputDir) |
| | | public void ExtractFrames(string videoPath, string outputDir) |
| | | { |
| | | // 检查视频文件是否存在 |
| | | if (!File.Exists(videoPath)) |
| | |
| | | get |
| | | { |
| | | if (Subject == null) |
| | | { |
| | | return null; |
| | | } |
| | | return Subject.InputImage; |
| | | } |
| | | set |
| | | { |
| | | Subject.InputImage = value; |
| | | |
| | | if (InputImage == null) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | if (InputImage is HObject) |
| | | { |
| | | inputImageHSmartWindowControl.ShowHoImage((HObject)value); |
| | | } |
| | | else if (InputImage is Bitmap) |
| | | { |
| | | TAlgorithm.Bitmap2HObject((Bitmap)value, out HObject image); |
| | | using (HImage image = TAlgorithm.Bitmap2HObject((Bitmap)value)) |
| | | { |
| | | inputImageHSmartWindowControl.ShowHoImage(image); |
| | | } |
| | | } |
| | | else if (InputImage is Mat) |
| | | { |
| | | TAlgorithm.Mat2HObject((Mat)value, out HObject image); |
| | | using (HImage image = TAlgorithm.Mat2HObject((Mat)value)) |
| | | { |
| | | inputImageHSmartWindowControl.ShowHoImage(image); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | public TAlgorithmEdit() { } |
| | | |
| | |
| | | { |
| | | if (Subject.OutputImage is Mat) |
| | | { |
| | | TAlgorithm.Mat2HObject((Mat)Subject.OutputImage, out HObject image); |
| | | using (HImage image = TAlgorithm.Mat2HObject((Mat)Subject.OutputImage)) |
| | | { |
| | | recordImageHSmartWindowControl.ShowHoImage(image); |
| | | } |
| | | } |
| | | else if (Subject.OutputImage is Bitmap) |
| | | { |
| | | TAlgorithm.Bitmap2HObject((Bitmap)Subject.OutputImage, out HObject image); |
| | | using (HImage image = TAlgorithm.Bitmap2HObject((Bitmap)Subject.OutputImage)) |
| | | { |
| | | recordImageHSmartWindowControl.ShowHoImage(image); |
| | | } |
| | | } |
| | | else if (Subject.OutputImage is HObject) |
| | | { |
| | | recordImageHSmartWindowControl.ShowHoImage((HObject)Subject.OutputImage); |
| | | } |
| | | |
| | | } |
| | | //先判断子类再判断父类 |
| | | if (Subject.Record != null && Subject.Record is MsgRecord msgRecord) |
| | | { |
| | |
| | | recordImageHSmartWindowControl.DispObj(msgRecord.RecordObject_NG, false); |
| | | |
| | | for (int i = 0; i < msgRecord.Msg.Length; i++) |
| | | { |
| | | recordImageHSmartWindowControl.ShowMsg(msgRecord.Msg[i] |
| | | , 1 == msgRecord.Result[i] ? true : false, msgRecord.Column[i], msgRecord.Row[i]); |
| | | } |
| | | } |
| | | else if (Subject.Record != null && Subject.Record is ObjectRecord objRecord) |
| | | { |
| | | recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_OK, true); |
| | | recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_NG, false); |
| | | } |
| | | |
| | | GC.Collect(); |
| | | })); |
| | | } |
| | |
| | | BitmapData srcBmpData = ((Bitmap)InputImage).LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb); |
| | | hImage.GenImageInterleaved(srcBmpData.Scan0, "rgbx", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, "byte", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, 0, -1, 0); |
| | | ((Bitmap)InputImage).UnlockBits(srcBmpData); |
| | | InputImage = null; |
| | | ((Bitmap)InputImage).Dispose(); |
| | | InputImage = hImage.Clone(); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Msg = "转图出错:" + ex.Message; |
| | | Result = false; |
| | | return; |
| | | } |
| | | } |
| | | if (!(InputImage is HObject)) |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Drawing; |
| | | using System.Drawing.Imaging; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | |
| | | Result = false; |
| | | return; |
| | | } |
| | | if (InputImage is Bitmap) |
| | | { |
| | | try |
| | | { |
| | | using (HImage hImage = new HImage()) |
| | | { |
| | | Rectangle rect = new Rectangle(0, 0, ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height); |
| | | BitmapData srcBmpData = ((Bitmap)InputImage).LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb); |
| | | hImage.GenImageInterleaved(srcBmpData.Scan0, "rgbx", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, "byte", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, 0, -1, 0); |
| | | ((Bitmap)InputImage).UnlockBits(srcBmpData); |
| | | ((Bitmap)InputImage).Dispose(); |
| | | InputImage = hImage.Clone(); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Msg = "转图出错:" + ex.Message; |
| | | Result = false; |
| | | return; |
| | | } |
| | | } |
| | | if (!(InputImage is HObject)) |
| | | { |
| | | Msg = "输入图片格式不为Mat"; |
| | |
| | | using LB_VisionProcesses.Alogrithms.Halcon; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Drawing.Imaging; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | |
| | | Result = false; |
| | | return; |
| | | } |
| | | |
| | | if (InputImage is Bitmap) |
| | | { |
| | | try |
| | | { |
| | | using (HImage hImage = new HImage()) |
| | | { |
| | | Rectangle rect = new Rectangle(0, 0, ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height); |
| | | BitmapData srcBmpData = ((Bitmap)InputImage).LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb); |
| | | hImage.GenImageInterleaved(srcBmpData.Scan0, "rgbx", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, "byte", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, 0, -1, 0); |
| | | ((Bitmap)InputImage).UnlockBits(srcBmpData); |
| | | ((Bitmap)InputImage).Dispose(); |
| | | InputImage = hImage.Clone(); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Msg = "转图出错:" + ex.Message; |
| | | Result = false; |
| | | return; |
| | | } |
| | | } |
| | | if (!(InputImage is HObject)) |
| | | { |
| | | Msg = "输入图片格式不为Mat"; |
| | | Result = false; |
| | | return; |
| | | } |
| | | #region 裁剪区域 |
| | | if (!(Params.ROI is HSegment)) |
| | | { |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Diagnostics; |
| | | using System.Drawing.Imaging; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | |
| | | Result = false; |
| | | return; |
| | | } |
| | | if (InputImage is Bitmap) |
| | | { |
| | | try |
| | | { |
| | | using (HImage hImage = new HImage()) |
| | | { |
| | | Rectangle rect = new Rectangle(0, 0, ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height); |
| | | BitmapData srcBmpData = ((Bitmap)InputImage).LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb); |
| | | hImage.GenImageInterleaved(srcBmpData.Scan0, "rgbx", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, "byte", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, 0, -1, 0); |
| | | ((Bitmap)InputImage).UnlockBits(srcBmpData); |
| | | ((Bitmap)InputImage).Dispose(); |
| | | InputImage = hImage.Clone(); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Msg = "转图出错:" + ex.Message; |
| | | Result = false; |
| | | return; |
| | | } |
| | | } |
| | | if (!(InputImage is HObject)) |
| | | { |
| | | Msg = "输入图片格式不为HObject"; |
| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Diagnostics; |
| | | using System.Drawing.Imaging; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | |
| | | Result = false; |
| | | return; |
| | | } |
| | | if (InputImage is Bitmap) |
| | | { |
| | | try |
| | | { |
| | | using (HImage hImage = new HImage()) |
| | | { |
| | | Rectangle rect = new Rectangle(0, 0, ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height); |
| | | BitmapData srcBmpData = ((Bitmap)InputImage).LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb); |
| | | hImage.GenImageInterleaved(srcBmpData.Scan0, "rgbx", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, "byte", ((Bitmap)InputImage).Width, ((Bitmap)InputImage).Height, 0, 0, -1, 0); |
| | | ((Bitmap)InputImage).UnlockBits(srcBmpData); |
| | | ((Bitmap)InputImage).Dispose(); |
| | | InputImage = hImage.Clone(); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Msg = "转图出错:"+ ex.Message; |
| | | Result = false; |
| | | return; |
| | | } |
| | | } |
| | | if (!(InputImage is HObject)) |
| | | { |
| | | Msg = "输入图片格式不为Mat"; |
| | |
| | | |
| | | if (Subject.InputImage != null && Subject.InputImage is Mat) |
| | | { |
| | | TAlgorithm.Mat2HObject((Mat)Subject.InputImage, out HObject image); |
| | | using (HImage image = TAlgorithm.Mat2HObject((Mat)Subject.InputImage)) |
| | | { |
| | | inputImageHSmartWindowControl.ShowHoImage(image); |
| | | } |
| | | |
| | | } |
| | | Type type = Subject.Params.ROI?.GetType(); |
| | | if (Subject.Params.ROI != null) |
| | | { |
| | |
| | | |
| | | if (Subject.InputImage != null && Subject.InputImage is Mat) |
| | | { |
| | | TAlgorithm.Mat2HObject((Mat)Subject.InputImage, out HObject image); |
| | | using (HImage image = TAlgorithm.Mat2HObject((Mat)Subject.InputImage)) |
| | | { |
| | | HOperatorSet.GetImageSize(image, out HTuple ho_ImageWidth, out HTuple ho_ImageHeight); |
| | | recordImageHSmartWindowControl.ShowHoImage(image); |
| | | } |
| | | } |
| | | |
| | | //先判断子类再判断父类 |
| | |
| | | { |
| | | recordImageHSmartWindowControl.DispObj(msgRecord.RecordObject_OK, true); |
| | | recordImageHSmartWindowControl.DispObj(msgRecord.RecordObject_NG, false); |
| | | |
| | | for (int i = 0; i < msgRecord.Msg.Length; i++) |
| | | { |
| | | recordImageHSmartWindowControl.ShowMsg(msgRecord.Msg[i] |
| | | , 1 == msgRecord.Result[i] ? true : false, msgRecord.Column[i], msgRecord.Row[i]); |
| | | } |
| | | } |
| | | else if (Subject.Record != null && Subject.Record is ObjectRecord objRecord) |
| | | { |
| | |
| | | HTuple hv_imageHeight = 0; |
| | | if (InputImage != null && InputImage is Mat) |
| | | { |
| | | TAlgorithm.Mat2HObject((Mat)InputImage, out HObject image); |
| | | HOperatorSet.GetImageSize(image, out hv_imageWidth, out hv_imageHeight); |
| | | } |
| | | using (HImage image = TAlgorithm.Mat2HObject((Mat)InputImage)) |
| | | { |
| | | image.GetImageSize(out hv_imageWidth, out hv_imageHeight); |
| | | switch (type) |
| | | { |
| | | case RoiType.Rectangle2: |
| | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | catch { } |
| | | } |
| | | |
| | |
| | | |
| | | if (Subject.InputImage != null && Subject.InputImage is Mat) |
| | | { |
| | | TAlgorithm.Mat2HObject((Mat)Subject.InputImage, out HObject image); |
| | | using (HImage image = TAlgorithm.Mat2HObject((Mat)Subject.InputImage)) |
| | | { |
| | | inputImageHSmartWindowControl.ShowHoImage(image); |
| | | } |
| | | |
| | | Type type = Subject.Params.ROI?.GetType(); |
| | | if (Subject.Params.ROI != null) |
| | | { |
| | |
| | | default: |
| | | inputImageHSmartWindowControl.oRoi = null; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | })); |
| | | } |
| | |
| | | |
| | | if (Subject.InputImage != null && Subject.InputImage is Mat) |
| | | { |
| | | TAlgorithm.Mat2HObject((Mat)Subject.InputImage, out HObject image); |
| | | HOperatorSet.GetImageSize(image, out HTuple ho_ImageWidth, out HTuple ho_ImageHeight); |
| | | using (HImage image = TAlgorithm.Mat2HObject((Mat)Subject.InputImage)) |
| | | { |
| | | image.GetImageSize(out HTuple ho_ImageWidth, out HTuple ho_ImageHeight); |
| | | recordImageHSmartWindowControl.ShowHoImage(image); |
| | | } |
| | | |
| | | //先判断子类再判断父类 |
| | | if (Subject.Record != null && Subject.Record is MsgRecord msgRecord) |
| | | { |
| | |
| | | recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_OK, true); |
| | | recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_NG, false); |
| | | } |
| | | |
| | | } |
| | | } |
| | | GC.Collect(); |
| | | })); |
| | | } |
| | |
| | | HTuple hv_imageHeight = 0; |
| | | if (InputImage != null && InputImage is Mat) |
| | | { |
| | | TAlgorithm.Mat2HObject((Mat)InputImage, out HObject image); |
| | | HOperatorSet.GetImageSize(image, out hv_imageWidth, out hv_imageHeight); |
| | | } |
| | | using (HImage image=TAlgorithm.Mat2HObject((Mat)InputImage)) |
| | | { |
| | | image.GetImageSize(out hv_imageWidth, out hv_imageHeight); |
| | | switch (type) |
| | | { |
| | | case RoiType.Rectangle2: |
| | |
| | | default: |
| | | inputImageHSmartWindowControl.oRoi = null; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | if (InputImage != null && InputImage is Mat) |
| | | { |
| | | TAlgorithm.Mat2HObject((Mat)InputImage, out HObject image); |
| | | using (HImage image = TAlgorithm.Mat2HObject((Mat)InputImage)) |
| | | { |
| | | inputImageHSmartWindowControl.ShowHoImage(image); |
| | | } |
| | | |
| | | int hv_Elements = Convert.ToInt16(itxtCaliperCount.Text); |
| | | double hv_DetectHeight = Convert.ToDouble(dtxtCaliperHeight.Text); |
| | | double hv_DetectWidth = Convert.ToDouble(dtxtCaliperWidth.Text); |
| | |
| | | |
| | | inputImageHSmartWindowControl.DispObj(ho_Regions); |
| | | } |
| | | } |
| | | } |
| | | catch { } |
| | | })); |
| | | } |
| | |
| | | |
| | | if (Subject.InputImage != null && Subject.InputImage is Mat) |
| | | { |
| | | TAlgorithm.Mat2HObject((Mat)Subject.InputImage, out HObject image); |
| | | using (HImage image = TAlgorithm.Mat2HObject((Mat)Subject.InputImage)) |
| | | { |
| | | inputImageHSmartWindowControl.ShowHoImage(image); |
| | | } |
| | | |
| | | Type type = Subject.Params.ROI?.GetType(); |
| | | if (Subject.Params.ROI != null) |
| | | { |
| | |
| | | } |
| | | |
| | | ShowModel(((FindModelTool)Subject).ModelID); |
| | | |
| | | } |
| | | } |
| | | })); |
| | | } |
| | | |
| | |
| | | |
| | | if (Subject.InputImage != null && Subject.InputImage is Mat) |
| | | { |
| | | TAlgorithm.Mat2HObject((Mat)Subject.InputImage, out HObject image); |
| | | HOperatorSet.GetImageSize(image, out HTuple ho_ImageWidth, out HTuple ho_ImageHeight); |
| | | using (HImage image = TAlgorithm.Mat2HObject((Mat)Subject.InputImage)) |
| | | { |
| | | image.GetImageSize(out HTuple ho_ImageWidth, out HTuple ho_ImageHeight); |
| | | recordImageHSmartWindowControl.ShowHoImage(image); |
| | | } |
| | | |
| | | //先判断子类再判断父类 |
| | | if (Subject.Record != null && Subject.Record is MsgRecord msgRecord) |
| | | { |
| | |
| | | { |
| | | recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_OK, true); |
| | | recordImageHSmartWindowControl.DispObj(objRecord.RecordObject_NG, false); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | GC.Collect(); |
| | |
| | | HTuple hv_imageHeight = 0; |
| | | if (InputImage != null && InputImage is Mat) |
| | | { |
| | | TAlgorithm.Mat2HObject((Mat)InputImage, out HObject image); |
| | | using (HImage image = TAlgorithm.Mat2HObject((Mat)InputImage)) |
| | | { |
| | | HOperatorSet.GetImageSize(image, out hv_imageWidth, out hv_imageHeight); |
| | | } |
| | | switch (type) |
| | | { |
| | | case RoiType.Rectangle2: |
| | |
| | | default: |
| | | inputImageHSmartWindowControl.oRoi = null; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | if (InputImage != null && InputImage is Mat) |
| | | { |
| | | imgTabControl.SelectedTab = tabPageModelImage; |
| | | TAlgorithm.Mat2HObject((Mat)InputImage, out HObject hoDomainImage); |
| | | |
| | | using (HImage hoDomainImage = TAlgorithm.Mat2HObject((Mat)InputImage)) |
| | | { |
| | | HOperatorSet.GetImageSize(hoDomainImage, out HTuple hv_imageWidth, out HTuple hv_imageHeight); |
| | | createModelImageHSmartWindowControl.ShowHoImage((HObject)hoDomainImage); |
| | | createModelImageHSmartWindowControl.bAollowDraw = true; |
| | | createModelImageHSmartWindowControl.oRoi = new HRectangle2(hv_imageWidth.TupleReal() / 2, hv_imageHeight.TupleReal() / 2 |
| | | , 0, hv_imageWidth.TupleReal() / 4, hv_imageHeight.TupleReal() / 4); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | if (InputImage != null && InputImage is Mat) |
| | | { |
| | | double result = 0; |
| | | |
| | | if (Enum.TryParse(cmbModelType.Text, out ModelType modelType)) |
| | | { |
| | | string NumLevels = this.dtxtModelParam1.Text; |
| | |
| | | string Contrast = this.dtxtModelParam11.Text; |
| | | int MinContrast = Convert.ToInt16(this.dtxtModelParam12.Text); |
| | | HRectangle2 ROI = (HRectangle2)createModelImageHSmartWindowControl.oRoi; |
| | | |
| | | HOperatorSet.GenRectangle2(out HObject hRectangle, ROI.Row, ROI.Column, ROI.Phi, ROI.SemiLength1, ROI.SemiLength2); |
| | | TAlgorithm.Mat2HObject((Mat)InputImage, out HObject hoDomainImage); |
| | | using (HRegion hRectangle = new HRegion()) |
| | | { |
| | | hRectangle.GenRectangle2(ROI.Row, ROI.Column, ROI.Phi, ROI.SemiLength1, ROI.SemiLength2); |
| | | using (HImage hoDomainImage = TAlgorithm.Mat2HObject((Mat)InputImage)) |
| | | { |
| | | HTuple hv_Channels = new HTuple(); |
| | | //判断是否为灰度图 |
| | | using (HDevDisposeHelper dh = new HDevDisposeHelper()) |
| | | { |
| | | try |
| | | { |
| | | HOperatorSet.CountChannels(hoDomainImage, out hv_Channels); |
| | | if (hv_Channels.TupleInt() != 1) |
| | | HOperatorSet.Rgb1ToGray(hoDomainImage, out hoDomainImage); |
| | | //hv_Channels = hoDomainImage.CountChannels(); |
| | | //if (hv_Channels.TupleInt() != 1) |
| | | // HOperatorSet.Rgb1ToGray(hoDomainImage, out hoDomainImage); |
| | | |
| | | //转换后再次检查是否为灰度图 |
| | | HOperatorSet.CountChannels(hoDomainImage, out hv_Channels); |
| | | if (hv_Channels.TupleInt() != 1) |
| | | HOperatorSet.Rgb1ToGray(hoDomainImage, out hoDomainImage); |
| | | ////转换后再次检查是否为灰度图 |
| | | //HOperatorSet.CountChannels(hoDomainImage, out hv_Channels); |
| | | //if (hv_Channels.TupleInt() != 1) |
| | | // HOperatorSet.Rgb1ToGray(hoDomainImage, out hoDomainImage); |
| | | } |
| | | catch { } |
| | | } |
| | | HOperatorSet.ReduceDomain(hoDomainImage, hRectangle, out HObject hoImageReduced); |
| | | HObject hoImageReduced = hoDomainImage.Rgb1ToGray().ReduceDomain(hRectangle); |
| | | HOperatorSet.CropDomain(hoImageReduced, out hoImageReduced); |
| | | TAlgorithm.HObject2Mat(hoImageReduced, out Mat hoModelImage); |
| | | bool bCreateModel = false; |
| | |
| | | |
| | | if (bCreateModel) |
| | | { |
| | | HObject ho_ModelContours = new HObject(); |
| | | using (HObject ho_ModelContours = new HObject()) |
| | | { |
| | | //switch (((FindModelTool)Subject).ModelID.Type) |
| | | //{ |
| | | // case ModelType.局部变形模板: |
| | |
| | | //建模成功导航到子页 |
| | | parasTabControl.SelectedTab = tabPageRunParas; |
| | | //modelImageHSmartWindowControl.ShowHoImage(((HFindModelTool)Subject).ModelID.hoImage); |
| | | TAlgorithm.Mat2HObject(((FindModelTool)Subject).ModelID.hoImage, out HObject modelImage); |
| | | using (HImage modelImage = TAlgorithm.Mat2HObject(((FindModelTool)Subject).ModelID.hoImage)) |
| | | { |
| | | modelImageHSmartWindowControl.ShowHoImage(modelImage); |
| | | modelImageHSmartWindowControl.DispObj(ho_ModelContours, false); |
| | | modelImageHSmartWindowControl.ShowMsg("创建模板成功", true); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | if (ModelID != null && ModelID.Width > 0) |
| | | { |
| | | HOperatorSet.GenEmptyObj(out HObject ho_ModelContours); |
| | | //HOperatorSet.GenEmptyObj(out HObject ho_ModelContours); |
| | | using (HRegion ho_ModelContours = new HRegion()) |
| | | { |
| | | //switch (ModelID.Type) |
| | | //{ |
| | | // case ModelType.各向异形模板: |
| | |
| | | //HOperatorSet.AffineTransContourXld(ho_ModelContours, out ho_ModelContours, hv_HomMat2D); |
| | | |
| | | modelImageHSmartWindowControl.ClearObj(); |
| | | TAlgorithm.Mat2HObject(ModelID.hoImage, out HObject hoImage); |
| | | using (HImage hoImage = TAlgorithm.Mat2HObject(ModelID.hoImage)) |
| | | { |
| | | //modelImageHSmartWindowControl.ShowHoImage(ModelID.hoImage); |
| | | modelImageHSmartWindowControl.ShowHoImage(hoImage); |
| | | modelImageHSmartWindowControl.DispObj(ho_ModelContours, false); |
| | | modelImageHSmartWindowControl.ShowMsg("创建模板成功", true); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | catch { } |
| | | } |
| | | |