유진의 코딩스토리

OpenCV 실습 본문

Azure 실습/Azure deep learnig

OpenCV 실습

놀고먹는 유진 2024. 10. 29. 20:01

OpenCV

OpenCV(Open Source Computer Vision Library)는 실시간 컴퓨터 비전을 위한 오픈 소스 라이브러리입니다. 컴퓨터 비전, 이미지 처리 및 머신러닝을 위한 다양한 기능을 제공합니다. OpenCV는 C++, Python, Java 등 다양한 프로그래밍 언어를 지원하며, 주로 Python에서 많이 사용됩니다.

 

 

주요 기능

  1. 이미지 처리: 이미지의 필터링, 변환, 에지 검출, 색상 변환 등 다양한 이미지 처리 기능
  2. 객체 인식: 얼굴, 사람, 자동차 등 특정 객체를 이미지와 비디오에서 탐지할 수 있는 기능
  3. 비디오 처리: 비디오 스트림을 읽고, 처리하고, 저장할 수 있습니다. 실시간 비디오 분석과 관련된 작업을 쉽게 수행할 수 있게 해주는 기능
  4. 기계 학습과 딥러닝: OpenCV에는 다양한 기계 학습 알고리즘과 딥러닝 모델을 쉽게 통합하여 사용할 수 있는 기능

 

 

OpenCV 설치

 

 

이미지 파일을 읽고 윈도우에 디스플레이

import cv2 as cv
import sys

img=cv.imread('C:\python_project\python_project\DL_project\DL3_20241006\OpenCV_CVDLCodeMaster\CVDLCodeMaster\source\ch2\soccer.jpg')	# 영상 읽기

if img is None:
    sys.exit('파일을 찾을 수 없습니다.')
    
cv.imshow('Image Display',img)	# 윈도우에 영상 표시

cv.waitKey()
cv.destroyAllWindows()

 

 

import cv2 as cv
import sys

img=cv.imread('/Users/jinwookkwon/Dropbox/권진욱/Work/교재모음/딥러닝/컴퓨터비전과딥러닝/source_4548_1/source/ch2/soccer.jpg') 

if img is None:
    sys.exit('파일을 찾을 수 없습니다.')

gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)	# BGR 컬러 영상을 명암 영상으로 변환
gray_small=cv.resize(gray,dsize=(0,0),fx=0.5,fy=0.5) # 반으로 축소

cv.imwrite('soccer_gray.jpg',gray)	# 영상을 파일에 저장 
cv.imwrite('soccer_gray_small.jpg',gray_small)  
    
cv.imshow('Color image',img)
cv.imshow('Gray image',gray)
cv.imshow('Gray image small',gray_small)

cv.waitKey()
cv.destroyAllWindows()

 

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

- OpenCV를 사용하여 BGR 컬러 영상을 명암 영상으로 변환하는 코드

- img: 입력 영상으로, BGR 형식(파란색, 초록색, 빨간색 채널). OpenCV는 기본적으로 BGR 색상 공간을 사용

- cv.COLOR_BGR2GRAY: OpenCV에게 BGR 형식의 영상을 그레이스케일(명암)로 변환하라고 지시하는 색상 변환 코드

 

▶ gray_small = cv.resize(gray, dsize=(0,0), fx=0.5, fy=0.5)

- OpenCV를 사용하여 이미지를 가로와 세로 방향으로 각각 50%로 축소하는 코드

- gray: 입력 이미지로, 이 경우 앞서 만든 그레이스케일 이미지

- dsize=(0,0): 출력 이미지의 크기를 직접 지정하지 않고, 대신 비율로 크기를 조정하기 위해 (0,0)으로 설정

- fx=0.5, fy=0.5: 가로(fx)와 세로(fy) 방향으로 각각 0.5배로 크기를 축소. 즉, 이미지가 반으로 줄어듦

 

 

 

 

 

 

영상에 도형을 그리고 글씨 쓰기

import cv2 as cv
import sys

img=cv.imread('C:\python_project\python_project\DL_project\DL3_20241006\OpenCV_CVDLCodeMaster\CVDLCodeMaster\source\ch2\girl_laughing.jpg') 
  
if img is None:
    sys.exit('파일을 찾을 수 없습니다.')

cv.rectangle(img,(830,30),(1000,200),(0,0,255),2)	# 직사각형 그리기
cv.putText(img,'laugh',(830,24),cv.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2)	# 글씨 쓰기

cv.imshow('Draw',img)

cv.waitKey()
cv.destroyAllWindows()

 

 

cv.rectangle(img, (830, 30), (1000, 200), (0, 0, 255), 2)

- openCV를 사용하여 이미지에 직사각형을 그리는 코드

