본문 바로가기
Language/파이썬

파이썬을 이용한 OpenCV

by javapp 자바앱 2021. 1. 31.
728x90

 

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)

 


 

  • 이미지처리

그레이스케일이진화를 통해 이미지 인식 성능을 향상 시킬 수 있다.

흑백(Grayscale)[왼], 이진화[우] 


그레이스케일

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 알고리즘을 이용하여 손글씨 숫자 인식을 할 수 있다.

 

kNN을 이용한 숫자 인식 — gramman 0.1 documentation

Goal kNN Machine Learning 알고리즘을 이용하여 손글씨 숫자를 인식할 수 있다. 이번에는 kNN방식을 이용하여 손글씨 숫자를 인식하는 예제를 진행하도록 하겠습니다. 우선 traning data가 필요합니다. 아

opencv-python.readthedocs.io

KNN 알고리즘 설명

손글씨

손글씨 숫자 이미지를 20x20 한 숫자씩 OpenCV를 이용하여 자르고 기계학습을 한다.

 

 


 

  • 인식

Haar Cascades를 이용하여 얼굴 인식

 

Face Detection using Haar Cascades — OpenCV-Python Tutorials 1 documentation

Face Detection using Haar Cascades Goal In this session, We will see the basics of face detection using Haar Feature-based Cascade Classifiers We will extend the same for eye detection etc. Basics Object Detection using Haar feature-based cascade classifie

opencv-python-tutroals.readthedocs.io

 

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()

haarcascade_frontalface_default.xml
0.89MB
haarcascade_fullbody.xml
0.45MB
haarcascade_upperbody.xml
0.75MB

 

 

 

참고 사이트 

opencv-python-tutroals.readthedocs.io/en/latest/index.html#

 

Welcome to OpenCV-Python Tutorials’s documentation! — OpenCV-Python Tutorials 1 documentation

Docs » Welcome to OpenCV-Python Tutorials’s documentation! Edit on GitHub © Copyright 2013, Alexander Mordvintsev & Abid K. Revision 43532856. Built with Sphinx using a theme provided by Read the Docs.

opencv-python-tutroals.readthedocs.io

 

댓글