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라는 이름의 파일로 저장
연습: 사각형 그리기
import cv2
img = cv2.imread('black.png',cv2.IMREAD_COLOR)
img = cv2.rectangle(imt,(100,100),(300,400),(0,255,0),3)
cv2.imshow('black',img)
cv2.waitKey(10000)

이미지에서 흰 점 찾아내기
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): 밝기, 명도가 높을수록 백색에, 낮을수록 흑색에 가까워짐

색상과 명도 범위로 차선 인식
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])
upper_white = np.array([179,255,255])
mask = cv2.inRange(hsv,lower_white,upper_white)
cv2.imshow('line',mask)
cv2.waitKey(10000)

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

동영상 파일 읽어서 표시하기
- 동영상 - 정지 이미지가 시간에 따라 바뀌며 나타나는 것
- 영화는 여러 장의 사진을 연속으로 보여주는 것
- 빠르게 이미지를 보여주면 사람 눈은 이걸 움직이는 그림으로 인식함
- 프레임(frame)
- 동영상 내에서 한장 한장의 그림을 프레임이라고 부름
- 얼마나 빠르게 다음 그림을 보여주는가 - fps(frames per second)
- 카메라의 영상 입력을 일정한 시간 간격으로 캡처하면 이것이 동영상
- 우리의 자율주행 알고리즘에서는 프레임 단위의 이미지를 분석하여 주행제어를 결정하게 됨
동영상 파일 읽어 들여 표시하기
import cv2
vid = cv2.VideoCapture('small.avi')
while True:
ret,frame = vid.read()
if not ret:
break
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처리 한 후 차선을 찾아서 그 차선의 위치를 계산을 한 후에 핸들을 얼마나 꺽을지 모터에 보낸 후 핸들을 꺽는다. 그 다음장을 받아선, 차선이 이렇게 움직이니 핸들을 조금 풀어야겠다 라는 계산을 한 후에 모터쪽에 명령을 보내고 그 다음장 계산을 반복한다.