Ejemplo n.º 1
0
        public IplImage PreProcess(IplImage image)
        {
            var maskedImage = new IplImage(image.Size, image.Depth, image.NChannels);

            image.Copy(maskedImage, Mask);
            return(maskedImage);
        }
Ejemplo n.º 2
0
        public IplImage BuildHist(IplImage src_tmp)
        {
            const int histSize = 64;

            float[]   range0 = { 0, 256 };
            float[][] ranges = { range0 };
            // 화상의 읽기
            using (IplImage srcImg = new IplImage(src_tmp.Size, BitDepth.U8, 1))
                using (IplImage dstImg = new IplImage(src_tmp.Size, BitDepth.U8, 1))
                    using (IplImage histImg = new IplImage(new CvSize(400, 400), BitDepth.U8, 1))
                        using (CvHistogram hist = new CvHistogram(new int[] { histSize }, HistogramFormat.Array, ranges, true))
                        {
                            src_tmp.CvtColor(srcImg, ColorConversion.BgrToGray);
                            srcImg.Copy(dstImg);
                            using (CvWindow windowImage = new CvWindow("변환된 이미지", WindowMode.AutoSize))
                                using (CvWindow windowHist = new CvWindow("히스토그램", WindowMode.AutoSize))
                                {
                                    // 트랙바가 동작되었을 때의 처리
                                    CvTrackbar         ctBrightness = null;
                                    CvTrackbar         ctContrast   = null;
                                    CvTrackbarCallback callback     = delegate(int pos)
                                    {
                                        int brightness = ctBrightness.Pos - 100;
                                        int contrast   = ctContrast.Pos - 100;
                                        // LUT의 적용
                                        byte[] lut = CalcLut(contrast, brightness);
                                        srcImg.LUT(dstImg, lut);
                                        // 히스토그램 그리기
                                        CalcHist(dstImg, hist);
                                        DrawHist(histImg, hist, histSize);
                                        // 윈도우에 표시
                                        DstHist = histImg.Clone();
                                        windowImage.ShowImage(dstImg);
                                        windowHist.ShowImage(histImg);
                                        dstImg.Zero();
                                        histImg.Zero();
                                    };
                                    // 트랙바의 작성
                                    ctBrightness = windowImage.CreateTrackbar("명도", 100, 200, callback);
                                    ctContrast   = windowImage.CreateTrackbar("대조", 100, 200, callback);
                                    // 첫회 그리기
                                    callback(0);
                                    // 키 입력대기
                                    Cv.WaitKey(0);
                                }
                            return(DstHist);
                        }
        }
Ejemplo n.º 3
0
        public static IplImage testContours(IplImage target)
        {
            if (g_storage == null)
            {
                g_gray    = new IplImage(target.Size, BitDepth.U8, 1);
                g_binary  = new IplImage(target.Size, BitDepth.U8, 1);
                g_storage = new CvMemStorage(0);
            }
            else
            {
                g_storage.Clear();
            }

            CvSeq <CvPoint> contours;

            target.CvtColor(g_gray, ColorConversion.BgrToGray);

            g_gray.Threshold(g_gray, g_thresh, 255, ThresholdType.Binary);
            g_gray.Copy(g_binary);

            g_gray.FindContours(g_storage, out contours, CvContour.SizeOf, ContourRetrieval.CComp);

            g_gray.Zero();

            if (contours != null)
            {
                contours.ApproxPoly(CvContour.SizeOf, g_storage, ApproxPolyMethod.DP, 3, true);
                g_gray.DrawContours(contours, new CvScalar(255), new CvScalar(128), 100);
            }


            //g_gray.Dilate(g_gray, null, 2);
            //g_gray.Erode(g_gray, null, 2);

            return(g_gray);
        }
