Terry Very Good

[Object Detection] 1. OpenCV 기초(영상처리) 지식 학습 본문

신기술 습득

[Object Detection] 1. OpenCV 기초(영상처리) 지식 학습

테리베리 2021. 9. 3. 17:46
728x90
반응형

목표:

(Object Detection - Object(Face... etc) Recognition and Detection ) 기술 습득

 

1. 간단한 이론

Raster graphics(비트맵, 픽셀단위, jpg) :
대표적으로 MNIST(Modified National Institute of Standards and Technology Database) 손글씨 데이터가 있음.

Vector Graphics(벡터이미지, svg): 화면이 깨지지 않는다.

앞으로 배울 딥러닝 영상처리를 위해서는 Raster Graphics를 많이 쓸 것

 

2. 설치

OpenCV를 설치하는 가장 좋은 방법은 Anaconda이다.

(가상환경 생성)
conda create --name ComputerVision

(가상환경 실행)
conda activate ComputerVision

(가상환경 종료)
conda deactivate

나는 아래화면처럼.. Anaconda Navigator로 생성하는게 편하던데..

 

3. 셋팅

가상환경 접속 후 설치된 리스트 확인 -> OpenCV설치 -> 주피터노트북으로 설치 확인

pip list

pip install opencv-python

pip install jupyter notebook

(가상환경에 kernel 연결) - 이걸안해주면 주피터노트북이 가상환경과 연결되지 않고 커널과 연결되어 가상환경 내에 설치한 라이브러리가 작동하지 않는다.
python -m ipykernel install --user --name ComputerVision

 

 

4. 예제 학습

기본예제 1: OpenCV를 사용하여 사진을 가져와 흑백변환

결과 및 코드

import cv2
import numpy
import os
print(os.getcwd())
data_root = 'D:/Computer Vision/opencv_dnn_202005/';

print("OpenCV File")
print(cv2.__version__)

img = cv2.imread(data_root+"Daegu_Palgongsan.jpg")
img = cv2.resize(img, dsize=(500, 400), interpolation=cv2.INTER_AREA)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

cv2.imshow("Daegu_Palgongsan", img)
cv2.imshow("Daegu_Palgongsan - gray", gray)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

기본예제 2: 사진의 특정 영역에 색 변경 및 도형(사각형, 원, 선, 글씨) 생성

결과 및 코드

import cv2
import numpy as np
import os
print(os.getcwd())
data_root = 'D:/Computer Vision/opencv_dnn_202005/';

print("OpenCV File")
print(cv2.__version__)


img = cv2.imread(data_root+"Daegu_Palgongsan.jpg")

print("width: {} pixels".format(img.shape[1]))   # 가로 픽셀의 수
print("height: {} pixels".format(img.shape[0]))  # 세로 픽셀의 수
print("channel: {}".format(img.shape[2])) # 채널 수

#그림 1: 원본
cv2.imshow('Daegu_Palgongsan', img)

#그림 2: 자를 부분
dot = img[50:100, 50:100]#잘라낼 부분(빨간부분으로 치환할 부분)
cv2.imshow("Dot", dot)

#그림 3: 그림2의 부분을 빨강으로 바꾸고, 특정 부분에 사각형 생성
img[50:100,50:100] = (0,0,255) # 빨간부분으로 치환
cv2.rectangle(img, (150,50), (200,100), (0,255,0),5) #img에 굵기 5인 사각형 그리기
#cv2.circle(img, (275,75), 25, (0.255,255), -1) #img의 (275,75)에 반지름이 25인 원 그리기
#cv2.line(img, (350,100),(400,100),(255,0,0),5) #img에 선 그리기
#cv2.putText(img,'creApple', (450,100), cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,255), 4) #img에 Hershey폰트/ 1size / 흰색 / 굵기 4인 creApple 그리기 
cv2.imshow('Daegu_Palgongsan - draw', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

기본예제 3: 사진 이동, 회전, 사이즈 변경

결과 및 코드

(height, width) = img.shape[:2]
center = (width // 2, height // 2)

#그림 이동시키기
move = np.float32([[1,0,100], [0,1,100]]) # 그림이 아래/오른쪽으로 100씩 간다
moved = cv2.warpAffine(img, ,move, (width, height))
cv2.imshow("Moved down: +, up: - and right: +, left - ", moved)

#그림 회전하기
rotate = cv2.getRotationMatrix2D(center, 90, 1.0) # 그림의 중심(center)에서 90도 회전
rotated = cv2.wrpAffine(img, rotate, (width, height))
cv2.imshow("Rotated degrees", rotated)


#그림 사이즈 줄이기
ratio = 200.0 / width	#그림의 너비를 200으로 할 때, 원래 값에서 몇배를 하는 지 구함
dimension = (200, int(height * ratio))	# ratio에 높이를 곱하면, 변경되는 너비에 맞는 높이 구함
resized = cv2.resize(img, dimension, interpolation = cv2.INTER_AREA)

 

기본예제 4: 마스킹

결과 및 코드

(height, width) = img.shape[:2]
center = (width // 2, height // 2)

#검은 화면 만들고
mask = np.zeros(img.shape[:2], dtype = "uint8")	#img파일의 (height, width)의 RGB를 모두 0으로 채운다(검정색)
#원형 마스크를 만들고
cv2.circle(mask, center, 300, (255,255,255), -1) # mask(온통 검은 그림)의 중앙을 중심으로 반지름이 300인 흰색원을 그린다.
#이미지와 원형마스크가 겹치는 부분을 마스킹처리
masked = cv2.bitwose_and(img, img, mask = mask) # img라는 파일에 img와 mask가 AND조건인 부분만 RGP값이 채워진다(둘 중 하나라도 0이 있는 곳은 검은색으로 채워짐)

 

기본예제 4: 마스킹(Red, Greed, Blue, Gray, HSV, LAB)

결과 및 코드

- (Red, Greed, Blue)

cv2.imshow("Daegu_Palgongsan", img)

(Blue, Green, Red) = cv2.split(img)

cv2.imshow("Red Channel", Red) #레드는 하얗게
cv2.imshow("Green Channel", Green)#그린은 하얗게
cv2.imshow("Blue Channel", Blue)#블루는 하얗게

cv2.waitKey(0)

zeros = np.zeros(img.shape[:2], dtype='uint8')
cv2.imshow("Red", cv2.merge([zeros,zeros,Red])) #레드값으로만 보이게
cv2.imshow("Green", cv2.merge([zeros,Green,zeros]))#그린값으로만 보이게
cv2.imshow("Blue", cv2.merge([Blue,zeros,zeros]))#블루값으로만 보이게

cv2.waitKey(0)
cv2.destroyAllWindows()

 

- (Gray, HSV, LAB)

cv2.imshow("Daegu_Palgongsan", img)

(Blue, Green, Red) = cv2.split(img)


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)

cv2.imshow("Gray Filter", gray)
cv2.imshow("Hsv Filter", hsv)
cv2.imshow("Lab Filter", lab)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

728x90
반응형