라벨이 opencv인 게시물 표시

python OpenCV UI 마우스 이벤트 예제

 폰 포스트는 python에서 OpenCV.setMouseCallback를 사용하여 마우스 이벤트를 사용하는 예제코드를 싣고 있다.  OpenCV.setMouseCallback는 지정된 윈도우에 마우스 이벤트 콜백 함수를 등록하는데 사용된다. https://docs.opencv.org/master/d7/dfc/group__highgui.html#ga89e7806b0a616f6f1d502bd8c183ad3e 콜백 함수는 다음과 같은 형식을 가진다. typedef void(* cv::MouseCallback) (int event, int x, int y, int flags, void *userdata) 마우스의 이벤트는 클릭, 더블클릭, 휠 및 마우스 이동 등을 지원한다.  cv.EVENT_MOUSEMOVE cv.EVENT_LBUTTONDOWN cv.EVENT_RBUTTONDOWN cv.EVENT_MBUTTONDOWN cv.EVENT_LBUTTONUP cv.EVENT_RBUTTONUP cv.EVENT_MBUTTONUP cv.EVENT_LBUTTONDBLCLK cv.EVENT_RBUTTONDBLCLK cv.EVENT_MBUTTONDBLCLK cv.EVENT_MOUSEWHEEL cv.EVENT_MOUSEHWHEEL https://docs.opencv.org/master/d0/d90/group__highgui__window__flags.html#ga927593befdddc7e7013602bca9b079b0 마우스 이벤트 처리 예제 코드는 아래와 같다. 특정 폴더내의 이미지 파일 리스트를 생성하고, 마우스 클릭하면 다음 이미지로 넘어가며 화면에 출력하는 예제이다. import cv2 as cv import os class show_imgs(object):   ...

OpenCV를 사용한 간단한 차선 인식 예제

이미지
본 포스트에는 OpenCV에서 제공하는 이미지 프로세싱 API들을 사용한 차선 인식하는 Python 예제 코드를 싣고 있다.  차선인식은 허프 변환(Hough Transform) 을 사용하여 도로의 차선을 구분하도록 하였다. 차선 인식을 위해 다음과 같은 이미지 처리과정이 필요하다.  - 이미지 컬러를 흑백으로 변환 - 노이즈를 제거하기 위한 blurring - 이미지에서 경계면 검출 - 허프 변환을 통해 이미지에서 선 위치 검출 - 검출된 선 위치데이터를 사용해 차선 필터링 차선 필터링은 간단하게 검출된 선의 각도만을 계산하여 필터링 하였다. 예제 코드는 다음과 같다. import math import cv2 as cv def LaneFiltering(lines):          if lines is None:         return None          Lanes = []          for i in range(0,len(lines)):         l = lines[i][0]         x1,y1,x2,y2 = l[0],l[1],l[2],l[3]         if x1 == x2:             Lanes.append([x1,y1,x2,y2])             continue         angle = math.atan((y2-y1)/(x2-x1))*180/mat...

이미지의 가장자리 경계면 검출 (edge detection) 원리와 예제

