Computer Vision/OpenCv

OpenCV 소개 및 설치

BlackWhale 2025. 2. 12. 13:01

OpenCV란?

  • Open Source Computer Vision Library
  • Intel 에서 최초 개발 (1999)
  • C/C++, C#, Pyton, Java 지원
  • 500가지가 넘는 영상 처리 알고리즘이 최적화 되어 있음
  • GPU 가속 모듈을 지원
  • 머신러닝과 관련된 모듈을 포함
  • 컴퓨터 비전 분야를 발전 시키기 위한 목적

OpenCV 버전 

  • OpenCV 2.X - IOS 및 안드로이드 지원 (2009)
  • OpenCV 3.X - GPU 가속화(IPP) 지원 (2015)
  • OpenCV 4.X - 안정성 및 메모리 소비 감소 (2018)
    - 사용하지 않는 OpenCV 1.X 기반 API 제거

일반적인 영상처리 과정


OpenCV - C# 활용 - OpenCVSharp 설치

  • Nuget 패키지 설치
    - .Net framework는  8.0 이상 필요
    - Visual Studio 2019 이상이 필요함
    - C#용 OpenCVSharp4 및 런타임 패키지, WpfEXtensions를 설치


OpenCvSharp 네임스페이스 추가


OpenCv 설치 확인

  • Cv2.GetVersionString() 메소드로 설치 확인


OpenCV로 이미지 불러오기

  • 이미지 박스 생성 및 코드 작성

  • Cv2.ImShow는 새창을 생성


Cv2.CvtColor 메서드

  • Cv2CvtColor(Mat source, Mat target, ColorConversionCodes) 메소드는 이미지를 다양한 색상 공간으로 변환할 때 사용
    1) Mat source : 원본 이미지
    2) Mat target : 변환된 결과를 저장할 이미지
    3) ColorConversionCodes : 색상 변환 코드 (예 : BGR to Gray, BGR to HSV 등)

  • ColorConversinCodes의 종류
    - OpenCV에서는 다양한 색상 공간 변환을 제공. 여기서 5개의 변환 옵션을 선택해 사용할 수 있음

    1) ColorConversionCodes.BGR2GRAY
    - 컬러 이미지를 흑백(그레이 스케일)로 변환

    2) ColorConversionCodes.BGR2HSV
    - HSV 색상 공간으로 변환 (색조(Hue), 채도(Saturation), 명도(Value))

    3) ColorConversionCodes.BGR2RGB
    - 기본 BGR 포맷을 RGB로 변환 (B와 R 채널이 뒤바뀜)

    4) ColorConversionCodes.BGR2LAB
    - 색상을 인간의 시각에 가깝게 표현하는 LAB 색상 공간으로 변환

    5) ColorConversionCodes.BGR2YCrCb
    - 밝기와 색상 정보를 분리한 YCrCb 색상 공간으로 변환(주로 영상 압축에 사용)

사용 예시

using OpenCvSharp;

namespace Ex_2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : System.Windows.Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // 1.이미지 불러오기 (BGR 형식으로 불러옴)
            Mat original = Cv2.ImRead("F:\\pepe.jpg");

            // 2.색상 변환 이미지 초기화
            Mat gray = new Mat();
            Mat hsv = new Mat();
            Mat rgb = new Mat();
            Mat lab = new Mat();    
            Mat ycrcb = new Mat();

            // 3.이미지 변환 수행
            Cv2.CvtColor(original, gray, ColorConversionCodes.BGR2GRAY);
            Cv2.CvtColor(original, hsv, ColorConversionCodes.BGR2HSV);
            Cv2.CvtColor(original, rgb, ColorConversionCodes.BGR2RGB);
            Cv2.CvtColor(original, lab, ColorConversionCodes.BGR2Lab);
            Cv2.CvtColor(original, ycrcb, ColorConversionCodes.BGR2YCrCb);

            // 4.변환된 이미지 표시
            Cv2.ImShow("Original", original);
            Cv2.ImShow("GrayScale", gray);
            Cv2.ImShow("HSV", hsv);
            Cv2.ImShow("RGB", rgb);
            Cv2.ImShow("LAB", lab);
            Cv2.ImShow("YCrCb", ycrcb);

            // 5.키 입력 대기 후 종료
            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();

        }
    }
}

1) Original

2) ColorConversionCodes.BGR2GRAY

3) ColorConversionCodes.BGR2HSV

4) ColorConversionCodes.BGR2RGB

5) ColorConversionCodes.BGR2LAB

6) ColorConversionCodes.BGR2YCrCb


히스토그램 그리기

  • 히스토그램이란?
    - 같은 밝기를 가진 픽셀의 수를 막대 그래프로 표시한 것


히스토그램 예시코드

using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using OpenCvSharp;

namespace Ex_3
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : System.Windows.Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // Mat = Matrix = 2차원 행렬
            Mat src = Cv2.ImRead("F:\\pepe.jpg"); // 원본 이미지
            Mat gray = new Mat(); // 흑백 이미지
            Mat hist = new Mat(); // 히스토그램   

            // 가로 256, 세로 이미지 크기 만큼 1로만 가득 차 있는 매트릭스 생성
            Mat result = Mat.Ones(new OpenCvSharp.Size(256, src.Height), MatType.CV_8UC1); // CV_8UC1 : 8bit 1channel 이미지
            Mat dst = new Mat();

            Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY); // 원본 이미지 흑백으로 변환

            // 히스토그램 값 생성
            // 원본 매트릭스, 채널 수, 이미지 마스크, 출력 매트릭스, 차원 수, 히스토그램 크기(가로), 각 차원에 대한 색상 값 범위
            Cv2.CalcHist(new Mat[] { gray }, new int[] { 0 }, null, hist, 1, new int[] { 256 }, new Rangef[] { new Rangef(0, 256) });

            // 값의 범위를 정규화 (최소값 60~ 최대값 210 이었다면, 최소값 0 ~ 최대값 355로 변환)
            // 원본 매트릭스, 출력 매트릭스, 최소값(MinMax일 경우), 최대값(MinMax일 경우), 변환 방식
            Cv2.Normalize(hist, hist, 0, 2555, NormTypes.MinMax);

            // 히스토그램 겂을 갖고 값의 크기만큼 선의 길이를 정하고 선을 그림
            for (int i = 0; i < hist.Rows; i++)
            {
                Cv2.Line(result,
                    new OpenCvSharp.Point(i, src.Height),
                    new OpenCvSharp.Point(i, src.Height - (int)hist.Get<float>(i)),
                    Scalar.White);

            }

            // 가로로 매트릭스 두개를 붙이기 (높이가 같아야만 가능)
            Cv2.HConcat(new Mat[] { gray, result }, dst);
            Cv2.ImShow("dst", dst);

            // 사용자 입력이 들어오면 창을 모두 닫기
            Cv2.WaitKey(0);
            Cv2.DestroyAllWindows();
        
        }
    }
}

 

'Computer Vision > OpenCv' 카테고리의 다른 글

OpenCV 이미지 검출 (1)  (0) 2025.02.12
Scalar와 Vector 비교  (0) 2025.02.12
OpenCV 기초 (1)  (0) 2025.02.12
머신 비전 기초(2)  (0) 2025.02.12
머신 비전 기초 (1)  (0) 2025.02.12