- img : 직사각형을 그릴 이미지 파일

- (830, 30) : 직사각형의 왼쪽 위 모서리 좌표

- (1000, 200) : 직사각형의 오른쪽 아래 모서리 좌표

- (0, 0, 255) : 직사각형의 색상으로, BGR 형식. 파랑 0, 초록 0, 빨강 255로 빨간색을 의미

- 2 : 직사각형 테두리의 두께. 여기서는 2픽셀 두께

 

  cv.putText(img, 'laugh', (830, 24), cv.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)

- OpenCV를 사용하여 이미지에 텍스트를 추가하는 코드

- img: 텍스트를 추가할 이미지

- 'laugh': 이미지에 표시할 텍스트 내용. 여기서는 'laugh'라는 텍스트 추가

- (830, 24): 텍스트를 그릴 시작 좌표. 이 좌표는 텍스트의 왼쪽 아래 모서리 위치. 

- cv.FONT_HERSHEY_SIMPLEX: OpenCV에서 제공하는 글꼴 중 하나인 Hershey Simplex 글꼴을 사용

- 1: 텍스트 크기를 조정하는 스케일 팩터. 여기서는 글꼴 크기가 1로 설정

- (255, 0, 0): 텍스트 색상. BGR 형식으로 지정하며, (255, 0, 0)은 파란색을 나타냄

- 2: 텍스트 테두리의 두께. 여기서는 2픽셀 두께로 텍스트가 그려짐.

 

 

 

마우스 드래그로 도형 크기 조절

import cv2 as cv
import sys

img=cv.imread('C:\python_project\python_project\DL_project\DL3_20241006\OpenCV_CVDLCodeMaster\CVDLCodeMaster\source\ch2\girl_laughing.jpg') 
  
if img is None:
    sys.exit('파일을 찾을 수 없습니다.')
    
def draw(event,x,y,flags,param):
    global ix,iy
    
    if event==cv.EVENT_LBUTTONDOWN:	# 마우스 왼쪽 버튼 클릭했을 때 초기 위치 저장
        ix,iy=x,y
    elif event==cv.EVENT_LBUTTONUP:	# 마우스 왼쪽 버튼 클릭했을 때 직사각형 그리기
        cv.rectangle(img,(ix,iy),(x,y),(0,0,255),2)
    
    cv.imshow('Drawing',img)
    
cv.namedWindow('Drawing')
cv.imshow('Drawing',img)

cv.setMouseCallback('Drawing',draw)

while(True):
    if cv.waitKey(1)==ord('q'):
        cv.destroyAllWindows()      
        break

 

▶  cv.setMouseCallback('Drawing', draw)

- OpenCV에서 특정 창(윈도우)에 마우스 이벤트 콜백 함수를 설정하는 코드

- 'Drawing' : 마우스 이벤트를 설정할 창(윈도우)의 이름. OpenCV 창을 생성할 때 지정한 이름이 들어감.

- draw : 마우스 이벤트가 발생할 때 호출될 콜백 함수. 여기서 draw는 사용자 정의한 함수로 미리 지정, 마우스 클릭, 드래그 등의 이벤트가 발생할 때 해당 함수가 실행됨

 

 

 

 

 

마우스 움직임에 따라 빨간색 원과 파란색 원 페인팅

import cv2 as cv 
import sys

img=cv.imread('C:\python_project\python_project\DL_project\DL3_20241006\OpenCV_CVDLCodeMaster\CVDLCodeMaster\source\ch2\soccer.jpg')

if img is None:
    sys.exit('파일을 찾을 수 없습니다.')

BrushSiz=5					# 붓의 크기
LColor,RColor=(255,0,0),(0,0,255)		# 파란색과 빨간색

def painting(event,x,y,flags,param):
    if event==cv.EVENT_LBUTTONDOWN:   
        cv.circle(img,(x,y),BrushSiz,LColor,-1)# 마우스 왼쪽 버튼 클릭하면 파란색
    elif event==cv.EVENT_RBUTTONDOWN: 
        cv.circle(img,(x,y),BrushSiz,RColor,-1)# 마우스 오른쪽 버튼 클릭하면 빨간색
    elif event==cv.EVENT_MOUSEMOVE and flags==cv.EVENT_FLAG_LBUTTON:
        cv.circle(img,(x,y),BrushSiz,LColor,-1)# 왼쪽 버튼 클릭하고 이동하면 파란색
    elif event==cv.EVENT_MOUSEMOVE and flags==cv.EVENT_FLAG_RBUTTON:
        cv.circle(img,(x,y),BrushSiz,RColor,-1)# 오른쪽 버튼 클릭하고 이동하면 빨간색

    cv.imshow('Painting',img)		# 수정된 영상을 다시 그림

