OpenCV (Open Source Computer Vision) 는 실시간 컴퓨터 비전을 목적으로 한 라이브러리
영상처리, 3D 구성, 추적, 기계학습, 딥러닝, 인식
다양한 영상 처리 알고리즘을 쉽게 사용가능하다.
본래 C 언어만 지원했지만 C++을 지원하기 시작했고, 현재는 C++11 을 공식으로 채택하고 있다.
딥러닝과 Python이 뜨면서 파이썬을 공식적으로 지원하고 있고 파이썬으로 랩핑하여 사용하는 추세이다.
기계학습, 딥러닝에 관련한 기능들을 다루려고 한다.
- 카메라 다루기
import cv2
cap = cv2.VideoCapture(0)
cap.set(3,720)
cap.set(4, 1080)
while True:
ret, frame = cap.read()
frame = cv2.flip(frame,1)
cv2.imshow('CAM',frame)
k = cv2.waitKey(1)
if k == 27:
break
cap.release()
cv2.destroyWindow()
- 동영상 다루기
import numpy as np
import cv2
cap = cv2.VideoCapture('vtest.avi')
while(cap.isOpened()):
ret, frame = cap.read()
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
- 도형 그리기
#image , 왼위, 오아, color, 굵기)
image = cv2.rectangle(image, (20, 20), (500, 500), (255, 0, 0), 3)
- 이미지처리
그레이스케일과 이진화를 통해 이미지 인식 성능을 향상 시킬 수 있다.
그레이스케일
image = cv2.imread('gray_image.jpg', cv2.IMREAD_GRAYSCALE)
이진화
임계값을 기준으로 흑/백으로 분류하는 함수
cv2.threshold(image, threst, max_value, type)
type
THRESH_BINARY: 임계 값보다 크면 max_value, 작으면 0
THRESH_BINARY_INV: 임계 값보다 작으면 max_value, 크면 0
THRESH_TRUNC: 임계 값보다 크면 임계 값, 작으면 그대로
THRESH_TOZERO: 임계 값보다 크면 그대로, 작으면 0
THRESH_TOZERO_INV: 임계 값보다 크면 0, 작으면 그대로
ret, thres1 = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
- Contours 윤곽
cv2.findContours(image, mode,method) #이미지에서 Contour들을 찾는 함수
cv2.drawContours(image,contours,contour_index,color,thickness #Contour 그리는 함수
cv2.boundingRect(contour) #Contour를 포함하는 사각형을 그린다.
예제 코드
import cv2
image = cv2.imread('image.png')
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(image_gray, 230, 255, 0)
thresh = cv2.bitwise_not(thresh)
cv2.imshow('Image', thresh)
cv2.waitKey(0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
image = cv2.drawContours(image, contours, -1, (0, 0, 255), 4)
cv2.imshow('Image', image)
cv2.waitKey(0)
contour = contours[0]
x, y, w, h = cv2.boundingRect(contour)
image = cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 3)
cv2.imshow('Image', image)
cv2.waitKey(0)
사전 조건 : Gray 작업과 threshold 작업이 필요
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(image_gray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
print(contours)
image = cv2.drawContours(image, contours, -1, (0, 255, 0), 4)
cv2.imshow('Image', image)
cv2.waitKey(0)
- mode: Contour들을 찾는 방법
RETR_EXTERNAL: 바깥쪽 Line만 찾기
RETR_LIST: 모든 Line을 찾지만, Hierarchy 구성 X
RETR_TREE: 모든 Line을 찾으며, 모든 Hierarchy 구성 O
- method: Contour들을 찾는 근사치 방법
CHAIN_APPROX_NONE: 모든 Contour 포인트 저장
CHAIN_APPROX_SIMPLE: Contour Line을 그릴 수 있는 포인트만 저장
윤곽선을 포함한 사각형 그리기
contour = contours[0]
x, y, w, h = cv2.boundingRect(contour)
image = cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 3)
- 기계 학습
kNN 알고리즘을 이용하여 손글씨 숫자 인식을 할 수 있다.
손글씨 숫자 이미지를 20x20 한 숫자씩 OpenCV를 이용하여 자르고 기계학습을 한다.
- 인식
Haar Cascades를 이용하여 얼굴 인식
XML 분류자를 로드 하여 탐지한다.
import numpy as np
import cv2
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
img = cv2.imread('sachin.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
참고 사이트
opencv-python-tutroals.readthedocs.io/en/latest/index.html#
'Language > 파이썬' 카테고리의 다른 글
파이썬 '판다스 데이터 분석' - 데이터프레임 구조(shape, info(),describe(),value_counts()..), 통계함수(mean(), median(), min(), max(), std(), corr()) (0) | 2021.07.08 |
---|---|
파이썬 '판다스 데이터 분석' - 엑셀 파일 읽기 (xlsx, csv), 여러 엑셀 파일 읽기,캐글 제출을 위한 DataFrame (1) | 2021.07.05 |
파이썬 '판다스 데이터 분석' - 판다스 입문 (0) | 2021.07.02 |
파이썬 크롤링, 스크롤링 / python crawling (0) | 2020.07.14 |
파이썬 코드 정리 업데이트 할것 (0) | 2020.07.11 |
댓글