using OpenCvSharp; using System; namespace OpenCV { class OpenCVClass : IDisposable { IplImage gray; IplImage inversion; IplImage bin; IplImage blur; IplImage zoomin; IplImage zoomout; IplImage resize; IplImage slice; IplImage symm; IplImage rotate; IplImage affine; IplImage perspective; IplImage draw; IplImage hsv; IplImage hsvRed; public IplImage GrayScale(IplImage src) { gray = new IplImage(src.Size, BitDepth.U8, 1); Cv.CvtColor(src, gray, ColorConversion.BgrToGray); return gray; } public IplImage InversionImage(IplImage src) { inversion = new IplImage(src.Size, BitDepth.U8, 3); Cv.Not(src, inversion); return inversion; } public IplImage Binary(IplImage src) { bin = GrayScale(src); Cv.Threshold(bin, bin, 150, 255, ThresholdType.Binary); return bin; } public IplImage Blur(IplImage src) { blur = new IplImage(src.Size, BitDepth.U8, 3); Cv.Smooth(src, blur, SmoothType.Blur, 9); // param1은 홀수, 중간 픽셀 선택을 위함 return blur; } public IplImage ZoomIn(IplImage src) { zoomin = new IplImage(new CvSize(src.Width * 2, src.Height * 2) , BitDepth.U8, 3); Cv.PyrUp(src, zoomin, CvFilter.Gaussian5x5); return zoomin; } public IplImage ZoomOut(IplImage src) { zoomout = new IplImage(new CvSize(src.Width / 2, src.Height / 2), BitDepth.U8, 3); Cv.PyrDown(src, zoomout, CvFilter.Gaussian5x5); return zoomout; } public IplImage Resize(IplImage src, double widthRate, double heightRate) { resize = new IplImage(new CvSize((int)(src.Width * widthRate), (int)(src.Height * heightRate)), BitDepth.U8, 3); Cv.Resize(src, resize, Interpolation.Linear); return resize; } public IplImage Slice(IplImage src, int x, int y, int roiWidht, int roiHeight) { //slice = new IplImage(new CvSize(roiWidht, roiHeight), BitDepth.U8, 3); //src.ROI = new CvRect(x, y, roiWidht, roiHeight); //src.SetROI(new CvRect(x, y, roiWidht, roiHeight)); //Cv.SetImageROI(src, new CvRect(x, y, roiWidht, roiHeight)); //Cv.Copy(src, slice); //Cv.Resize(src, slice); //slice = src.Clone(); // 속성까지 복사되어 채널 등 값이 변경됨 //src.ResetROI(); //Cv.ResetImageROI(src); CvRect roi = new CvRect(x, y, roiWidht, roiHeight); slice = src.Clone(roi); return slice; } public IplImage Symmetry(IplImage src, FlipMode mode) { symm = new IplImage(src.Size, BitDepth.U8, 3); Cv.Flip(src, symm, mode); return symm; } public IplImage Rotate(IplImage src, double angle) { rotate = new IplImage(src.Size, BitDepth.U8, 3); CvMat matrix = Cv.GetRotationMatrix2D(new CvPoint2D32f(src.Width / 2, src.Height / 2), angle, 1); Cv.WarpAffine(src, rotate, matrix, Interpolation.Linear, CvScalar.ScalarAll(0)); return rotate; } public IplImage AffineImage(IplImage src, CvPoint2D32f[] srcPoints, CvPoint2D32f[] dstPoints) { if (srcPoints.Length != 3 || dstPoints.Length != 3) return null; affine = new IplImage(src.Size, BitDepth.U8, 3); CvMat matrix = Cv.GetAffineTransform(srcPoints, dstPoints); Cv.WarpAffine(src, affine, matrix, Interpolation.Linear, CvScalar.RealScalar(0)); return affine; } public IplImage PerspectiveImage(IplImage src, CvPoint2D32f[] srcPoints, CvPoint2D32f[] dstPoints) { if (srcPoints.Length != 4 || dstPoints.Length != 4) return null; perspective = new IplImage(src.Size, BitDepth.U8, 3); CvMat matrix = Cv.GetPerspectiveTransform(srcPoints, dstPoints); Cv.WarpPerspective(src, perspective, matrix, Interpolation.Linear, CvScalar.RealScalar(0)); return perspective; } public IplImage DrawImage() { draw = new IplImage(new CvSize(640, 480), BitDepth.U8, 3); Cv.DrawLine(draw, new CvPoint(100, 100), new CvPoint(500, 200), CvColor.Blue, 20); Cv.DrawCircle(draw, new CvPoint(200, 200), 50, CvColor.Red, -1); Cv.DrawRect(draw, new CvPoint(300, 150), new CvPoint(500, 300), CvColor.Green, 5); Cv.DrawEllipse(draw, new CvPoint(150, 400), new CvSize(100, 50), 0, 90, 360, CvColor.Green, -1); Cv.PutText(draw, "Open CV", new CvPoint(400, 400), new CvFont(FontFace.HersheyComplex, 1, 1), CvColor.White); return draw; } public IplImage HSV(IplImage src) { hsv = new IplImage(src.Size, BitDepth.U8, 3); IplImage h = new IplImage(src.Size, BitDepth.U8, 1); IplImage s = new IplImage(src.Size, BitDepth.U8, 1); IplImage v = new IplImage(src.Size, BitDepth.U8, 1); Cv.CvtColor(src, hsv, ColorConversion.BgrToHsv); Cv.Split(hsv, h, s, v, null); hsv.SetZero(); // Hue //Cv.InRangeS(h, 20, 30, h); // Yellow //Cv.Copy(src, hsv, h); // Hue - Red IplImage lowerRed = new IplImage(src.Size, BitDepth.U8, 1); IplImage upperRed = new IplImage(src.Size, BitDepth.U8, 1); IplImage red = new IplImage(src.Size, BitDepth.U8, 1); Cv.InRangeS(h, 0, 10, lowerRed); Cv.InRangeS(h, 170, 179, upperRed); Cv.AddWeighted(lowerRed, 1.0, upperRed, 1.0, 0.0, red); Cv.Copy(src, hsv, red); // Saturation //Cv.InRangeS(s, 20, 30, s); //Cv.Copy(src, hsv, s); // Value //Cv.InRangeS(v, 20, 30, v); //Cv.Copy(src, hsv, v); return hsv; } public IplImage HSVRed(IplImage src) { hsvRed = new IplImage(src.Size, BitDepth.U8, 3); IplImage lowerRed = new IplImage(src.Size, BitDepth.U8, 1); IplImage upperRed = new IplImage(src.Size, BitDepth.U8, 1); IplImage red = new IplImage(src.Size, BitDepth.U8, 1); Cv.CvtColor(src, hsvRed, ColorConversion.BgrToHsv); Cv.InRangeS(hsvRed, new CvScalar(0, 100, 100), new CvScalar(10, 255, 255), lowerRed); Cv.InRangeS(hsvRed, new CvScalar(170, 100, 100), new CvScalar(179, 255, 255), upperRed); Cv.AddWeighted(lowerRed, 1.0, upperRed, 1.0, 0.0, red); hsvRed.SetZero(); Cv.Copy(src, hsvRed, red); return hsvRed; } private void Release(params IplImage[] images) { for (int i = 0; i < images.Length; i++) { if (images[i] != null) Cv.ReleaseImage(images[i]); } } public void Dispose() { Release( gray, inversion, bin, blur, zoomin, zoomout, resize, slice, symm, rotate, affine, perspective, draw, hsv, hsvRed ); } } }