반응형

안녕하세요

 

이번 포스팅은 OpenCv를 통한 히스토그램을 확인 할 수 있는 히스토그램 적용하기 입니다

 

히스토그램이 뭔지 저도 잘 몰랐는데요 이번에 OpenCv를 공부하면서 생소한 이미지 관련 용어들을 많이 접하게 되네요

 

일단 구글에서 정의하는 히스토그램이란?

 

『도수 분포표의 하나. 가로축에 계급을, 세로축에 도수를 취하고, 도수 분포의 상태를 직사각형의 기둥 모양으로 나타낸 그래프. 주상 도표(柱狀圖表).』

 

이렇게 정의하고 있습니다

 

무슨말인지..도통 감이 안오는데요.. 그래서 좀 더 구체적으로 검색을 해봤습니다

 

역시 어렵네요ㅎㅎ

 

좀 더 폭풍 검색을 해서 좀 더 이해가 쉬운 포스팅을 가져 왔습니다

 

1. 히스토그램이란?

    히스토그램은 이미지를 구성하는 픽셀값 분포에 대한 그래프입니다.

    X축은 픽셀값으로 범위는 0 ~ 255 사이입니다. Y축은 이미지에서 해당 픽셀값을 가진 픽셀의 개수입니다.

    히스토그램의 왼쪽에는 가장 어두운 검은색 픽셀(0)의 갯수를 보여주며 오른쪽으로 갈 수록 밝은

    픽셀의 갯수를 보여줍니다.  

 

가장 이해가 되는 값인거 같습니다

 

여기서 X축과 Y축에 대한 이미지 설명입니다

 

 

아마 이미지의 밝기의 분포도를 보기 위한 그래프인거 같습니다

 

좀 더 자세한 부분은 다음 포스팅을 확인 하시면 좋을거 같습니다

(공개 여부를 확인하지 않고 링크한것이므로 문제가 될 시 삭제 조치 하겠습니다)

 

https://webnautes.tistory.com/1274

 

OpenCV Python 강좌 - 히스토그램(Histogram)

이미지에서 히스토그램을 구하는 방법과 응용으로 Histogram Equalization, CLAHE을 설명합니다. 다음 OpenCV Python 튜토리얼을 참고하여 강좌를 비정기적로 포스팅하고 있습니다. https://docs.opencv.org/4.0.0..

webnautes.tistory.com

 

다시 C#으로 넘어와서 OpenCv로 히스토그램을 적용시켜 보도록 하겠습니다

 

1. 메뉴 등록

 

[디자인]

  - Menu에 다음과 같이 "히스토그램" 메뉴를 등록해 주세요

 

[Source Code]

  - 클릭 이벤트 생성 후 코딩

        private void 히스토그램ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (Hist Hi = new Hist())
            using (IplImage temp = Hi.BuildHist(src))
            {
                result = temp.Clone();

            }
            pictureBoxIpl2.ImageIpl = result;

        }

 

2. 히스토그램을 위한 클래스 생성

    - 클래스 추가 하기

      (클래스명은 임의로 설정하셔도 됩니다)

 

[Source Code]

using System;
using System.Collections.Generic;
using System.Text;
using OpenCvSharp;

namespace OpenCV_V1
{
    class Hist : IDisposable
    {
        IplImage DstHist;

