이미지에서 코너 검출시 사용하는 해리스 코너에 대해 알아봅니다. 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 ..
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) ..
이미지에서 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 ..
이미지에서 히스토그램을 구하는 방법과 응용으로 Histogram Equalization, CLAHE을 설명합니다. 다음 OpenCV Python 튜토리얼을 참고하여 강좌를 비정기적로 포스팅하고 있습니다. https://docs.opencv.org/4.0.0/d6/d00/tutorial_py_root.html 최초작성 2018. 12. 13 1. 히스토그램이란? 히스토그램은 이미지를 구성하는 픽셀값 분포에 대한 그래프입니다. X축은 픽셀값으로 범위는 0 ~ 255 사이입니다. Y축은 이미지에서 해당 픽셀값을 가진 픽셀의 개수입니다. 히스토그램의 왼쪽에는 가장 어두운 검은색 픽셀(0)의 갯수를 보여주며 오른쪽으로 갈 수록 밝은 픽셀의 갯수를 보여줍니다. 히스토그램을 보면 이미지 촬영시 빛의 노출이 제대로 되..
컨투어 검출하는 방법과 컨투어 특성을 사용하는 방법을 다룹니다. 사용하는 OpenCV 버전에 따라 findContours 함수의 사용 방법이 다음처럼 차이가 있습니다. OpenCV 4.xcontours, hierarchy = cv.findContours(img_binary, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE) OpenCV 3.x_, contours, hierarchy = cv.findContours(img_binary, cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE) Contour Features영역 크기 import cv2 as cv img_color = cv.imread('test.png') img_gray = cv.cvtColor(img_color..
Canny Edge Detector를 구현하기 위해 필요한 이론과 OpenCV에서 제공하는 Canny 함수 사용방법을 다룹니다. 캐니 에지 디텍터(Canny Edge Detector) 이론 2. OpenCV Canny 함수 2-1. Python 기본 예제 트랙바 사용 예제 2-2. C++ 기본 예제 트랙바 사용 예제 3. 참고 2018. 11. 14. 최초 작성. 1. 캐니 에지 디텍터(Canny Edge Detector) 이론 2. OpenCV Canny 함수OpenCV에서는 하나의 함수 Canny만 호출하면 캐니 에지를 얻을 수 있습니다. 2-1. Python 기본 예제 img_canny = cv2.Canny(image, threshold1, threshold2, edges=None, aperture..