[OpenCV] OpenCV 영상처리

강형우·2022년 11월 21일
0

OpenCV

목록 보기
1/17
post-thumbnail

OpenCV를 이용한 영상처리 프로그래밍 기초

OpenCV의 이미지 표현 방식

  • 640*480 이미지에서
    • 점 하나를 표현하는 [B,R,G] 형태의 배열이
    • 한 행에 640개씩 들어있고
    • 이런 행이 480개 있음
  • >>> type(conv)
    type 'numpy.ndarray'
  • >>> conv.shape
    (480,640,3)
  • >>> conv[0][0]
    (array[174,274,190], dtype=uint8)

OpenCV의 이미지 표현

  • OpenCV 파이썬에선 1픽셀 표현을 위해 3채널(B,G,R) 3byte를 사용
  • 컬러는 (B,G,R) 순서로 배열되며 3채널 구조
    • 각 픽셀의 데이터형은 numpy.ndarray

OpenCV의 좌표계

  • OpenCV를 이용한 Python 코딩에서는 좌표값 표시에 순서쌍(tuple)을 이용

몇 가지 기본적인 도형 그리기

  • 선(line)
    • line(img,start,end,color,thickness)
    • img = cv2.line(img,(0,0),(511,511),(255,0,0),5)
  • 사각형(rectangle)
    • rectangle(img,start,end,color,thickness)
    • img = cv2.rectangle(img,(100,100),(300,500),(0,255,0),3)
  • 원(circle)
    • circle(img,center,radius,color,thickness)
      -img = cv2.circle(img,(300,400),100,(0,0,255),2)
  • 텍스트(text)
    • putText(img,text,org,font,fontScale,color)
    • cv2.putText(img,'입력할문자열',(10,50),cv2.FONT_HERSHEY_SIMPLEX,4,(255,255,255))

    이미지 파일 다루기

  • 이미지 파일 읽어들이기
    • imread(filename,flag)
    • img = cv2.imread('picture.jpg',cv2.IMREAD_GRAYSCALE)
    • picture.jpg 파일을 그레이스케일(1채널구조)로 읽어 img라는 객체에 저장
  • 화면에 이미지 표시하기
    • imshow(window_title,image)
    • cv2.imshow('Color',img)
    • img라는 객체에 저장되어 있는 이미지를 표시하되, 윈도우 타이틀은 'Color'로 함
  • 이미지를 파일로 저장하기
    • imwrite(filename, image)
    • cv2.imwrite('new_image.jpg',img)
    • img라는 객체에 저장되어 있는 이미지를 new_image.jpg라는 이름의 파일로 저장

연습: 사각형 그리기

  • rectangle.py
import cv2
img = cv2.imread('black.png',cv2.IMREAD_COLOR) # 이미지 파일을 읽어옴. Flag: 이미지 파일을 읽을 때 옵션
img = cv2.rectangle(imt,(100,100),(300,400),(0,255,0),3) # 사각형 그리기. pt1:시작점 pt2: 끝점 thickness: 두께
cv2.imshow('black',img) # 화면에 이미지 파일 표시. Title: 창의 제목을 의미. image: cv2.imread()의 리턴값
cv2.waitKey(10000)

이미지에서 흰 점 찾아내기

  • spot.py
import cv2
img = cv2.imread('spot.png',cv2.IMREAD_GRAYSCALE)
h = img.shape[0]
w = img.shape[1]
print("The image dimension is %d x % d" % (w,h))
for i in rnage(0,h-1):
    for j in range(0,w-1):
        if img[i,j] == 255:
            print(i,j)
cv2.imshow('spot',img)
cv2.waitKey(1000)


관심영역 - ROI(Region of interest)

  • 이미지 화면 내에서 관심영역을 설정하는 일은
    • numpy.ndarray의 다차원 배열에서 특정영역을 잘래냄(slicing)으로써 가능

관심영역(ROI) 설정

  • roi.py

