|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
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 void Dispose()
|
|
|
|
|
{
|
|
|
|
|
if (gray != null)
|
|
|
|
|
Cv.ReleaseImage(gray);
|
|
|
|
|
if (inversion != null)
|
|
|
|
|
Cv.ReleaseImage(inversion);
|
|
|
|
|
if (bin != null)
|
|
|
|
|
Cv.ReleaseImage(bin);
|
|
|
|
|
if (blur != null)
|
|
|
|
|
Cv.ReleaseImage(blur);
|
|
|
|
|
if (zoomin != null)
|
|
|
|
|
Cv.ReleaseImage(zoomin);
|
|
|
|
|
if (zoomout != null)
|
|
|
|
|
Cv.ReleaseImage(zoomout);
|
|
|
|
|
if (resize != null)
|
|
|
|
|
Cv.ReleaseImage(resize);
|
|
|
|
|
if (slice != null)
|
|
|
|
|
Cv.ReleaseImage(slice);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|