Ejemplo n.º 4
0
        //* TrackBar _ Erode *//
        private void trackBar_Erode_Scroll(object sender, EventArgs e)
        {
            IplConvKernel element = new IplConvKernel(3, 3, 1, 1, ElementShape.Rect, null);

            if (checkBox_isNegative.Checked == false)
            {
                if (trackBar_Bold.Value == 1)
                {
                    beforeErode.Erode(imgBox, element, 1);
                    pictureBox.ImageIpl = imgBox;
                }
                else if (trackBar_Bold.Value == 2)
                {
                    beforeErode.Erode(imgBox, element, 2);
                    pictureBox.ImageIpl = imgBox;
                }
                else if (trackBar_Bold.Value == 3)
                {
                    beforeErode.Erode(imgBox, element, 3);
                    pictureBox.ImageIpl = imgBox;
                }
                else if (trackBar_Bold.Value == 4)
                {
                    beforeErode.Erode(imgBox, element, 4);
                    pictureBox.ImageIpl = imgBox;
                }
                else if (trackBar_Bold.Value == 5)
                {
                    beforeErode.Erode(imgBox, element, 5);
                    pictureBox.ImageIpl = imgBox;
                }
                else
                {
                    beforeErode.Copy(imgBox);
                    pictureBox.ImageIpl = imgBox;
                }
            }
            else if (checkBox_isNegative.Checked == true)
            {
                if (trackBar_Bold.Value == 1)
                {
                    beforeErode.Dilate(imgBox, element, 1);
                    pictureBox.ImageIpl = imgBox;
                }
                else if (trackBar_Bold.Value == 2)
                {
                    beforeErode.Dilate(imgBox, element, 2);
                    pictureBox.ImageIpl = imgBox;
                }
                else if (trackBar_Bold.Value == 3)
                {
                    beforeErode.Dilate(imgBox, element, 3);
                    pictureBox.ImageIpl = imgBox;
                }
                else if (trackBar_Bold.Value == 4)
                {
                    beforeErode.Dilate(imgBox, element, 4);
                    pictureBox.ImageIpl = imgBox;
                }
                else if (trackBar_Bold.Value == 5)
                {
                    beforeErode.Dilate(imgBox, element, 5);
                    pictureBox.ImageIpl = imgBox;
                }
                else
                {
                    beforeErode.Copy(imgBox);
                    pictureBox.ImageIpl = imgBox;
                }
            }
        }
Ejemplo n.º 5
0
        //* MODE : RING *//
        private IplImage mode_Ring(IplImage srcImg)
        {
            // 1. 링(고리) 생성
            IplImage temp = Properties.Resources.gr.ToIplImage();
            IplImage gr   = new IplImage(temp.Size, srcImg.Depth, srcImg.NChannels);

            temp.CvtColor(gr, ColorConversion.BgrToGray);
            temp.Dispose(); //해제


            // 2. 객체추출
            Took3D.checkSize(srcImg);
            int minX = Took3D.minX, minY = Took3D.minY;
            int maxX = Took3D.maxX - minX, maxY = Took3D.maxY - minY;

            srcImg.SetROI(new CvRect(minX, minY, maxX, maxY));
            IplImage src = new IplImage(maxX, maxY, srcImg.Depth, srcImg.NChannels);

            srcImg.Copy(src);


            // 3. 이미지 변환
            Took3D.negativeImg(src);


            // 4. 이미지 크기 조정
            IplImage gr_hole;

            int roi_X      = 37;
            int roi_Y      = 226;
            int roi_width  = 204;
            int roi_height = 175;

            //int X_wid = 240;
            //int Y_hei = 379;

            int setHeight = 0, setWidth = 0;

            if (src.Width > src.Height)
            {
                setWidth  = roi_width;
                setHeight = (roi_width * src.Height) / src.Width;

                if (setHeight > roi_height)
                {
                    setHeight = roi_height;
                    setWidth  = (roi_height * setWidth) / setHeight;
                }
                gr_hole = new IplImage(setWidth, setHeight, src.Depth, src.NChannels);
            }
            else if (src.Width < src.Height)
            {
                setHeight = roi_height;
                setWidth  = (roi_height * src.Width) / src.Height;

                if (setWidth > roi_width)
                {
                    setWidth  = roi_width;
                    setHeight = (roi_width * setHeight) / setWidth;
                }

                gr_hole = new IplImage(setWidth, setHeight, src.Depth, src.NChannels);
            }
            else
            {
                setHeight = roi_height;
                setWidth  = (roi_height * src.Width) / src.Height;
                gr_hole   = new IplImage(setWidth, setHeight, src.Depth, src.NChannels);
            }
            src.Resize(gr_hole, Interpolation.Cubic);


            //5. 위치 조정
            int mid_X = (roi_width / 2) - (gr_hole.Width / 2);

            gr.SetROI(roi_X + mid_X, roi_Y, gr_hole.Width, gr_hole.Height);


            //6. 합성
            gr_hole.Copy(gr);


            //7. 메모리 정리
            gr.ResetROI();
            srcImg.ResetROI();
            gr_hole.Dispose();
            src.Dispose();

            return(gr);
        }