HSV 색상 표현

  • HSV 색상 표현
    • RGB 색상 표현 방식보다 색상 또는 명도를 기준으로
    • 객체를 분할해 내기가 용이하며 이미지 처리에 많이 이용되는 표현 방법

HSV 색상 모델의 이용

  • 색상(hue): 색의 질,노란색,빨간색,파란색..
  • 채도(saturation): 선명도, 원색에 가까울수록 채도가 높음
  • 명도(value): 밝기, 명도가 높을수록 백색에, 낮을수록 흑색에 가까워짐

색상과 명도 범위로 차선 인식

  • hsv.py
import cv2
import numpy as np

img = cv2.imread('cars.png')
hsv = cv2.cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_white = np.array([0,0,150]) # H(색상): 0-179 S(채도): 0-255 V(명도): 150-255
upper_white = np.array([179,255,255])

mask = cv2.inRange(hsv,lower_white,upper_white) # 범위에 포함되는 픽셀들은 흰색(255)으로, 그 외의 픽셀들은 검은색(0)으로 이진화한 grayscale 이미지를 만들어냄

cv2.imshow('line',mask)
cv2.waitKey(10000)

명도 범위의 조정

  • V(명도) 범위를 조정해서 차선을 분리할 수 있다.
    • 차선의 색상 또는 주변 밝기에 따라 범위 지정값은 달라져야 한다.

동영상 파일 읽어서 표시하기

  • 동영상 - 정지 이미지가 시간에 따라 바뀌며 나타나는 것
    • 영화는 여러 장의 사진을 연속으로 보여주는 것
    • 빠르게 이미지를 보여주면 사람 눈은 이걸 움직이는 그림으로 인식함
  • 프레임(frame)
    • 동영상 내에서 한장 한장의 그림을 프레임이라고 부름
    • 얼마나 빠르게 다음 그림을 보여주는가 - fps(frames per second)
  • 카메라의 영상 입력을 일정한 시간 간격으로 캡처하면 이것이 동영상
    • 우리의 자율주행 알고리즘에서는 프레임 단위의 이미지를 분석하여 주행제어를 결정하게 됨

동영상 파일 읽어 들여 표시하기

  • video.py
import cv2

vid = cv2.VideoCapture('small.avi')

while True:
    ret,frame = vid.read()
    if not ret:
        break
    # frame = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) # 주석처리를 해제하면 동영상이 흑백으로 보인다.
    if ret:
        cv2.imshow('video',frame)
    if cv2.waitKey(1) > 0:
        break
vid.release()
cv2.destroyAllWindows()

동영상 재생 vs 카메라 입력 처리

  • 동영상 = 사진을 연속적으로 표시
    • 다수의 frame 사진을 연속적으로 표시하는 원리
  • 카메라 영상 표시와 동영상 파일 재생의 차이
    • 카메라로부터 영상정보를 받아 표시하는 것과
    • 동영상 파일을 열어 재생하는 것은 동일한 작업
  • 카메라 영상(동영상 파일)표시
    • Video Caputre 오브젝트를 생성하고
    • 카메라 디바이스 또는 동영상 파일을 열고
    • 순환문을 반복하면서 frame을 읽어들이고
    • 읽은 프레임을 변환해서 화면에 표시하고
    • 영상 재생이 끝나면 VideoCapture 오브젝트를 릴리즈
    • 윈도우 닫기

카메라/파일 영상 표시 방법

  • 카메라 입력을 받는 것과동영상 파일을 읽어 처리하는 과정은 동일하다
    실제 자율주행에선.. > 실제 자율주행 프로그램에선 #image를 Grayscale로 변환 대신 frame을 hsv처리 한 후 차선을 찾아서 그 차선의 위치를 계산을 한 후에 핸들을 얼마나 꺽을지 모터에 보낸 후 핸들을 꺽는다. 그 다음장을 받아선, 차선이 이렇게 움직이니 핸들을 조금 풀어야겠다 라는 계산을 한 후에 모터쪽에 명령을 보내고 그 다음장 계산을 반복한다.

0개의 댓글