public static void EqualizeHistHsv() { Glb.DrawMatAndHist0(Glb.matSrc); Glb.DrawMat0(Glb.matSrc); // BGR to HSV변환 var matHsv = Glb.matSrc.CvtColor(ColorConversionCodes.BGR2HSV); Glb.DrawHist0(matHsv, true); // 채널 분리 var hsvChannels = matHsv.Split(); // 변환 hsvChannels[2] = hsvChannels[2].EqualizeHist(); // 채널 병합 var matDst = new Mat(); Cv2.Merge(hsvChannels, matDst); Glb.DrawHist1(matDst, true); // HSV to BGR변환 matDst = matDst.CvtColor(ColorConversionCodes.HSV2BGR); Glb.DrawMat1(matDst); Glb.DrawMatAndHist2(null); matHsv.Dispose(); matDst.Dispose(); }
//public static void GenerateHoleTest( // int bufWidth = 1000, int bufHeight = 1000, byte bufColor = 35, // int circleX = 500, int circleY = 500, int circleRadius = 30, byte circleColor = 255, // double blurKsize = 61, double blurSigma = 0, // int resizeX = 100, int resizeY = 100) { // var matImage = new Mat(bufHeight, bufWidth, MatType.CV_8UC1); // matImage.FloodFill(new Point(0, 0), bufColor); // matImage.Circle(circleX, circleY, circleRadius, circleColor); // matImage.FloodFill(new Point(circleX, circleY), circleColor); // Glb.DrawMatAndHist0(matImage); // var matBlur = matImage.GaussianBlur(new Size(blurKsize, blurKsize), blurSigma, blurSigma, BorderTypes.Replicate); // Glb.DrawMatAndHist1(matBlur); // var matResize = matBlur.Resize(new Size(resizeX, resizeY)); // Glb.DrawMatAndHist2(matResize); // matResize.Dispose(); // matBlur.Dispose(); // matImage.Dispose(); //} //public static void GenerateHoleLocationSaveTest( // int bufWidth = 1000, int bufHeight = 1000, byte bufColor = 35, // int circleX = 500, int circleY = 500, int circleRadius = 30, byte circleColor = 255, // double blurKsize = 61, double blurSigma = 0, // int resizeX = 100, int resizeY = 100) { // for (int y = circleY; y < circleY + 10; y++) { // for (int x = circleX; x < circleX + 10; x++) { // var matImage = new Mat(bufHeight, bufWidth, MatType.CV_8UC1); // matImage.FloodFill(new Point(0, 0), bufColor); // matImage.Circle(x, y, circleRadius, circleColor); // matImage.FloodFill(new Point(x, y), circleColor); // Glb.DrawMatAndHist0(matImage); // var matBlur = matImage.GaussianBlur(new Size(blurKsize, blurKsize), blurSigma, blurSigma, BorderTypes.Replicate); // Glb.DrawMatAndHist1(matBlur); // var matResize = matBlur.Resize(new Size(resizeX, resizeY)); // Glb.DrawMatAndHist2(matResize); // string imageFilePath = $@"C:\test\ContactHole_Location\HolePos_({x},{y}).bmp"; // bool r = matResize.SaveImage(imageFilePath); // Console.WriteLine($"Save Image File : {imageFilePath} => {r}"); // matResize.Dispose(); // matBlur.Dispose(); // matImage.Dispose(); // } // } //} //public static void GenerateHoleSizeSaveTest( // int bufWidth = 1000, int bufHeight = 1000, byte bufColor = 35, // int circleX = 500, int circleY = 500, int circleRadius = 30, byte circleColor = 255, // double blurKsize = 61, double blurSigma = 0, // int resize = 100) { // for (int i = - 20; i <= 20; i += 4) { // var matImage = new Mat(bufHeight, bufWidth, MatType.CV_8UC1); // matImage.FloodFill(new Point(0, 0), bufColor); // matImage.Circle(circleX, circleY, circleRadius, circleColor); // matImage.FloodFill(new Point(circleX, circleY), circleColor); // Glb.DrawMatAndHist0(matImage); // var matBlur = matImage.GaussianBlur(new Size(blurKsize, blurKsize), blurSigma, blurSigma, BorderTypes.Replicate); // Glb.DrawMatAndHist1(matBlur); // int roiSize = 60; // int resize2 = resize + i; // var matResizeHole = matBlur.Resize(new Size(resize2, resize2)); // var matResizeHoleRoi = new Mat(matResizeHole, new Rect((resize2-roiSize)/2, (resize2-roiSize)/2, roiSize, roiSize)); // var matResizeOri = matImage.Resize(new Size(resize, resize)); // var matResizeOriRoi = new Mat(matResizeOri, new Rect((resize-roiSize)/2, (resize-roiSize)/2, roiSize, roiSize)); // matResizeHoleRoi.CopyTo(matResizeOriRoi); // string imageFilePath = $@"C:\test\ContactHole_Size\HoleSize_({resize2:000}).bmp"; // bool r = matResizeOri.SaveImage(imageFilePath); // Console.WriteLine($"Save Image File : {imageFilePath} => {r}"); // matResizeHole.Dispose(); // matBlur.Dispose(); // matImage.Dispose(); // } //} public static void HSVControl(double hscale = 1.0, double hoffset = 0.0, double sscale = 1.0, double soffset = 0.0, double vscale = 1.0, double voffset = 0.0) { Glb.DrawMat0(Glb.matSrc); // BGR to HSV변환 var matHsv = Glb.matSrc.CvtColor(ColorConversionCodes.BGR2HSV); Glb.DrawHist0(matHsv, true); // 채널 분리 var hsvChannels = matHsv.Split(); // 변환 hsvChannels[0].ConvertTo(hsvChannels[0], MatType.CV_8UC1, hscale, hoffset); hsvChannels[1].ConvertTo(hsvChannels[1], MatType.CV_8UC1, sscale, soffset); hsvChannels[2].ConvertTo(hsvChannels[2], MatType.CV_8UC1, vscale, voffset); // 채널 병합 var matDst = new Mat(); Cv2.Merge(hsvChannels, matDst); Glb.DrawHist1(matDst, true); // HSV to BGR변환 matDst = matDst.CvtColor(ColorConversionCodes.HSV2BGR); Glb.DrawMat1(matDst); Glb.DrawMatAndHist2(null); matHsv.Dispose(); matDst.Dispose(); }
public static void CarbonPaper(int x1 = 100, int y1 = 300, int x2 = 1100, int y2 = 1600, ThresholdTypes thrType = ThresholdTypes.Binary, int thr = 128, int filterArea = 30) { // 1. convert to grayscale var matGray = Glb.matSrc.CvtColor(ColorConversionCodes.BGR2GRAY); // 2. roi crop Rect roi = new Rect(x1, y1, x2 - x1 + 1, y2 - y1 + 1); var matGrayDrawRoi = Glb.matSrc.Clone(); matGrayDrawRoi.Rectangle(roi, Scalar.Yellow); Glb.DrawMat0(matGrayDrawRoi); var matRoi = new Mat(matGray, roi); Glb.DrawHist0(matRoi); // 3. threshold var matThr = matRoi.Threshold(thr, 255, thrType); Glb.DrawMatAndHist1(matThr); // 4. blob with area filter CvBlobs blobs = new CvBlobs(); blobs.Label(matThr); blobs.FilterByArea(filterArea, int.MaxValue); // 5. display blob var matDsp = new Mat(matRoi.Rows, matRoi.Cols, MatType.CV_8UC3); matDsp.SetTo(Scalar.Black); blobs.RenderBlobs(matDsp, matDsp, RenderBlobsModes.Color); Glb.DrawMatAndHist2(matDsp); Console.WriteLine("blobs.cnt = {0}", blobs.Count); matGray.Dispose(); matGrayDrawRoi.Dispose(); matRoi.Dispose(); matThr.Dispose(); matDsp.Dispose(); }