[OpenCV] 캐스케이드 분류기, 얼굴 검출

이번 글에서는 얼굴 검출에 대해 알아보겠습니다. OpenCV에서는 얼굴 검출에 대한 몇가지 방법을 제공하며, 이번 글에서는 캐스케이드 분류기(cascade classifier)에 대해 알아보겠습니다. 우선, 캐스케이드 분류기에 대해 알아 보기전에 비올라-존스 알고리즘에 대해 알아보겠습니다. 비올라-존스 알고리즘 비올라-존스 알고리즘은 얼굴 검출에 사용되는 알고리즘입니다. 비올라-존스 알고리즘의 순서는 아래와 같습니다. 유사-하르 필터는 흰색 사각형과 검은색 사각형이 붙어있는 형태로 구성된 필터입니다. 왜 이런 형태일까요? 유사-하르 … Read more

[OpenCV] 템플릿 매칭 – matchTemplate

이번 글에서는 템플릿 매칭(Template Maching)에 대해 알아보겠습니다. 템플릿 매칭이란 어떠한 영상에서 템플릿 영상과 일치하는 영상을 찾는 것을 말합니다. 템플릿 영상은 찾을 대상이 되는 작은 크기의 영상을 의미합니다. 예를들어 아래와 같이 레나 영상에서 레나 얼굴을 찾고 싶으면, 레나의 얼굴 크기만한 템플릿 영상을 전체 영상 영역을 이동하면서 유사도와 비유사도를 계산하여 찾아냅니다. 유사도는 템플릿 영상과 비슷한 부분에서 값이 크게 나타나며, 비유사도는 비슷한 부분에서 값이 … Read more

[OpenCV] 2. 외곽선 응용 – approxPolyDP, 외곽선 또는 곡선 근사화

이번 글에서는 외곽선 검출 응용인 외곽선 근사화에 대해 알아보겠습니다. 더글라스 포이커(Douglas-Peucker) 알고리즘 우선 외곽선 또는 곡선을 근사화하는 더글라스-포이커 알고리즘에 대해 알아보겠습니다. 더글라스-포이커 알고리즘은 아래 순서를 따릅니다. 위 이미지는 더글라스-포이커 알고리즘을 설명하는 샘플 움짤입니다. approxPolyDP OpenCV에서는 외곽선 또는 곡선을 근사화하는 approxPolyDP 함수를 제공합니다. 샘플 코드는 아래와 같습니다. 실행 결과는 아래와 같습니다. 이상으로 외곽선 근사화에 대해 알아보았습니다.

[OpenCV] 1. 외곽선 응용

이전 글에서 findContours 함수를 이용하여 외곽선을 검출하였습니다. 이렇게 검출한 외곽선 정보에서 객체의 위치, 크기 등의 정보를 추출하는 방법에 대해서 알아보겠습니다. 객체를 감싸는 사각형, 원 구하는 함수 함수부터 빠르게 알아보겠습니다. 외곽선 정보에서 바운딩 박스를 구하기 위해서 boundingRect  함수를 사용합니다. 객체를 최소한으로 감싸는 사각형을 구하는 함수는 minAreaRect 함수 입니다. 객체를 최소한으로 감싸는 원을 구하는 함수는 minEnclosingCircle 함수 입니다. 샘플 코드는 아래와 같습니다. 실행 결과는 … Read more

[OpenCV] 외곽선 검출 – findContours

이번 글에서는 객체의 외곽선(contours)을 검출하는 방법에 대해 알아보겠습니다. 외곽선 검출은 레이블링과 더불어 영상에서 객체의 정보를 검출하는 방법 중 하나입니다. 개념 영상에서 객체의 외곽을 검출하는 방법에 대해 알아보겠습니다.외곽선 검출은 이진화된 영상에서 검출이 이루어지며 배경 영역과 닿아 있는 픽셀을 찾아 외곽선으로 인식합니다. 검은색은 배경, 흰색이 객체일 때 하늘색 픽셀은 외곽선으로 인식합니다. 그리고 이 외곽선들을 배열로 반환해 줍니다. 외곽선의 계층 … Read more

