이진화시킨 이미지에서 findContours함수를 사용하여 contour를 찾은 후, approxPolyDP 함수를 사용하여 다각형(polygon)을 검출하는 예제입니다. OpenCV 사용해서 실시간으로 도형 검출하기(shape detection) 1 / 2 - 이미지에서 검출 OpenCV 사용해서 실시간으로 도형 검출하기(shape detection) 2 / 2 - 웹캠에서 검출 http://webnautes.tistory.com/1193 2016. 12. 29 최초 작성2018. 6. 30 도형 판정하는 방법 변경( 내각 체크 → Convex polygon 여부 검사 ) webcam으로 테스트 추가 1-1. 다음 테스트용 이미지를 저장하여 OpenCV를 위한 프로젝트 폴더에 넣습니다. 사각형, 육각형..
아래 유튜브 영상에 본 포스팅을 개선한 내용이 포함되어 있습니다. 최종업데이트 - 2018. 6. 10 OpenCV를 이용하여 카메라로부터 캡쳐되는 영상은 BGR 영상입니다. RGB가 아니라 BGR이라고 부르는 것은 Blue, Green, Red 순으로 한 픽셀이 구성되기 때문입니다. 코드에서는 HSV 영상으로 변환한 후, 영상에서 원하는 색을 분리하고 있습니다.HSV 영상에서 Hue 성분은 다음처럼 특정 색의 컬러가 일정한 범위를 갖기 때문에 분리해내기가 쉽습니다. 이미지 출처 : https://www.dreamstime.com/stock-illustration-color-colors-wheel-names-degrees-rgb-hsb-hsv-hue-image78027630 참고 [2]에 따르면 cvtC..
OpenCV에서 투명한 부분이 포함되어 있는 이미지(transparent image)를 다른 이미지 또는 영상에 오버레이하는 방법을 찾아봤습니다. http://jepsonsblog.blogspot.kr/2012/10/overlay-transparent-image-in-opencv.html 에서 소개하고 있는 overlayImage 함수를 사용하면 간단히 해결됩니다. 이걸 가지고 뭐할 수 있을 까 고민하다가 사람 얼굴에 안경을 오버레이 해보았습니다.원본 이미지로 다음 두 장의 이미지를 사용했습니다. 각각 다음 링크에서 다운로드 가능합니다. https://pixabay.com/ko/초상화-여자-얼굴-여성-여자-얼굴-아름-다운-여자-얼굴-2159177/ https://pixabay.com/ko/안경-액자-종범..
웹캠으로부터 캡처된 영상에 일련번호를 붙여서 이미지 파일로 저장하는 예제입니다. sprintf 함수를 사용하여 img_000000.jpg ~ img_999999.jpg 까지 이미지 파일 이름을 생성하는 방법을 사용하였습니다. 더 많은 이미지 파일을 저장하려면 %6d 부분을 수정하면 됩니다. sprintf( buf, "img_%06d.jpg", index); img_999999.jpg까지 저장하면 다시 img_000000.jpg 파일 이름으로 저장하도록 작성되었습니다. 실행결과 저장된 이미지파일들입니다. 사용한 코드는 다음과 같습니다. #include #include using namespace cv; using namespace std; int main(int, char**) { int index = 0..
pthread와 mutex를 OpenCV와 같이 사용하는 예제입니다. main함수에서 웹캠을 열어주고 UpdateFrame 스레드를 생성하고 UpdateFrame 스레드 에서는 웹캠으로 부터 영상을 넘겨주길 기다렸다가 그레이 영상으로 변환 후 화면에 출력합니다. 이때 뮤택스를 사용하여 공유자원인 frame으로의 접근 문제를 해결합니다. ESC키를 입력하게 되면 스레드를 강제 종료시키고 프로그램을 종료합니다. 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283#include #i..
컨볼루션(Convolution)입력 영상을 스캔하면서 현재 위치의 픽셀과 마스크 크기 내에 포함되는 주변 픽셀을 마스크 배열과 컨볼루션하여 결과 영상의 현재 위치값으로 결정합니다. 마스크에서 정의한 가중치에 따라 이미지를 흐리기(blurring) 만들거나 선명하게(sharpening) 만들 수 있습니다. 또는 이미지 상에 있는 에지를 검출하는데 사용할 수 있습니다. 마스크는 3,5,7,9,11.. 처럼 홀수크기를 갖습니다. 입력 이미지 상의 위치 (1,1)에 3 x 3 크기의 마스크를 컨볼루션하는 예를 들어 보겠습니다. 이해하기 쉽게 현재 위치 (1,1)에 마스크 중앙 (1,1)이 오도록 겹처놓으면, 마스크 배열 항목에 대응되는 이미지 상의 위치들이 있습니다. 컨볼루션 계산은 마스크와 이미지 상에 대응되..
히스토그램 평활화는 히스토그램을 이용하여 이미지의 명암 대비를 개선시키는 방법입니다. 그레이스케일 영상의 경우 픽셀이 가질 수 있는 값의 범위는 0 ~ 255 사이의 값입니다. 이미지 상에서 픽셀값이 0인 갯수, 픽셀값이 1인 갯수, ... , 픽셀값이 255인 갯수를 세어서 배열에 저장한 것이 히스토그램입니다. 왼쪽 이미지에 대해 히스토그램을 구하여 그래프로 그려보면 중앙의 좁은 범위에 픽셀들이 몰려있는 것을 볼 수 있습니다. 그래프에서 x축은 0~255사이의 픽셀값 범위이며 y축은 픽셀 갯수입니다. 히스토그램 평활화를 적용시키면 이미지의 픽셀값이 0~255 범위내에 골고루 분산되어 이미지의 명암대비가 개선됩니다. 구현 과정1. 입력 영상에 대한 히스토그램과 누적 히스토그램을 계산합니다. 누적 히스토그..
직선 y = mx + b을 매개변수식으로 바꾸면 r = xcosθ + ysinθ이다. 여기서 r은 원점으로부터 직선까지의 수직거리이며 θ는 이 직선과 수직인 직선과 x축 사이의 각도를 시계 반대방향으로 측정한 값이다. 좌표 (300,300)을 지나는 모든 직선에 대한 r과 θ를 구해서 극좌표계에 그려보면 사인곡선이 그려진다. 식 r = xcosθ + ysinθ에 좌표 (300,300)을 대입하고 θ를 0에서 180까지 증가시키면서 r값을 구한 결과이다. 좌표(100,100), (200,200), (300,300) 세 점을 지나는 모든 직선에 대한 r과 θ를 구하여 극좌표계에 그려보면 세 개의 사인곡선이 그려지는데 한 점에서 만나는 것을 확인할 수 있다. 교차점의 r,θ 값을 구하여 직선의 방정식으로 변환..
계속 내용을 보완하고 추가할 예정입니다. 기준 마커(fiducial marker)는 일정한 포맷으로 만들어진 인공적인 랜드마크입니다. 증강 현실(Augmented Reality)을 구현하데 이용할 수 있습니다. 영상에서 마커를 검출하여 마커의 4개의 코너를 구하면 카메라 자세 추정(camera pose estimation)을 할 수 있는데. 카메라 자세 추정이란 3차원 공간상에서의 카메라의 위치와 방향을 구하는 것입니다. 이 정보를 바탕으로 마커의 자세를 추정하여 마커 위에 가상의 사물을 띄웁니다. 이 방법을 사용하면 마커를 손에 들고 움직이더라도 항상 마커 위에 가상 사물을 띄울 수 있습니다. ArUco marker는 기준 마커 중 한가지로 n x n 크기의 2차원 비트 패턴과 이를 둘러싸고 있는 검은..
이진화는 가장 간단한 세그멘테이션(segmentation) 방법이다. 세그멘테이션이란 이미지를 분할하여 원하는 부분 혹은 물체를 검출하는데 많이 사용되는 기법이다. 이진화는 원본 영상을 그레이 영상으로 변환한 후, threshold값을 이용하여 배경과 물체를 분리해낸다. 아래 화면은 책상 위에 빨간색 공이 놓여있는 컬러 이미지를 그레이스케일 이미지로 변환한 후, 이진화를 통해 빨간색 공 영역을 분리해낸 결과이다. 가장 단순한 이진화 방법은 이미지 전체에 고정된 전역 threahold값을 사용하는 것이다.그레이 영상을 입력으로 받아서 영상 전체를 스캔하면서 픽셀값이 threshlod값보다 크면 결과 영상의 같은 위치의 픽셀값을 흰색(1 또는 255)으로 하고, 픽셀값이 threshold값보다 작으면 검은색..