using Aurora.Api.DataType; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Media.Imaging; using OpenCvSharp; using Matrox.MatroxImagingLibrary; using Aurora.Api.Devices; using System.IO; using System.Configuration; using Aurora.Util.HislogPlus; namespace WeldingCommon.Utils { public class ImageUtil { public static void SaveFieldScanImageJPG(MIL_ID image, string fileName, int value, bool useCompress = false) { if (useCompress) { CompressSaveImage(image, fileName, MIL.M_JPEG_LOSSY, value); } else { CompressSaveImage(image, fileName, MIL.M_PNG); } } public static void SaveGrabImageJPG(MIL_ID image, string fileName, int value, bool useCompress = false) { if (useCompress) { CompressSaveImage(image, fileName, MIL.M_JPEG_LOSSY, value); } else { CompressSaveImage(image, fileName, MIL.M_PNG); } } private static bool CompressSaveImage(MIL_ID image, string filePath, MIL_INT format, int icompress = 5) { string directoryName = Path.GetDirectoryName(filePath); if (Directory.Exists(directoryName) == false) { Directory.CreateDirectory(directoryName); } if (format == MIL.M_JPEG_LOSSY) { MIL_INT sizeX = 0, sizeY = 0, attribute = 0; MIL_ID milSystem = MIL.M_NULL; attribute = MIL.M_IMAGE + MIL.M_COMPRESS + MIL.M_JPEG_LOSSY; MIL.MbufInquire(image, MIL.M_SIZE_X, ref sizeX); MIL.MbufInquire(image, MIL.M_SIZE_Y, ref sizeY); MIL.MbufInquire(image, MIL.M_OWNER_SYSTEM, ref milSystem); MIL_ID compressImage = MIL.M_NULL; MIL.MbufAllocColor(milSystem, 3, sizeX, sizeY, 8 + MIL.M_UNSIGNED, attribute, ref compressImage); MIL.MbufControl(compressImage, MIL.M_Q_FACTOR, icompress); // 1 ~ 99(압축율 최소 ~ 최대) MIL.MbufCopy(image, compressImage); MIL.MbufExport(filePath, format, compressImage); MIL.MbufFree(compressImage); } else { MIL.MbufExport(filePath, format, image); } return true; } public static Point[][] FindMinContourForCenter(Mat oriImg, double threshold) { // Convert to grayscale Mat grayImg = new Mat(); Cv2.CvtColor(oriImg, grayImg, ColorConversionCodes.BGR2GRAY); // Apply threshold Mat thresImg = new Mat(); Cv2.Threshold(grayImg, thresImg, threshold, 200, ThresholdTypes.BinaryInv); // Find contours Point[][] contours; HierarchyIndex[] hierarchy; Cv2.FindContours(thresImg, out contours, out hierarchy, RetrievalModes.CComp, ContourApproximationModes.ApproxSimple); //string InvertedImgfilePath = Path.Combine(ConfigurationManager.AppSettings.Get("DATA_PATH"), "_vision", "EdgeContour", "ImgTest", // string.Format($"InvertedImg{DateTime.Now.Year}_{DateTime.Now.Month}_{DateTime.Now.Day}.jpg")); //Cv2.ImWrite(InvertedImgfilePath, InvertedImg); int minWidth = 150; int minWSize = int.MaxValue; int minCntNo = 0; for (int i = 0; i < contours.Length; i++) { Rect rect = Cv2.BoundingRect(contours[i]); if (rect.Width < minWidth) { continue; } if (minWSize > rect.Width) { minWSize = rect.Width; minCntNo = i; } } // Create an empty image to draw the minimum contour Mat minCntImg = Mat.Zeros(oriImg.Size(), MatType.CV_8UC1); // Draw the minimum contour Cv2.DrawContours(minCntImg, contours, minCntNo, Scalar.White, -1); // Find the contour again in the drawn image Point[][] minContour; Cv2.FindContours(minCntImg, out minContour, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple); return minContour; } // TODO: file path 를 string 으로 받아 올 수 있도록 수정 public static void SaveCenterImage(Mat imagesource) { string savepath = Path.Combine(ConfigurationManager.AppSettings.Get("DATA_PATH"), "_vision", "EdgeContourImage", string.Format($"{DateTime.Now.Year}_{DateTime.Now.Month}_{DateTime.Now.Day}/{DateTime.Now.ToString("HHmmss")}.PNG")); try { if (Directory.Exists(Path.GetDirectoryName(savepath)) == false) { Directory.CreateDirectory(Path.GetDirectoryName(savepath)); } Cv2.ImWrite(savepath, imagesource); } catch (Exception e) { } } } }