imwrite 함수로 저장하면 바이너리 이미지라도 그레이스케일(8비트 1채널) 이미지로 저장됩니다. imwrite 사용시 IMWRITE_PNG_BILEVEL 옵션을 추가해주면 1비트 1채널 이미지로 저장할 수 있습니다. 1비트 이기 때문에 0과 1 두가지만 표현가능합니다. png 확장자를 가지는 이미지만 가능합니다. 다음은 Python과 C++구현한 코드입니다. Python import cv2 as cv img_color = cv.imread('test.png', cv.IMREAD_COLOR) img_gray = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY) ret, img_binary = cv.threshold(img_gray, 150, 255, cv.THRESH_BINAR..
이미지에서 코너 검출시 사용하는 해리스 코너에 대해 알아봅니다. Harris Corner Detector 구현 코드입니다. import cv2 as cv import numpy as np import time img_color = cv.imread('chessboard.jpg', cv.IMREAD_COLOR) img_gray = cv.cvtColor(img_color, cv.COLOR_BGR2GRAY) img_sobel_x = cv.Sobel(img_gray, cv.CV_32F, 1, 0) img_sobel_y = cv.Sobel(img_gray, cv.CV_32F, 0, 1) IxIx = img_sobel_x * img_sobel_x IyIy = img_sobel_y * img_sobel_y IxIy ..
2019. 4. 23수정한 코드가 이미지 파일간 매칭을 위한 코드라 동영상에서 동작시 예외상황을 처리하지 못해서 추가했습니다.충분히 테스트해보지 않아서 코드가 완벽하지 않습니다. Visual Studio 2017용으로 컴파일한 OpenCV 4.0.1를 사용하여 SURF 테스트를 해보았습니다. 장면 이미지에서 특정 물체를 찾아내는 이미지 매칭 테스트입니다. 빌드 과정은 다음 포스팅을 참고하세요. Visual Studio 2017용으로 OpenCV 4.0.1 빌드 하기 (opencv_contrib 포함)http://webnautes.tistory.com/1036 xfeatures2d 모듈의 샘플 코드를 수정하여 사용했습니다. https://github.com/opencv/opencv_contrib/blob/..
OpenCL 사용 여부에 따라 OpenCV 성능이 어떻게 달라지는지 테스트해보았습니다. 테스트는 다음과 같이 진행했습니다. OpenCL을 활성화 한 상태에서 소벨을 10000번 진행하고 ocl::setUseOpenCL(true); for (int i = 0; i < 10000; i++) { UMat dst; Sobel(src, dst, -1, 1, 0); } OpenCL을 비활성화한 상태에서 소벨을 10000번 진행합니다. ocl::setUseOpenCL(false); for (int i = 0; i < 10000; i++) { UMat dst; Sobel(src, dst, -1, 1, 0); } 테스트 결과 OpenCL을 활성화 했을 때가 비활성화 했을때보다 10배 정도 빨라졌습니다. (테스트 환경에 ..
Watershed 알고리즘을 사용하여 영상 분할(Image segmentation) 하는 방법에 대해 설명합니다. 다음 OpenCV Python 튜토리얼을 참고하여 강좌를 비정기적로 포스팅하고 있습니다. https://docs.opencv.org/4.0.1/d6/d00/tutorial_py_root.html 그레이스케일 이미지에서 높은 픽셀값을 가지는 부분을 언덕으로 보고, 낮은 픽셀값을 가지는 부분을 계곡으로 볼 수 있습니다. 한 이미지에 여러 개의 고립된 계곡(극소점)이 있을 수 있습니다. 각각 다른 색의 물(라벨)로 물을 채운다고 합시다. 수위가 상승함에 따라 다른색의 물로 채워지던 계곡들이 하나로 합쳐질 수 있습니다. 이것을 방지하기 위해 물이 합류되는 지점에 벽을 쌓습니다. 모든 언덕이 물에 잠..
거리 변환(Distance Transform)은 바이너리 이미지(Binary Image)에서 픽셀값이 0인 배경으로부터의 거리를 픽셀값이 255인 영역에 표현하는 방법입니다. 배경으로부터 멀리 떨어져 있을 수록 높은 픽셀 값을 가집니다. 실제 실행 결과입니다. 직사각형의 경우 배경으로부터 일정거리 떨어진 영역인 중앙에 일직선으로 밝은 부분이 생깁니다. cv.distanceTransform 함수의 결과를 문자열로 출력해보아도 대각선으로 밝은 부분이 높은 값을 갖지 않아서 이상합니다. 원의 경우 중앙으로 갈수록 픽셀값이 높아지기 때문에 중앙이 흰색입니다. 테스트에 사용한 코드입니다. import cv2 as cv import numpy as np img = cv.imread('rectangle.jpg') g..
이번 포스팅에서는 템플릿 매칭을 사용하여 이미지상에서 오브젝트를 찾는 방법을 다룹니다. 다음 OpenCV Python 튜토리얼을 참고하여 강좌를 비정기적로 포스팅하고 있습니다. https://docs.opencv.org/4.0.1/d6/d00/tutorial_py_root.html 템플릿 매칭 구현은 다음 링크를 참고하세요. OpenCV 강좌 - 템플릿 매칭(Template Matching) 구현https://webnautes.tistory.com/1349 마지막 업데이트 2019. 1. 3 템플릿 매칭은 입력 이미지에서 템플릿 이미지의 위치를 찾는 방법입니다. OpenCV에서는 템플릿 매칭을 위해 cv.matchTemplate() 함수를 제공합니다. 2차원 컨볼루션처럼 템플릿 이미지를 입력 이미지상 위..
Hough Line Transform 구현 원리에 대해서 다룹니다. 유튜브에서 사용한 코드입니다. import cv2 as cv import numpy as np import math import time img_original = cv.imread('square.jpg', cv.IMREAD_COLOR) img_gray = cv.cvtColor(img_original, cv.COLOR_BGR2GRAY) img_edge = cv.GaussianBlur(img_gray, (5, 5), 0, 0) img_edge = cv.Canny(img_edge, 50, 150, 3) height = img_edge.shape[0] width = img_edge.shape[1] tmp = min(height, width) ..
깃허브에 공개되어 있는 파이썬 기반 얼굴 인식 라이브러리를 테스트해보았습니다. 1. dlib를 설치합니다.(시간이 오래 걸립니다.)pip3 install dlib 2. Face Recognition 라이브러리를 설치합니다. pip3 install face_recognition 3. OpenCV를 설치합니다. pip3 install opencv-contrib-python 4. 아래 주소에 있는 코드를 가져옵니다. https://github.com/ageitgey/face_recognition/blob/master/examples/facerec_from_webcam_faster.py 5. 인식할 얼굴 사진과 이름을 변경해줍니다. 오바마 이미지를 스마트폰으로 촬영후 얼굴만 잘라낸 사진으로 변경했습니다. 인식할..
이미지에서 2차원 히스토그램을 구하는 방법과 응용으로 Histogram Backprojection을 설명합니다. 다음 OpenCV Python 튜토리얼을 참고하여 강좌를 비정기적로 포스팅하고 있습니다. https://docs.opencv.org/4.0.0/d6/d00/tutorial_py_root.html 최초작성 2018. 12. 15 1. 2차원 히스토그램(2D Histograms)그레이스케일 이미지로 부터 구한 히스토그램은 1차원 히스토그램이었습니다. 그레이스케일 이미지가 하나의 채널을 가지고 있었기 때문에 하나의 특징만을 고려했습니다. 2차원 히스토그램에서는 두가지 특징을 고려합니다. 예를 들어 HSV 색공간 이미지를 입력으로 사용한다면 모든 픽셀에서 두가지 특징 Hue 값와 Saturation ..