이미지
 2차원 이미지의 경계면을 찾는 원리는 다음과 같다.    이미지의 경계면은 보통 위 그림의 a와 같이 색의 차이가 있는 것을 볼 수 있으며, 1차원으로 보면 그림의 b처럼 나타낼 수 있다. 이 색의 차이가 많아지는 부분은 미분을 통해(그림의 c) 찾을 수 있다. 미분연산은 합성곱(convolution) 연산을 사용하여 근사치를 계산할 수 있다. 예를 들어 아래와 같이 2개의 gx, gy matrix를 사용해 2d 이미지에서 미분 값이 큰 위치를 찾을 수 있다. 즉 이미지의 경계면을 찾을 수 있다.  def main():     gx = np.array([(-1,0,1),                    (-2,0,2),                    (-1,0,1)])     gy = np.array([(-1,-2,1),                    (0,0,0),                    (1,2,1)])     src = np.array([(125,255,255,255,255,255),                     (000,125,255,255,255,255),                     ...

이미지 blur와 양방향 필터링(Bilateral Filtering)

이미지
노이즈를 줄이거나 이미지를 부드럽게 보이기 위해 blurring을 사용한다.  일반적으로 커널 윈도우를 이미지 전체에서 슬라이딩하여 필터링하며 blurring한다.    많이 사용되는 필터(커널)의 형태는 다음과 같다. 1. 커널 영역 픽셀의 평균값을 사용 2. 커널 영역 픽셀의 가우스 분포 가중 평균을 사용 3. 커널 영역 픽셀의 중앙값을 사용 import cv2 as cv # https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga8c45db9afe636703801b0b2e440fce37 def Blur(img, ksize=(1,1), title='Blur'):     if img is None:         return     dst = cv.blur(img,ksize)     cv.imshow(title,dst) # https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gaabe8c836e97159a9193fb0b11ac52cf1 def GaussianBlur(img, ksize=(1,1), title='GaussianBlur'):     if img is None:         return     dst = cv.GaussianBlur(img,ksize,0)     cv.imshow(title,dst) # https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga564869aa33e58769b4469101aac458f...

Python OpenCV를 사용한 간단한 얼굴 위치 인식 예제 코드

이미지
 Face ID와 같은 보안이나, SNOW 같은 카메라 app에서 얼굴을 변형하거나 이미지를 보정하는 분야까지 얼굴 인식은 현재 많은 분야에 사용되고 있다. 본 포스트는 Python에서 OpenCV를 사용하여 얼굴의 위치를 감지하고, 그 위에 다른 이미지를 그리는 예제를 담고 있다.  OpenCV 튜토리얼 중 카메라 haar cascade classifier를 사용해 영상에서 사람의 얼굴 위치를 감지하는 예제가 있다.  https://docs.opencv.org/master/db/d28/tutorial_cascade_classifier.html  Haar feature-based cascade classifier를 사용한 객체 감지는 Paul Viola와 Michael Jones의 논문 “Rapid Object Detection using a Boosted Cascade of Simple Features”에서 제안한 객체 감지 방법이라고 한다. 이는 검출하고자 하는 객체 이미지와 그 객체가 없는 이미지를 훈련시킨 후 다른 이미지에서 원하는 객체를 감지하는 일종의 머신 러닝의 방식이라고 한다. OpenCV를 사용하여 얼굴 위치를 인식하는 순서는 다음과 같다.  1. cv.CascadeClassifier를 사용하여 cascade classifier를 생성한다. 2. cv.CascadeClassifier.load를 사용하여 훈련된 모델의 xml파일을 로드 한다. 3. Cv.CascadeClassifier.detectMultiScale을 사용하여 이미지에서 얼굴의 위치를 감지한다. 객체 검출 모델은 훈련을 통해 만들 수 있다. ( https://docs.opencv.org/master/dc/d88/tutorial_traincascade.html ) OpencCV에서는 이미 학습된 얼굴 감지 모델을 제공하고 있고,...

Python OpenCV를 사용하여 동영상에서 움직이는 물체 검출 예제

이미지
 본 포스트에서는 background subtraction을 사용하여 동영상에서 움직이는 물체를 검출하는 예제를 싣고 있다. 배경 제거 (background subtraction)의 원리는 아래 포스트를 참조하자. 신호에서 배경 제거(background subtraction)를 통한 움직이는 물체의 위치 검출 OpenCV에는 Background Subtractor가 구현되어 있으므로 이를 사용하였다. https://docs.opencv.org/3.4/de/de1/group__video__motion.html 코드는 아래와 같다. import cv2 as cv import numpy as np def main():          cap = cv.VideoCapture('20201110_113359.mp4')          bgs = cv.createBackgroundSubtractorKNN(dist2Threshold =500,detectShadows=False)          while cap.isOpened():         ret, frame = cap.read()                  if not ret:             break                  frame = cv.resize(frame,None,fx=0.2,fy=0.2,interpolation = cv.INTER_CUBIC) ...

Python opencv 설치와 이미지 출력 및 카메라 영상 캡쳐 예제 코드

이미지
◼ python환경 opencv 설치 anaconda conda install -c conda-forge opencv https://anaconda.org/conda-forge/opencv pip pip install opencv-python 설치 버전 확인 import cv2 as cv print(cv.__version__) 4.1.0 ◼ opencv 동작 예제 코드 OpenCV-Python Tutorials 페이지에 python에서 opencv를 사용하는 예제 코드들이 수록되어 있다. 위 예제 중 간단한 몇 가지를 실행해 봤다. 이미지 디스플레이 예제 참조 :  https://docs.opencv.org/master/db/deb/tutorial_display_image.html import cv2 as cv img = cv.imread('14793554227.jpg') if img is not None:     cv.imshow('display', img) cv.waitKey(0) cv.destroyAllWindows() 카메라 영상 캡쳐 예제 참조 :  https://docs.opencv.org/master/dd/d43/tutorial_py_video_display.html import cv2 as cv cap = cv.VideoCapture(0) while cap.isOpened():     # Capture frame-by-frame     ret, frame = cap.read()     # if frame is read correctly ret is True     if not ret:         print("Can't ...

opencv 라이브러리 MFC Debug 모드에서 발생하는 메모리 릭 해결법

이미지
opencv를 사용하는 소스를 업체에서 받아 어쩔 수 없이 MFC app에서 opencv를 사용한적이 있다. Visual Studio 2013을 사용하고 있어서 오래된 opencv 버전을 받아 사용했다. 최근 버전은 라이브러리 빌드가 안된다. 게다가, MFC환경에서 opencv를 사용하면, 디버깅을 종료할 때 메모리 릭까지 발생한다. 그나마, 아래 그림처럼 지연 로드된 DLL에 opencv dll을 넣어주면 메모리 릭은 발생하지 않는다. 처음 opencv 사용할때 고생을 하여 지금은 opencv를 사용하지 않는다.