Ejemplo n.º 6
0
        private IplImage Dot_Resize(IplImage srcImg)
        {
            // 1. 객체추출
            Took3D.checkSize(srcImg);
            int minX = Took3D.minX, minY = Took3D.minY;
            int maxX = Took3D.maxX - minX, maxY = Took3D.maxY - minY;

            srcImg.SetROI(new CvRect(minX, minY, maxX, maxY));
            IplImage src = new IplImage(maxX, maxY, srcImg.Depth, srcImg.NChannels);

            srcImg.Copy(src);

            // 2. 도트 밑판 생성
            IplImage dotBackImg = new IplImage(500, 500, src.Depth, src.NChannels);

            dotBackImg.Set(CvScalar.ScalarAll(255));

            // 3. 도트이미지 크기조정
            int roi_width  = 470;
            int roi_height = 470;

            IplImage temp;
            int      setHeight = 0, setWidth = 0;

            if (src.Width > src.Height)
            {
                setWidth  = roi_width;
                setHeight = (roi_width * src.Height) / src.Width;

                if (setHeight > roi_height)
                {
                    setHeight = roi_height;
                    setWidth  = (roi_height * setWidth) / setHeight;
                }
                temp = new IplImage(setWidth, setHeight, src.Depth, src.NChannels);
            }
            else if (src.Width < src.Height)
            {
                setHeight = roi_height;
                setWidth  = (roi_height * src.Width) / src.Height;

                if (setWidth > roi_width)
                {
                    setWidth  = roi_width;
                    setHeight = (roi_width * setHeight) / setWidth;
                }

                temp = new IplImage(setWidth, setHeight, src.Depth, src.NChannels);
            }
            else
            {
                setHeight = roi_height;
                setWidth  = (roi_height * src.Width) / src.Height;
                temp      = new IplImage(setWidth, setHeight, src.Depth, src.NChannels);
            }
            src.Resize(temp, Interpolation.Cubic);

            // 4. 위치 조정
            int mid_X = (500 / 2) - (temp.Width / 2);
            int mid_Y = (500 / 2) - (temp.Height / 2);

            dotBackImg.SetROI(mid_X, mid_Y, temp.Width, temp.Height);

            // 5. 삽입
            temp.Copy(dotBackImg);

            // 6. 메모리 정리
            srcImg.ResetROI();
            dotBackImg.ResetROI();
            temp.Dispose();
            src.Dispose();

            return(dotBackImg);
        }
Ejemplo n.º 7
0
        //* MODE : STAMP *//
        private IplImage mode_Stamp(IplImage srcImg)
        {
            // 1. 객체추출
            Took3D.checkSize(srcImg);
            int minX = Took3D.minX, minY = Took3D.minY;
            int maxX = Took3D.maxX - minX, maxY = Took3D.maxY - minY;

            srcImg.SetROI(new CvRect(minX, minY, maxX + 1, maxY + 1));
            IplImage src = new IplImage(maxX + 1, maxY + 1, srcImg.Depth, srcImg.NChannels);

            srcImg.Copy(src);

            // 2. 도장이미지 생성
            IplImage stampImg = new IplImage(200, 200, src.Depth, src.NChannels);

            stampImg.Set(CvScalar.ScalarAll(255));

            // 3. 도장이미지 크기조정
            int roi_width  = 175;
            int roi_height = 175;

            IplImage gr_hole;
            int      setHeight = 0, setWidth = 0;

            if (src.Width > src.Height)
            {
                setWidth  = roi_width;
                setHeight = (roi_width * src.Height) / src.Width;

                if (setHeight > roi_height)
                {
                    setHeight = roi_height;
                    setWidth  = (roi_height * setWidth) / setHeight;
                }
                gr_hole = new IplImage(setWidth, setHeight, src.Depth, src.NChannels);
            }
            else if (src.Width < src.Height)
            {
                setHeight = roi_height;
                setWidth  = (roi_height * src.Width) / src.Height;

                if (setWidth > roi_width)
                {
                    setWidth  = roi_width;
                    setHeight = (roi_width * setHeight) / setWidth;
                }

                gr_hole = new IplImage(setWidth, setHeight, src.Depth, src.NChannels);
            }
            else
            {
                setHeight = roi_height;
                setWidth  = (roi_height * src.Width) / src.Height;
                gr_hole   = new IplImage(setWidth, setHeight, src.Depth, src.NChannels);
            }
            src.Resize(gr_hole, Interpolation.Cubic);

            // 4. 위치 조정
            int mid_X = (200 / 2) - (gr_hole.Width / 2);
            int mid_Y = (200 / 2) - (gr_hole.Height / 2);

            stampImg.SetROI(mid_X, mid_Y, gr_hole.Width, gr_hole.Height);

            // 5. 삽입
            gr_hole.Copy(stampImg);

            // 6. 메모리 정리
            srcImg.ResetROI();
            stampImg.ResetROI();
            gr_hole.Dispose();
            src.Dispose();

            return(stampImg);
        }