cv.namedWindow('Painting')
cv.imshow('Painting',img)

cv.setMouseCallback('Painting',painting)

while(True):
    if cv.waitKey(1)==ord('q'):
        cv.destroyAllWindows()      
        break

 

▶ cv.circle(img, (x, y), BrushSiz, LColor, -1)

- OpenCV를 사용하여 원을 그리는 코드

- img : 원을 그릴 이미지

- (x, y) : 원의 중심 좌표. 여기서 (x, y)는 마우스 이벤트로 전달된 좌표로, 마우스 위치에 원이 그려짐.

- BrushSiz : 원의 반지름을 나타내는 변수. 브러시 크기

- LColor : 원의 색상을 나타내는 변수로, BGR 형식으로 지정. 예를 들어 (255, 0, 0)은 파란 색

- -1: 이 값은 원을 채우는 방식. -1은 원을 채운 상태로 그린다는 의미. 양의 값(예: 1, 2 등) 은 테두리만 그릴 때 사용하는 두께를 지정하는 값

 

 

오츄 알고리즘

import matplotlib
matplotlib.use('TkAgg')
import cv2 as cv
import sys

img=cv.imread('C:\python_project\python_project\DL_project\DL3_20241006\OpenCV_CVDLCodeMaster\CVDLCodeMaster\source\ch3\soccer.jpg') 
            
t,bin_img=cv.threshold(img[:,:,2],0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
print('오츄 알고리즘이 찾은 최적 임곗값=',t)

cv.imshow('R channel',img[:,:,2])			# R 채널 영상
cv.imshow('R channel binarization',bin_img)	# R 채널 이진화 영상

cv.waitKey()
cv.destroyAllWindows()

 

▶ t, bin_img = cv.threshold(img[:,:,2], 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)

  • img[:,:,2] : 입력 이미지의 빨간색 채널. OpenCV는 BGR 형식을 사용하므로, img[:,:,2]는 빨 간색(R) 채널을 의미
  • 0 : 자동으로 임계값을 계산하는 것을 의미. Otsu's 방법을 사용하므로, 직접 임계값을 지정하지 않고 자동으로 선택
  • 255 : 픽셀 값이 임계값을 넘으면 설정할 최대값. 이 코드에서는 이진화 결과에서 초과한 값은 255(흰색)가 됨.
  • cv.THRESH_BINARY + cv.THRESH_OTSU : 이진화 방법. cv.THRESH_BINARY는 기본 이진 화를 의미하며,
  • cv.THRESH_OTSU는 Otsu's Thresholding 방법을 추가로 사용하여 임계값을 자동으로 결정

 

 

 

히스토그램 평활화

히스토그램이 평평하게 되도록 영상을 조작해 영상의 명암 대비를 높이는 기법

import cv2 as cv
import matplotlib.pyplot as plt

img=cv.imread('C:\python_project\python_project\DL_project\DL3_20241006\OpenCV_CVDLCodeMaster\CVDLCodeMaster\source\ch3\mistyroad.jpg') 

gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)		# 명암 영상으로 변환하고 출력
plt.imshow(gray,cmap='gray'), plt.xticks([]), plt.yticks([]), plt.show()

h=cv.calcHist([gray],[0],None,[256],[0,256])	# 히스토그램을 구해 출력
plt.plot(h,color='r',linewidth=1), plt.show()

equal=cv.equalizeHist(gray)			# 히스토그램을 평활화하고 출력
plt.imshow(equal,cmap='gray'), plt.xticks([]), plt.yticks([]), plt.show()

h=cv.calcHist([equal],[0],None,[256],[0,256])	# 히스토그램을 구해 출력
plt.plot(h,color='r',linewidth=1), plt.show()

 

▶ h = cv.calcHist([gray], [0], None, [256], [0, 256])

OpenCV를 사용하여 그레이스케일 이미지의 히스토그램을 계산하는 코드

  • [gray] : 히스토그램을 계산할 입력 이미지. 이 경우 위에서 지정한 그레이스케일 이미지임.
  • [0] : 분석할 채널을 지정. 그레이스케일 이미지의 경우 채널은 하나이기 때문에 0을 사용
  • None : 마스크로, 특정 영역만 히스토그램을 계산할 경우 사용. 여기서는 None으로 설정 되어 전체 이미지에 대해 히스토그램을 계산
  • [256] : 히스토그램의 빈(bin) 수를 지정. 여기서는 256개의 빈을 사용하여 픽셀 값 0에서 255까지의 빈도를 계산함.
  • [0, 256] : 픽셀 값의 범위를 지정. 여기서는 0에서 256(미포함)까지 설정하여 픽셀 값 0에 서 255까지의 히스토그램을 계산