        public IplImage BuildHist(IplImage src)
        {
            const int histSize = 64;
            float[] range0 = { 0, 256 };
            float[][] ranges = { range0 };

            // 화상의 읽기
            using (IplImage srcImg = new IplImage(src.Size, BitDepth.U8, 1))
            using (IplImage dstImg = new IplImage(src.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.CvtColor(srcImg, ColorConversion.BgrToGray);
                srcImg.Copy(dstImg);

                using (CvWindow windowImage = new CvWindow("image", WindowMode.AutoSize))
                using (CvWindow windowHist = new CvWindow("histogram", 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("brightness", 100, 200, callback);
                    ctContrast = windowImage.CreateTrackbar("contrast", 100, 200, callback);
                    // 첫회 그리기
                    callback(0);

                    // 키 입력대기
                    Cv.WaitKey(0);
                }
                return DstHist;
            }
        }

        //contrast와 brightness의 값으로부터 LUT의 값을 계산해, byte 배열로 돌려준다
        private static byte[] CalcLut(int contrast, int brightness)
        {
            byte[] lut = new byte[256];
            /*
             * The algorithm is by Werner D. Streidt
             * (http://visca.com/ffactory/archives/5-99/msg00021.html)
             */
            if (contrast > 0)
            {
                double delta = 127.0 * contrast / 100;
                double a = 255.0 / (255.0 - delta * 2);
                double b = a * (brightness - delta);
                for (int i = 0; i < 256; i++)
                {
                    int v = Cv.Round(a * i + b);
                    if (v < 0)
                        v = 0;
                    if (v > 255)
                        v = 255;
                    lut[i] = (byte)v;
                }
            }
            else
            {
                double delta = -128.0 * contrast / 100;
                double a = (256.0 - delta * 2) / 255.0;
                double b = a * brightness + delta;
                for (int i = 0; i < 256; i++)
                {
                    int v = Cv.Round(a * i + b);
                    if (v < 0)
                        v = 0;
                    if (v > 255)
                        v = 255;
                    lut[i] = (byte)v;
                }
            }
            return lut;
        }
        //히스토그램 계산
        private static void CalcHist(IplImage img, CvHistogram hist)
        {
            hist.Calc(img);
            float minValue, maxValue;
            hist.GetMinMaxValue(out minValue, out maxValue);
            Cv.Scale(hist.Bins, hist.Bins, ((double)img.Height) / maxValue, 0);
        }
        //히스토그램 그리기
        private static void DrawHist(IplImage img, CvHistogram hist, int histSize)
        {
            img.Set(CvColor.White);
            int binW = Cv.Round((double)img.Width / histSize);
            for (int i = 0; i < histSize; i++)
            {
                img.Rectangle(
                    new CvPoint(i * binW, img.Height),
                    new CvPoint((i + 1) * binW, img.Height - Cv.Round(hist.Bins[i])),
                    CvColor.Black, -1, LineType.AntiAlias, 0
                );
            }
        }

        public void Dispose()
        {
            if (DstHist != null) Cv.ReleaseImage(DstHist);
        }
    }
}

 

[결과창]

반응형
반응형

안녕하세요

 

저번 시간에 이미지 소벨엣지 효과 주기를 포스팅 했었는데요

 

이어서 이번에는 이미지에 라플레스엣지 효과 주기를 포스팅 해보도록 하겠습니다

 

저번 포스팅과 연결되어 진행 되오니 아래 링크를 확인해서 저번 포스팅을 확인해 보세요

 

https://codingman.tistory.com/54

 

[C#] OpenCvSharp 소벨엣지 효과 주기

안녕하세요 저번 시간에 캐니엣지 효과 주기를 포스팅 했었는데요 이어서 이번에는 이미지에 소벨엣지 효과 주기를 포스팅 해보도록 하겠습니다 저번 포스팅과 연결되어 진행 되오니 아래 링크를 확인해서 저번 포..

codingman.tistory.com

 

[디자인]

  - Menu에 다음과 같이 필터 -> 라플레스엣지 메뉴를 등록해 줍니다

 

[Source Code]

  - 라플레스엣지 메뉴에 클릭이벤트 생성

 

 - 이벤트 위치에 다음과 같이 코딩해 줍니다

        private void 라플레스엣지ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (gray gg = new gray())
            using (IplImage temp = gg.BuildLaplace(src))
            {
                result = temp.Clone();

            }
            pictureBoxIpl2.ImageIpl = result;
        }

 

- 그레이효과 적용시에 등록한 gray.cs 클래스 파일을 이용합니다

https://codingman.tistory.com/51

 

[C#] OpenCvSharp 그레이 효과 주기

안녕하세요 요즘 C#으로 연습중인 OpenCv에서 불러온 이미지에 전체 그레이 효과를 주는 이벤트를 제작해 보겠습니다 C#을 통해 OpenCv 라이브러리 등록방법은 아래 링크를 확인해주세요 https://codingman.tistor..

codingman.tistory.com

 

[결과 실행창]

반응형
반응형

안녕하세요

 

저번 시간에 캐니엣지 효과 주기를 포스팅 했었는데요

 

이어서 이번에는 이미지에 소벨엣지 효과 주기를 포스팅 해보도록 하겠습니다

 

저번 포스팅과 연결되어 진행 되오니 아래 링크를 확인해서 저번 포스팅을 확인해 보세요

 

https://codingman.tistory.com/53

 

[C#] OpenCvSharp 캐니엣지 효과 주기

안녕하세요 저번 시간에 이미지 이진화 효과 주기를 포스팅 했었는데요 이어서 이번에는 이미지에 캐니엣지 효과 주기를 포스팅 해보도록 하겠습니다 저번 포스팅과 연결되어 진행 되오니 아래 링크를 확인해서 저..

codingman.tistory.com

 

[디자인]

  - Menu에 다음과 같이 필터 -> 소벨엣지 메뉴를 등록해 줍니다

 

[Source Code]

  - 소벨엣지 메뉴에 클릭이벤트 생성

 - 이벤트 위치에 다음과 같이 코딩해 줍니다

        private void 소벨엣지ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (gray gg = new gray())
            using (IplImage temp = gg.BuildSobel(src))
            {
                result = temp.Clone();

            }
            pictureBoxIpl2.ImageIpl = result;
        }

 

- 그레이효과 적용시에 등록한 gray.cs 클래스 파일을 이용합니다

https://codingman.tistory.com/51

 

[C#] OpenCvSharp 그레이 효과 주기

안녕하세요 요즘 C#으로 연습중인 OpenCv에서 불러온 이미지에 전체 그레이 효과를 주는 이벤트를 제작해 보겠습니다 C#을 통해 OpenCv 라이브러리 등록방법은 아래 링크를 확인해주세요 https://codingman.tistor..

codingman.tistory.com

 

[결과창]

반응형
반응형

안녕하세요

 

저번 시간에 이미지 이진화 효과 주기를 포스팅 했었는데요

 

이어서 이번에는 이미지에 캐니엣지 효과 주기를 포스팅 해보도록 하겠습니다

 

저번 포스팅과 연결되어 진행 되오니 아래 링크를 확인해서 저번 포스팅을 확인해 보세요

 

https://codingman.tistory.com/52

 

[C#] OpenCvSharp 이진화 효과 주기

안녕하세요 저번 시간에 이미지 그레이 효과 주기를 포스팅 했었는데요 이어서 이번에는 이미지에 이진화 효과 주기를 포스팅 해보도록 하겠습니다 저번 포스팅과 연결되어 진행 되오니 아래 링크를 확인해서 저번..

codingman.tistory.com

 

 

[디자인]

  - Menu에 다음과 같이 필터 -> 캐니엣지 메뉴를 등록해 줍니다

[Source Code]

  - 캐니엣지 메뉴에 클릭이벤트 생성

 

 - 이벤트 위치에 다음과 같이 코딩해 줍니다

private void 캐니엣지ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (gray gg = new gray())
            using (IplImage temp = gg.BuildCanny(src))
            {
                result = temp.Clone();

            }
            pictureBoxIpl2.ImageIpl = result;
        }

 

 - 그레이효과 적용시에 등록한 gray.cs 클래스 파일을 이용합니다

https://codingman.tistory.com/51

 

[C#] OpenCvSharp 그레이 효과 주기

안녕하세요 요즘 C#으로 연습중인 OpenCv에서 불러온 이미지에 전체 그레이 효과를 주는 이벤트를 제작해 보겠습니다 C#을 통해 OpenCv 라이브러리 등록방법은 아래 링크를 확인해주세요 https://codingman.tistor..

codingman.tistory.com

- 위의 과정을 모두 하셨다면 프로그램 실행하시면 다음과 같은 결과창을 보실 수 있습니다

반응형
반응형

안녕하세요

 

저번 시간에 이미지 그레이 효과 주기를 포스팅 했었는데요

 

이어서 이번에는 이미지에 이진화 효과 주기를 포스팅 해보도록 하겠습니다

 

저번 포스팅과 연결되어 진행 되오니 아래 링크를 확인해서 저번 포스팅을 확인해 보세요

 

https://codingman.tistory.com/51

 

[C#] OpenCvSharp 그레이 효과 주기

안녕하세요 요즘 C#으로 연습중인 OpenCv에서 불러온 이미지에 전체 그레이 효과를 주는 이벤트를 제작해 보겠습니다 C#을 통해 OpenCv 라이브러리 등록방법은 아래 링크를 확인해주세요 https://codingman.tistor..

codingman.tistory.com

 

[디자인]

  - Menu에 다음과 같이 필터 -> 이진화 메뉴를 등록해 줍니다

 

[Source Code]

  - 이진화 메뉴에 클릭이벤트 생성

 

   - 이벤트 위치에 다음과 같이 코딩해 줍니다

private void 이진화ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (gray gg = new gray())
            using (IplImage temp = gg.ThresholdProcess(src))
            {
                result = temp.Clone();

            }
            pictureBoxIpl2.ImageIpl = result;
        }

 

  - 그리고 저번 시간 생성했던 gray.cs 클래스 파일을 똑같이 적용 시킵니다

    (이미 저번 포스팅에 사용한 gray 클래스 파일에 코딩내용이 포함되어 있음)

    (혹시 귀찮은 분들을 위해서 다시 작성함)

using System;
using System.Collections.Generic;
using System.Text;
using OpenCvSharp;

namespace OpenCV_V1
{
    class gray : IDisposable
    {
        IplImage subgray;

        public IplImage grayProcess(IplImage src)
        {
            subgray = new IplImage(src.Size, BitDepth.U8, 1);
            Cv.CvtColor(src, subgray, ColorConversion.BgrToGray);

            return subgray;
        }

        public void Dispose()
        {
            if (subgray != null) Cv.ReleaseImage(subgray);
        }

        public IplImage ThresholdProcess(IplImage src)
        {
            subgray = new IplImage(src.Size, BitDepth.U8, 1);  //메모리 확보
            Cv.CvtColor(src, subgray, ColorConversion.BgrToGray); //그레이로 변환
            Cv.Smooth(subgray, subgray, SmoothType.Gaussian, 5);  //가우시안 스무스 주기
            Cv.Threshold(subgray, subgray, 120, 255, ThresholdType.Binary);  //120은 기준이 될 임계치

            return subgray;
        }

        public IplImage BuildCanny(IplImage src)
        {
            subgray = new IplImage(src.Size, BitDepth.U8, 1);  //메모리 확보
            Cv.CvtColor(src, subgray, ColorConversion.BgrToGray);   //그레이로 변환

            Cv.Canny(subgray, subgray, 80, 255);

            return subgray;
        }

        public IplImage BuildSobel(IplImage src)
        {
            subgray = new IplImage(src.Size, BitDepth.U8, 1);//메모리 확보
            Cv.CvtColor(src, subgray, ColorConversion.BgrToGray); //그레이로 변환

            Cv.Sobel(subgray, subgray, 1, 0, ApertureSize.Size3);

            return subgray;
        }

        public IplImage BuildLaplace(IplImage src)
        {
            subgray = new IplImage(src.Size, BitDepth.U8, 1);//메모리 확보
            using (IplImage temp = new IplImage(src.Size, BitDepth.S16, 1))
            using (IplImage graytemp = new IplImage(src.Size, BitDepth.U8, 1))
            {
                Cv.CvtColor(src, graytemp, ColorConversion.BgrToGray); //그레이로 변환

                Cv.Laplace(graytemp, temp);
                Cv.ConvertScaleAbs(temp, subgray);
                return subgray;
            }
        }
    }
}

  - 위의 과정을 모두 하셨다면 프로그램 실행한 후에 이미지를 불러온뒤에 이진화 버튼 클릭하면 변경 됩니다

반응형
반응형

안녕하세요

 

요즘 C#으로 연습중인 OpenCv에서 불러온 이미지에 전체 그레이 효과를 주는 이벤트를 

 

제작해 보겠습니다

 

C#을 통해 OpenCv 라이브러리 등록방법은 아래 링크를 확인해주세요

https://codingman.tistory.com/49

 

[C#]OpenCvSharp 라이브러리 사용하기 #1

안녕하세요 저번 포스팅에 C#으로 OpenCvSharp 라이브러리를 등록하여 구현하는 포스팅을 준비하던중에 OpenCv 3,4 버전에서 오류가 발생하는 문제가 있다는 얘길 듣고 부랴부랴 포스팅 내용을 검토해봤는데 역시..

codingman.tistory.com

 

그다음 C#을 통해 OpenCv 그림박스에 이미지 불러오기는 아래 링크를 확인해 주세요

https://codingman.tistory.com/48

 

[C#] OpenCvSharp 이미지 읽어 오기

안녕하세요 코딩하는남자 코딩연습생입니다 저번 블로그에서 C#에서 OpenCv라이브러리 등록을 통한 도구항목 추가에 대해서 공유했었는데요 혹시 처음 오신분은 아래 링크에서 확인하시기 바랍니다 https://coding..

codingman.tistory.com

 

이렇게 위의 과정을 모두 이해하셨다면 이제 이어서 불러온 이미지에 그레이 효과를 넣어보도록 하겠습니다

 

[디자인]

미리 만들어 놓은 MenuStepmenuStrip에 필터 -> 그레이라는 메뉴를 등록합니다

 

[Source Code]

-MenuStep에서 그레이 버튼을 클릭하였을때 실행될 클릭 이벤트를 생성합니다

  - 그다음 해당 클릭 이벤트에 다음과 같이 코딩 합니다

private void 그레이ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (gray gg = new gray())
            using (IplImage temp = gg.grayProcess(src))
            {
                result = temp.Clone();

            }
            pictureBoxIpl2.ImageIpl = result;

        }

 

 - 그다음 이미지 필터 기능을 쉽게 구별할수 있도록 그레이 클레스를 생성합니다

 

 

  - 생성된 gray.cs 파일에 다음과 같이 코딩합니다

  [Source Code]

using System;
using System.Collections.Generic;
using System.Text;
using OpenCvSharp;

namespace OpenCV_V1
{
    class gray : IDisposable
    {
        IplImage subgray;

        public IplImage grayProcess(IplImage src)
        {
            subgray = new IplImage(src.Size, BitDepth.U8, 1);
            Cv.CvtColor(src, subgray, ColorConversion.BgrToGray);

            return subgray;
        }

        public void Dispose()
        {
            if (subgray != null) Cv.ReleaseImage(subgray);
        }

        public IplImage ThresholdProcess(IplImage src)
        {
            subgray = new IplImage(src.Size, BitDepth.U8, 1);  //메모리 확보
            Cv.CvtColor(src, subgray, ColorConversion.BgrToGray); //그레이로 변환
            Cv.Smooth(subgray, subgray, SmoothType.Gaussian, 5);  //가우시안 스무스 주기
            Cv.Threshold(subgray, subgray, 120, 255, ThresholdType.Binary);  //120은 기준이 될 임계치

            return subgray;
        }

        public IplImage BuildCanny(IplImage src)
        {
            subgray = new IplImage(src.Size, BitDepth.U8, 1);  //메모리 확보
            Cv.CvtColor(src, subgray, ColorConversion.BgrToGray);   //그레이로 변환

            Cv.Canny(subgray, subgray, 80, 255);

            return subgray;
        }

        public IplImage BuildSobel(IplImage src)
        {
            subgray = new IplImage(src.Size, BitDepth.U8, 1);//메모리 확보
            Cv.CvtColor(src, subgray, ColorConversion.BgrToGray); //그레이로 변환

            Cv.Sobel(subgray, subgray, 1, 0, ApertureSize.Size3);

            return subgray;
        }

        public IplImage BuildLaplace(IplImage src)
        {
            subgray = new IplImage(src.Size, BitDepth.U8, 1);//메모리 확보
            using (IplImage temp = new IplImage(src.Size, BitDepth.S16, 1))
            using (IplImage graytemp = new IplImage(src.Size, BitDepth.U8, 1))
            {
                Cv.CvtColor(src, graytemp, ColorConversion.BgrToGray); //그레이로 변환

                Cv.Laplace(graytemp, temp);
                Cv.ConvertScaleAbs(temp, subgray);
                return subgray;
            }
        }
    }
}

 

- 이렇게 한뒤 실행하면 다음과 같은 효과를 나타낼수 있습니다

반응형
반응형

안녕하세요

 

저번 포스팅에 C#으로 OpenCvSharp 라이브러리를 등록하여 구현하는 포스팅을 준비하던중에

 

OpenCv 3,4 버전에서 오류가 발생하는 문제가 있다는 얘길 듣고 부랴부랴 포스팅 내용을 검토해봤는데

 

역시나...제가 포스팅한 글에서도 역시 오류가 발생하더라구요

 

그래서 해당 부분을 오류 해결하고 OpenCvSharp 오류 없는 버젼을 추가할수 있는 방법을 재 포스팅 햇습니다

 

아마 순서로는 해당 글이 1번글이고 이 이후에 과정은 동일합니다

 

해당글을 먼저 읽고 라이브러리를 등록한 뒤에 빌드한뒤 나온 DLL를 사용하여 다름 아래 링크 과정을 따라 하시면

 

오류 없이 OpenCv를 사용할 수 있습니다

 

 

[과정]

1. 프로젝트 생성 #1

   - 비쥬얼 스튜디오 2017을 이용하여 신규 프로젝트를 생성합니다

 

2. 프로젝트 생성 #2

   - Windows Forms 앱 형식의 프로젝트를 생성하고 아래 속성 값을 지정해 줍니다

     (이름, 위치만 설정하시면 솔루션, 솔루션이름은 자동으로 동기화 됩니다)

 

3. NuGet을 통한 OpenCvSharp 설치 하기

   - 비쥬얼스튜디오의 솔루션탐색기에서 참조 위치에서 마우스 오른쪽 버튼을 클릭한뒤 NuGet 패키지 관리를 클릭

 

4. NuGet 패키지 찾기 #1

   - NuGet 패키지 관리창에서 찾아보기를 클릭한뒤 검색창에 OpenCvSharp를 검색

 

 

5. NuGet 패키지 찾기 #2

   - OpecCv 2.x wrapper 버전을 클릭

 

6. NuGet 패키지 설치

    - OpenCvSharp-AnyCPU 버전를 확인 한뒤 설치 버튼을 통해 설치

 

7. 정상 설비 여부 확인

   - 나의 프로젝트 참조 부분에 다음과 같은 참조가 추가되었으면 성공

 

8. 프로젝트 빌드

   - 7번까지 성공 되셨으면 해당 프로젝트를 빌드하여 Debug폴더에 해당 버전의 OpenCv Dll 파일을 생성

 

8번까지 성공하셨나요?? 그러면 오류 없는 OpenCv 버전이 정상적으로 등록되신겁니다

 

이후 과정은 기존 포스팅 내용을 따라 하시면 오류 없이 예제가 실행될 겁니다

 

다음 과정 포스팅 링크는 아래를 클릭해 주세요 ↓

 

https://codingman.tistory.com/47

 

[C#] OpenCv 라이브러리 사용하기

안녕하세요 코딩하는남자 코딩연습생입니다 저번 블로그에서 OpenCV에 대한 소개글을 한번 올렸엇는데요 https://codingman.tistory.com/46 [OpenCV] OpenCVSharp 분석하기 안녕하세요 코딩하는남자 코딩연습생입..

codingman.tistory.com

문제에 대해서는 뎃글 달라주시면 같이 해결해보도록 하겟습니다

 

감사합니다

반응형
반응형

안녕하세요

 

코딩하는남자 코딩연습생입니다

 

저번 블로그에서 C#에서 OpenCv라이브러리 등록을 통한 도구항목 추가에 대해서 공유했었는데요

 

혹시 처음 오신분은 아래 링크에서 확인하시기 바랍니다

 

https://codingman.tistory.com/47

 

[C#] OpenCv 라이브러리 사용하기

안녕하세요 코딩하는남자 코딩연습생입니다 저번 블로그에서 OpenCV에 대한 소개글을 한번 올렸엇는데요 https://codingman.tistory.com/46 [OpenCV] OpenCVSharp 분석하기 안녕하세요 코딩하는남자 코딩연습생입..

codingman.tistory.com

이번에는 추가한 픽쳐박스 구성하는 방법, 이미지 불러오는 방법, 이미지 확대 방법에 대해서 포스팅 해보도록 하겠습니다

 

 

1. 픽쳐박스 구성 방법

   - OpenCvSharp PictureBoxIpI 콘트롤 사용 방법

  - 비쥬얼스튜디오의 도구상자에서 PictureBoxIpI 컨트로를 드래그앤드롭하여 디자인폼으로 이동 시킵니다

저는 이렇게 디자인 했습니다

 

연습하는냐고 이것저것 해보는냐고 MenuStrip과 파일 읽어올때 사용할 OpenFileDialog도 추가해줬구요

 

드래그 앤 드롭 시킨 PictureBoxIpI 의 속성을 설정해 볼께요

 

 

고정 크기를 사용하기 위해 사이즈를 320x207로 고정 시킵니다

 

 

사이즈 모드에서 불러온 이미지가 사이즈 크기에 맞게 자동 조절되어 그려지도록 사이즈 모드를 StretchImage로 변경

 

위와 같이 설정을 하게되면 일단 PictureBoxIpI에 대한 사용할 수 있는 상태가 되었구요

 

[Source Code]

using OpenCvSharp;

소스 코드 작성을 위해 Form 소스에 다음과 같이 정의해줍니다

 

2. PictureBoxIpI 클릭으로 이미지 확대하기

   - PictureBoxIpI의 클릭 이벤트를 설정해 주세요

 

   - [Source Code]

        private void pictureBoxIpl1_Click(object sender, EventArgs e)
        {
            if (pictureBoxIpl1.ImageIpl == null) return;

            using (CvWindow wind = new CvWindow("원본그림"))
            {
                wind.Image = src;
                Cv.WaitKey(0);
            }
        }

 이렇게 하게 되면 PictureBoxIpI 클릭하면 해당 불러온 이미지를 확대하여 볼수 있습니다

 

3. 그림 파일 읽어와서 PictureBoxIpI에 보여주기

   - 디자인에서 도구 상자 항목 중 openFileDialog를 드래그 앤 그롭하여 디자인 폼에 생성 시킵니다

   - 추가로 똑같이 도구 상자 항목 중 menuStrip을 드래그 앤 그롭하여 디자인 폼에 생성 시킵니다

   - 아래 그림과 같이 menuStrip에서 파일 -> 그림읽기를 만들어 주세요

   - 그 다음 그림읽기 메뉴에 클릭 이벤트 추가

   - [Source Code]

        private void 그림읽기ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)  //파일 읽어 오기 추가
            {
                loadImage(openFileDialog1.FileName);
            }
            else
            {
                return;
            }

        }
        private void loadImage(String filename)
        {
            src = new IplImage(filename, LoadMode.AnyColor); //Opencv형태로 그림 파일을 읽어다 src에 저장
            pictureBoxIpl1.ImageIpl = src;
        }

   - 위의 소스코드를 사용하시면 PictureBoxIpI에 넣을 그림 파일을 선택할 Dialog창이 뜨고 파일을 선택하면

     해당 파일이 PictureBoxIpI에 보여지게 됩니다

 

[2019.12.30]

OpenCvSharp Dll 오류 해결하기 위한 신규 라이브러리 추가 방법

*해당 포스팅을 따라하시다가 오류 나시는 분들은 다음 링크를 통해 OpenCvSharp DLL을 변경하시기 바랍니다

https://codingman.tistory.com/49

 

[C#]OpenCvSharp 라이브러리 사용하기 #1

안녕하세요 저번 포스팅에 C#으로 OpenCvSharp 라이브러리를 등록하여 구현하는 포스팅을 준비하던중에 OpenCv 3,4 버전에서 오류가 발생하는 문제가 있다는 얘길 듣고 부랴부랴 포스팅 내용을 검토해봤는데 역시..

codingman.tistory.com

 

반응형

+ Recent posts