Ejemplo n.º 8
0
        public Inpaint()
        {
            // cvInpaint

            Console.WriteLine(
                "Hot keys: \n" +
                "\tESC - quit the program\n" +
                "\tr - restore the original image\n" +
                "\ti or ENTER - run inpainting algorithm\n" +
                "\t\t(before running it, paint something on the image)\n" +
                "\ts - save the original image, mask image, original+mask image and inpainted image to desktop."
                );

            using (IplImage img0 = new IplImage(FilePath.Image.Fruits, LoadMode.AnyDepth | LoadMode.AnyColor))
            {
                using (IplImage img = img0.Clone())
                    using (IplImage inpaintMask = new IplImage(img0.Size, BitDepth.U8, 1))
                        using (IplImage inpainted = img0.Clone())
                        {
                            inpainted.Zero();
                            inpaintMask.Zero();

                            using (CvWindow wImage = new CvWindow("image", WindowMode.AutoSize, img))
                            {
                                CvPoint prevPt = new CvPoint(-1, -1);
                                wImage.OnMouseCallback += delegate(MouseEvent ev, int x, int y, MouseEvent flags)
                                {
                                    if (ev == MouseEvent.LButtonUp || (flags & MouseEvent.FlagLButton) == 0)
                                    {
                                        prevPt = new CvPoint(-1, -1);
                                    }
                                    else if (ev == MouseEvent.LButtonDown)
                                    {
                                        prevPt = new CvPoint(x, y);
                                    }
                                    else if (ev == MouseEvent.MouseMove && (flags & MouseEvent.FlagLButton) != 0)
                                    {
                                        CvPoint pt = new CvPoint(x, y);
                                        if (prevPt.X < 0)
                                        {
                                            prevPt = pt;
                                        }
                                        inpaintMask.Line(prevPt, pt, CvColor.White, 5, LineType.AntiAlias, 0);
                                        img.Line(prevPt, pt, CvColor.White, 5, LineType.AntiAlias, 0);
                                        prevPt = pt;
                                        wImage.ShowImage(img);
                                    }
                                };

                                for (; ;)
                                {
                                    switch ((char)CvWindow.WaitKey(0))
                                    {
                                    case (char)27: // exit
                                        CvWindow.DestroyAllWindows();
                                        return;

                                    case 'r': // restore original image
                                        inpaintMask.Zero();
                                        img0.Copy(img);
                                        wImage.ShowImage(img);
                                        break;

                                    case 'i': // do Inpaint
                                    case '\r':
                                        CvWindow wInpaint = new CvWindow("inpainted image", WindowMode.AutoSize);
                                        img.Inpaint(inpaintMask, inpainted, 3, InpaintMethod.Telea);
                                        wInpaint.ShowImage(inpainted);
                                        break;

                                    case 's': // save images
                                        string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                                        img0.SaveImage(Path.Combine(desktop, "original.png"));
                                        inpaintMask.SaveImage(Path.Combine(desktop, "mask.png"));
                                        img.SaveImage(Path.Combine(desktop, "original+mask.png"));
                                        inpainted.SaveImage(Path.Combine(desktop, "inpainted.png"));
                                        break;
                                    }
                                }
                            }
                        }
            }
        }