[OpenCV] 라벨링 – 2. 응용(connectedComponentsWithStats )

이전 글에서 라벨링에 대해 기초적인 내용을 알아보았습니다. 이번 글에서는 객체의 정보를 알아내는 방법에 대해 알아보겠습니다. 기존 문제점 라벨링을 수행하여 객체의 개수를 파악하고 행렬에 객체의 번호를 부여하더라도 가공된 정보는 아닙니다.객체의 영역이나 무게중심 좌표 등, 개발자가 행렬의 값을 일일히 대조하여 객체의 정보를 확인 하는 것은 좋지 않은 일입니다. 함수 OpenCV에서는 객체의 영역 정보를 얻어낼 수 있는 connectedComponentsWithStats 함수가 있습니다. … Read more

[OpenCV] 라벨링(labeling) – 1. 기본

이전 글까지 영상에 대해 알아보고, 영상의 배경과 객체를 이진화를 통해 구별하였습니다. 이번 글에서는 이렇게 구별된 객체들을 각각의 객체로 구별 및 분석하는 라벨링 기법(또는 레이블링이라고도 함)에 대해 알아보겠습니다. 이해 영상에서 라벨링은 보통 이진화 영상에서 수행됩니다. 라벨링은 이진화된 영상의 검은색 픽셀(0)을 배경으로, 흰색 픽셀(255)을 객체로 인식합니다. 객체는 인접한 픽셀까지 하나의 객체로 인식하며, 하나의 객체를 이루는 모든 픽셀에는 같은 라벨링 번호가 부여됩니다. 아래 그림은 이진화 … Read more

[OpenCV] 모폴로지 – 열기(opening), 닫기(closing)

영상의 침식과 팽창에 대해 잘 모르신다면 여기를 참고하는 것이 좋습니다. 침식과 팽창 연산의 단점 이전 글에서 영상에서 침식(erode)와 팽창(dilate) 연산하여 잡음을 제거하는 작업을 해보았습니다. 이러한 연산의 단점은 기존 영상의 객체 영역을 변형시킨다는 것입니다. 위 예시에서만 보더라도 침식의 경우 글자가 얇아졌고, 팽창의 경우 글자가 두꺼워졌습니다. 이렇게 영상에 전반적인 영향을 주는 것은 결과적으로는 좋지 않습니다. 열기, 닫기 개념 모폴로지 … Read more

[OpenCV] 모폴로지 – 침식(erode), 팽창(dilate)

이번 글에서는 모폴로지의 기본적인 설명과 침식과 팽창에 대해 알아보겠습니다. 우선 모폴로지(morphology)는 형태학을 의미하며, 생물의 구조, 외형 등등 형태 또는 모양에 관한 학문을 의미합니다.영상처리에서 모폴로지는, 영상에서 객체의 형태 및 구조에 대해 분석하고 처리하는 기법을 의미합니다.모폴로지는 주로 객체를 단순화하거나 잡음 제거 용도로 많이 사용 됩니다.침식과 팽창은 이러한 모폴로지 기법 중에서 기본이 되는 연산입니다.침식과 팽창 연산을 하기 위해서는 구조 요소가 필요하며 … Read more

[OpenCV] 영상의 이진화 – adaptiveThreshold

이전 글에서는 영상의 이진화에 대해서 알아 보았고 threshold 에 대해서도 알아보았습니다. 이제 threshold 함수로 임계값을 설정하고, 임계값보다 크면 255, 작으면 0으로 만드는 이진화 작업을 할 수 있습니다.하지만 아래와 수도쿠 이미지에서는 한곳은 너무 어둡고,  한곳은 너무 밝아서 threshold 함수를 사용하는게 적절하지 않습니다. 그 이유는 이미지 좌하단과 우상단의 밝기 차이가 있어 적절한 임계값을 찾기 힘들기 때문입니다. 이 경우에는 adaptiveThreshold 함수를 사용하여 적절하게 영상을 이진화 … Read more