//using Emgu.CV; //using Emgu.CV.CvEnum; //using Emgu.CV.Structure; //using Euresys.Open_eVision_2_11; //using System; //using System.Collections.Generic; //using System.Drawing; //using System.Linq; //using System.Text; //using System.Threading.Tasks; //namespace Project //{ // public static class Util_Vision // { // //private static object imageLockObj = new object(); // //public struct SCodeData // //{ // // public Point[] corner; // // public string data; // // public string model; // // public string version; // // public string level; // // public string sid; // //} // //public static void DisplayQRData(List DataArr, Rectangle roi, arCtl.ImageBox iv) // //{ // // iv.ClearShape(); // // foreach (var item in DataArr) // // { // // var p = new PointF[4]; // // p[0] = new PointF(item.corner[0].X + roi.Left, item.corner[0].Y + roi.Top); // // p[1] = new PointF(item.corner[1].X + roi.Left, item.corner[1].Y + roi.Top); // // p[2] = new PointF(item.corner[2].X + roi.Left, item.corner[2].Y + roi.Top); // // p[3] = new PointF(item.corner[3].X + roi.Left, item.corner[3].Y + roi.Top); // // iv.AddShapeLine(p[0], p[1], Color.Gold, false, 5); // // iv.AddShapeLine(p[1], p[2], Color.Gold, false, 5); // // iv.AddShapeLine(p[2], p[3], Color.Gold, false, 5); // // iv.AddShapeLine(p[3], p[0], Color.Gold, false, 5); // // if (item.data.isEmpty() == false) // // { // // iv.AddShapeText(item.corner[1], item.data, Color.Black, 200); // // } // // } // //} // /// // /// 마스킹이적용된 이미지가 반환됩니다. 마스킹 // /// // /// // /// // /// // /// // /// // //public static EImageBW8 FindReelOutline(EImageBW8 orgEImage, out string Message, out PointF CenterPX, out float Diameter, arCtl.ImageBox iv = null, eCartSize reelsize = eCartSize.Inch7) // //{ // // EImageBW8 retval = null;// new EImageBW8(orgEImage.Width, orgEImage.Height); //마스킹이적용된 이미지 // // Message = string.Empty; // // CenterPX = PointF.Empty; // // Diameter = 0; // // //EWorldShape EWorldShape1 = new EWorldShape(); // EWorldShape instance // // ECircleGauge ECircleGauge1 = new ECircleGauge(); // ECircleGauge instance // // ECircle Circle1 = new ECircle(); // ECircle instance // // ECircle measuredCircle = null; // ECircle instance // // iv.ClearShape("OUTLINE"); // // try // // { // // // EBW8Image1.Load("C:\\temp\\b.bmp"); // // //ECircleGauge1.Attach(EWorldShape1); // // ECircleGauge1.Dragable = true; // // ECircleGauge1.Resizable = true; // // ECircleGauge1.Rotatable = true; // // // EWorldShape1.SetSensorSize(3289, 2406); // // // EWorldShape1.Process(EBW8Image1, true); // // ECircleGauge1.Thickness = 20; // // ECircleGauge1.TransitionChoice = ETransitionChoice.NthFromEnd; // // ECircleGauge1.FilteringThreshold = 3.00f; // // ECircleGauge1.SetCenterXY(2000f, 1400f); // // ECircleGauge1.Amplitude = 360f; // // ECircleGauge1.Tolerance = 500; // // ECircleGauge1.Diameter = 2200f; // // ECircleGauge1.Threshold = 20; // // ECircleGauge1.FilteringThreshold = 3.0f; // // ECircleGauge1.Measure(orgEImage); // // measuredCircle = ECircleGauge1.MeasuredCircle; // // if (measuredCircle.CenterX < 1 && measuredCircle.CenterY < 1) // // { // // Message = "outline not found"; // // if (reelsize != eCartSize.None) // // { // // //마스크파일이 존재하면 해당 마스크를 사용한다 // // var maskfilname = "Mask" + reelsize.ToString() + ".bmp"; // // var filename = System.IO.Path.Combine(Util.CurrentPath, "Data", maskfilname); // // if (System.IO.File.Exists(filename)) // // { // // var maskimg = new EImageBW8(); // Image(filename); // // maskimg.Load(filename); // // retval = new EImageBW8(orgEImage.Width, orgEImage.Height); // // EasyImage.Oper(EArithmeticLogicOperation.BitwiseAnd, orgEImage, maskimg, retval); // // } // // else Pub.log.AddE("마스크파일:" + maskfilname + "이존재하지 않아 사용하지 않습니다"); // // } // // } // // else // // { // // retval = new EImageBW8(orgEImage.Width, orgEImage.Height); // // Diameter = measuredCircle.Diameter; // // CenterPX = new PointF(measuredCircle.CenterX, measuredCircle.CenterY); // // var rect = new RectangleF(CenterPX.X - Diameter / 2.0f, CenterPX.Y - Diameter / 2.0f, Diameter, Diameter); // // var sh = iv.AddShapePoint(CenterPX.X, CenterPX.Y, 50, Color.Gold); // // sh.Tag = "OUTLINE"; // // var shc = iv.AddShapeCircle(rect, Color.Lime, 50); // // shc.Tag = "OUTLINE"; // // //찾은 영역을 제외하고 마스크를 만든다. // // var dt = DateTime.Now; // // var maskimg = new Image(orgEImage.Width, orgEImage.Height); // // maskimg.SetZero(); // // CvInvoke.Circle(maskimg, new Point((int)measuredCircle.CenterX, (int)measuredCircle.CenterY), (int)(Diameter / 2.0f), new Gray(255).MCvScalar, -1); // // //maskimg.Save(@"c:\temp\mask_" + dt.ToString("HHmmss") + ".bmp"); // // //마스크와 결합 // // var orgImage = new Image(orgEImage.Width, orgEImage.Height, orgEImage.RowPitch, orgEImage.GetImagePtr()); // // { // // var retimg = new Image(retval.Width, retval.Height, retval.RowPitch, retval.GetImagePtr()); // // { // // CvInvoke.BitwiseAnd(orgImage, maskimg, retimg); // // } // // } // // //orgImage.Save(@"c:\temp\type1_src1_" + dt.ToString("HHmmss") + ".bmp"); // // //maskimg.Save(@"c:\temp\type1_src2_" + dt.ToString("HHmmss") + ".bmp"); // // //maskedimg.Save(@"c:\temp\type1_dest_" + dt.ToString("HHmmss") + ".bmp"); // // //iv.AddShapeBox(rect, Color.Tomato).Tag = "OUTLINE"; // // } // // } // // catch (EException ex) // // { // // // Insert exception handling code herem // // Message = ex.Message; // // } // // if (iv != null) iv.Invalidate(); // // return retval; // //} // //public static PointF GetGainOffset(int idx) // //{ // // if (idx == 0) return new PointF(1.0f, 0.0f); // // else if (idx == 1) return new PointF(1.3f, 0.0f); // // else if (idx == 2) return new PointF(0.7f, 0.0f); // // else if (idx == 3) return new PointF(1.0f, 50.0f); // // else if (idx == 4) return new PointF(1.0f, -50.0f); // // else if (idx == 5) return new PointF(3.0f, 50.0f); //아주어두운이미지용 // // else if (idx == 6) return new PointF(0.5f, -20.0f); //아주밝은이미지용 // // //else if (idx == 7) return new PointF(1.0f, -150.0f); //밝은이미지용 // // //else if (idx == 8) return new PointF(1.0f, -170.0f); //밝은이미지용 // // //else if (idx == 9) return new PointF(1.0f, -190.0f); //밝은이미지용 // // else return new PointF(1f, 0f); // //} // //private static List GetGainOffsetList(string gainstr) // //{ // // var retval = new List(); // // var list = gainstr.Split(';'); // // foreach (var item in list) // // { // // var ptitem = item.Split(','); // // if (ptitem.Length == 2) // // { // // retval.Add(new System.Drawing.PointF(float.Parse(ptitem[0]), float.Parse(ptitem[1]))); // // } // // } // // return retval; // //} // //public static System.Collections.Generic.List DetectQR_eVision( // // EImageBW8 EBW8Image4, // // arCtl.ImageBox iv1, int idx, // // out string Message, // // string erodevaluestr = "3,1", // // string gainoffsetlist = "2,1", // // uint blob_area_min = 5000, // // uint blob_area_max = 50000, // // float blob_sigmaxy = 500f, // // float blob_sigmayy = 500f, // // float blob_sigmaxx = 5000f, // // string maskfile = "", // // Image DispImage = null // // ) // //{ // // Message = string.Empty; // // var pts = new System.Collections.Generic.List(); // // System.Diagnostics.Stopwatch wat = new System.Diagnostics.Stopwatch(); // // wat.Restart(); // // //바코드리더 // // EQRCodeReader EQRCode1 = new EQRCodeReader(); // EQRCodeReader instance // // EQRCode1.DetectionMethod = 15; //모든방법으로 데이터를 찾는다 // // EQRCode1.TimeOut = 1000 * 1000; //timeout (1초) // // //Blob 으로 바코드영역을 찾는다 // // ECodedImage2 codedImage4 = new ECodedImage2(); // ECodedImage2 instance // // EImageEncoder codedImage4Encoder = new EImageEncoder(); // EImageEncoder instance // // EObjectSelection codedImage4ObjectSelection = new EObjectSelection(); // // // codedImage4ObjectSelection.FeretAngle = 0.00f; // // using (var psegment = codedImage4Encoder.GrayscaleSingleThresholdSegmenter) //.BlackLayerEncoded = true; // // { // // psegment.BlackLayerEncoded = true; // // psegment.WhiteLayerEncoded = false; // // psegment.Mode = EGrayscaleSingleThreshold.MaxEntropy; // // } // // //침식해서 바코드영역이 뭉치도록 한다. (바코드는 검은색 영역이 된다) // // List erodevalues = new List(); // // var erodebuffer = erodevaluestr.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); // // foreach (var erbuf in erodebuffer) erodevalues.Add(uint.Parse(erbuf)); // // //마스크적용 - 210209 // // if (maskfile.isEmpty() == false && System.IO.File.Exists(maskfile)) // // { // // using (var maskmig = new EImageBW8()) // // { // // maskmig.Load(maskfile);//이미지불러오지 // // EasyImage.Oper(EArithmeticLogicOperation.BitwiseAnd, EBW8Image4, maskmig, EBW8Image4); // // } // // } // // var GainOffsetList = GetGainOffsetList(gainoffsetlist); // // uint objectCountT = 0; // // for (int maxtype = 0; maxtype < 2; maxtype++) // // { // // //침식데이터도 여러개를 사용한다. // // foreach (var erodevalue in erodevalues) // // { // // //인코딩된 이미지가 들어간다 // // var ErodeImageBW8 = new EImageBW8(EBW8Image4.Width, EBW8Image4.Height); // // EasyImage.ErodeBox(EBW8Image4, ErodeImageBW8, erodevalue); // // using (var psegment = codedImage4Encoder.GrayscaleSingleThresholdSegmenter) // // { // // if (maxtype == 0) // // psegment.Mode = EGrayscaleSingleThreshold.MinResidue; // // else if (maxtype == 1) // // psegment.Mode = EGrayscaleSingleThreshold.MaxEntropy; // // else if (maxtype == 2) // // psegment.Mode = EGrayscaleSingleThreshold.IsoData; // // } // // codedImage4Encoder.Encode(ErodeImageBW8, codedImage4); // // codedImage4ObjectSelection.Clear(); // // codedImage4ObjectSelection.AddObjects(codedImage4); // // codedImage4ObjectSelection.AttachedImage = ErodeImageBW8; // // //너무큰 개체를 제거한다. // // codedImage4ObjectSelection.RemoveUsingUnsignedIntegerFeature(EFeature.Area, blob_area_min, ESingleThresholdMode.LessEqual); // // codedImage4ObjectSelection.RemoveUsingUnsignedIntegerFeature(EFeature.Area, blob_area_max, ESingleThresholdMode.GreaterEqual); // // //개체제거 // // codedImage4ObjectSelection.RemoveUsingFloatFeature(EFeature.SigmaXY, blob_sigmaxy, ESingleThresholdMode.GreaterEqual); // // codedImage4ObjectSelection.RemoveUsingFloatFeature(EFeature.SigmaYY, blob_sigmayy, ESingleThresholdMode.LessEqual); // // codedImage4ObjectSelection.RemoveUsingFloatFeature(EFeature.SigmaXX, blob_sigmaxx, ESingleThresholdMode.GreaterEqual); // // //찾은데이터수량 // // var objectCount = codedImage4ObjectSelection.ElementCount; // // objectCountT += objectCount; // // //데이터표시 // // //찾은영역을 표시한다. // // for (uint i = 0; i < objectCount; i++) // // { // // //각 요소를 가져와서 처리한다. // // var CElement = codedImage4ObjectSelection.GetElement(i); // // var sigXY = CElement.SigmaXY; // // var sigYY = CElement.SigmaYY; // // var rCnt = CElement.RunCount; // // var rArea = CElement.Area; // // var boxW = CElement.BoundingBoxWidth * COMM.SETTING.Data.RosRectScale; // // var boxH = CElement.BoundingBoxHeight * COMM.SETTING.Data.RosRectScale; //좀더크게간다 210209 // // var boxCX = CElement.BoundingBoxCenterX; // // var boxCY = CElement.BoundingBoxCenterY; // // var boxRate = (boxW * 1.0) / boxH; // // var rect = new RectangleF(boxCX - boxW / 2.0f, boxCY - boxH / 2.0f, boxW, boxH); // // //외각상자를 표시한다 // // iv1.AddShapeBox(rect, Color.Tomato, 10); // // if (DispImage != null) // // CvInvoke.Rectangle(DispImage, // // new Rectangle((int)rect.X, (int)rect.Y, (int)rect.Width, (int)rect.Height), // // new Bgr(Color.Tomato).MCvScalar, 2); // // //해당영역을 ROI로 잡고 이미지를 검색한다 // // var RoiImage = new EROIBW8(); // // RoiImage.Attach(EBW8Image4); // // //ROI로 사용할 영역의 오류를 체크해야한다 // // var rLeft = (int)rect.Left; // // var rTop = (int)rect.Top; // // var rWid = (int)rect.Width; // // var rHei = (int)rect.Height; // // //roi 오류수정 210621 // // if (rLeft < 2) rLeft = 1; // // if (rTop < 2) rTop = 1; // // if (rWid < 10) rWid = 10; // // if (rHei < 10) rHei = 10; // // if (rLeft + rWid > EBW8Image4.Width) rWid = EBW8Image4.Width - rLeft - 1; // // if (rTop + rHei > EBW8Image4.Height) rHei = EBW8Image4.Height - rTop - 1; // // var rourect = new Rectangle(rLeft, rTop, rWid, rHei); // // RoiImage.SetPlacement(rourect.Left, rourect.Top, rourect.Width, rourect.Height); //ROI적용 // // var TargetImage = new EImageBW8(RoiImage.Width, RoiImage.Height); // // //밝기를 변경해서 처리해야한다 // // //int processCount = 9; // // foreach (var param in GainOffsetList) //원본, gain +-, offset +- 5가지 색상처리함 // // { // // EasyImage.ScaleRotate(RoiImage, 0, 0, 0, 0, 1.0f, 1.0f, 0f, TargetImage); // // //EasyImage.Copy(RoiImage, TargetImage); // // //밝기를 변경해서 사용할 것이므로 해당 변경된 밝기를 저장할 이미지를 생성한다. 210128 // // //var roiimg = new EImageBW8(TargetImage); // // //var param = Util_Vision.GetGainOffset(bright); // // if (param.X != 1.0f || param.Y != 0.0f) EasyImage.GainOffset(TargetImage, TargetImage, param.X, param.Y); // // //else RoiImage.CopyTo(TargetImage); ;// TargetImage.CopyTo(roiimg); //변경하지 않고 그대로 사용한다 // // //적용파일을 모두 저장해준다. // // //var roifilename = @"c:\temp\roi_" + i.ToString() + "_g" + param.X.ToString() + "_o" + param.Y.ToString() + ".bmp"; // // //TargetImage.Save(roifilename); // // EQRCode1.SearchField = TargetImage; // // var EQRCode2Result = EQRCode1.Read(); // // for (int j = 0; j < EQRCode2Result.Length; j++) // // { // // var QrData = EQRCode2Result[j]; // // if (QrData.IsDecodingReliable) // // { // // var geo = QrData.Geometry; // // var pos = geo.Position; // // var cornous = pos.Corners; // // var resultData = new Util_Vision.SCodeData(); // // //테두리좌표 읽기 // // var resultcorns = new List(); // // for (int k = 0; k < cornous.Length; k++) // // { // // var con = cornous[k]; // // resultcorns.Add(new Point((int)(con.X + rect.X), (int)(con.Y + rect.Y))); // // con.Dispose(); // // } // // resultData.corner = resultcorns.ToArray(); // // //데이터읽기 // // resultData.model = QrData.Model.ToString(); // // resultData.version = QrData.Version.ToString(); // // resultData.level = QrData.Level.ToString(); // // resultData.sid = string.Empty; // // //바코드데이터확인 // // var decodestr = QrData.DecodedStream; // // resultData.data = string.Empty; // // foreach (var item in decodestr.DecodedStreamParts) // // { // // resultData.data += System.Text.Encoding.Default.GetString(item.DecodedData); // // item.Dispose(); // // } // // var c = new StdLabelPrint.CAmkorSTDBarcode(resultData.data); // // if (c.isValid) resultData.sid = c.SID; // // else resultData.sid = string.Empty; // // //if (c.isValid) break; // // //else resultData.data = string.Empty; // // //결과데이터 추가 // // if (resultData.data.isEmpty() == false) // // { // // if (pts.Where(t => t.data == resultData.data).Any() == false) // // { // // pts.Add(resultData); // // //자료가잇다면 표시한다. // // var dispvalue = resultData.data; // // if (c.isValid == false) dispvalue += "\n" + c.Message; // // else if (c.DateError) dispvalue += "\n** Date Error **"; // // iv1.AddShapeText(resultcorns[1].X, resultcorns[1].Y, dispvalue, (c.isValid ? Color.Yellow : Color.Red), 50); // // if (DispImage != null) // // CvInvoke.PutText(DispImage, // // dispvalue, // // new Point(resultcorns[1].X, resultcorns[1].Y), FontFace.HersheyDuplex, 2, // // new Bgr(Color.Tomato).MCvScalar, 2); // // //찾은테두리를 화면에 표시한다. // // foreach (var pt in resultcorns) // // { // // iv1.AddShapePoint(pt, 20f, Color.Lime); // // if (DispImage != null) // // { // // CvInvoke.Line(DispImage, // // new Point(pt.X - 10, pt.Y - 10), // // new Point(pt.X + 10, pt.Y + 10), // // new Bgr(Color.Lime).MCvScalar, 2); // // CvInvoke.Line(DispImage, // // new Point(pt.X + 10, pt.Y - 10), // // new Point(pt.X - 10, pt.Y + 10), // // new Bgr(Color.Lime).MCvScalar, 2); // // } // // } // // } // // } // // decodestr.Dispose(); // // decodestr = null; // // cornous = null; // // pos.Dispose(); // // geo.Dispose(); // // } // // QrData.Dispose(); // // } // // } // // TargetImage.Dispose(); // // TargetImage = null; // // CElement.Dispose(); // // } // // ErodeImageBW8.Dispose(); //침식된 이미지 // // } // // } // // EQRCode1.Dispose(); // // codedImage4ObjectSelection.Dispose(); //엔코더결과값소거 // // codedImage4Encoder.Dispose(); //엔코더소거 // // codedImage4.Dispose(); //코딩된이미지 // // wat.Stop(); // // //iv1.AddShapeText(50, 50, wat.ElapsedMilliseconds.ToString() + "ms", Color.Lime, 50f); // // var mm = "[" + objectCountT.ToString() + "] " + wat.ElapsedMilliseconds.ToString() + "ms"; // // var mmpt = new Point(20, 30 + (idx * 140)); // // iv1.AddShapeText(mmpt.X, mmpt.Y, mm, Color.Lime, 100f); // // if (DispImage != null) // // { // // mmpt.Offset(0, 150); // // CvInvoke.PutText(DispImage, mm, mmpt, FontFace.HersheyDuplex, 6, new Bgr(Color.Lime).MCvScalar, 4); // // mmpt.Offset(1100, 0); // // CvInvoke.PutText(DispImage, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), mmpt, FontFace.HersheyDuplex, 6, new Bgr(Color.Gold).MCvScalar, 4); // // } // // iv1.Invalidate(); // // return pts; // //} // } //}