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 |