오늘은 openCV에서 지원하는 Draw Function들에 대해서 공부해보자 :D
0. Coordinate_system
openCV에서는 이미지를 사용할때 numpy 배열에 담겨서 픽셀화가 된다.
픽셀화가 되기 때문에 저번에 이미지 연산 파트에서 다뤘던거처럼
각 좌표에 접근이 가능해진다.
2021/02/02 - [openCV] - [ openCV ] Image Operation ( Blending, Operate Image Bit, ROI )
위 사진에서 볼 수 있듯이 왼쪽 위가 원점 (0,0)이며
왼쪽으로 갈 수록 x좌표가 증가하며
밑으로 갈 수록 y좌표가 증가한다.
1. Using Random Color
위에서 이미지 픽셀에 대한 간단한 개념을 다뤘으니
각 좌표에 접근하여 색을 랜덤으로 대입해주는 코드를 작성해보면서
openCV의 좌표에 익숙해져보자
import cv2
import numpy as np
from random import randint
#set width, height
width = 640
height = 480
#make the numpy array
#Argument = width, height, channel
img = np.zeros((width, height, 3), np.uint8)
#bring in h,w,channel
img_h = img.shape[0]
img_w = img.shape[1]
img_bpp = img.shape[2]
print(img_h, img_w, img_bpp)
for y in range(img_h):
for x in range(img_w):
#change the color by random
img.itemset(y, x, 0, randint(0, 255)) #b
img.itemset(y, x, 1, randint(0, 255)) #g
img.itemset(y, x, 2, randint(0, 255)) #r
while True:
cv2.imshow("Random Color", img)
key = cv2.waitKey(1)
if key == 27:
break
cv2.destroyAllWindows()
하나하나 살펴보자
#set width, height
width = 640
height = 480
이미지의 width, height를 정해준다.
#make the numpy array
#Argument = width, height, channel
img = np.zeros((width, height, 3), np.uint8)
앞서 말했듯 openCV에서 이미지를 사용할때 numpy arrary에 담기게 된다.
그 말은 우리가 직접 numpy array를 생성한다면 img가 생성이 된다는 말과 같다.
그래서 np.zeros()를 이용하여서 아까 지정한 width, height값과 이미지 채널을 지정하여서
numpy array를 생성해줬다.
참고로 이미지 채널은 이미지의 색상 정보를 의미한다.
채널이 1인 경우에는 단색이미지이며
채널이 3인 경우는 다색이미지이다.
#bring in h,w,channel
img_h = img.shape[0]
img_w = img.shape[1]
img_bpp = img.shape[2]
이미지의 h, w, channel의 정보를 가져오는것이다.
for y in range(img_h):
for x in range(img_w):
#change the color by random
img.itemset(y, x, 0, randint(0, 255)) #b
img.itemset(y, x, 1, randint(0, 255)) #g
img.itemset(y, x, 2, randint(0, 255)) #r
반복문을 돌리며 itemset을 이용해서 0 ~ 255사이의 색상을 적용해준다.
[ Result ]
픽셀마다 랜덤한 색상이 들어가있어서 조금 사진이 난잡하다.
2. Draw_rectangle
openCV에서 사각형을 그릴 때 cv2.rectangle()을 이용한다.
cv2.rectangle(img, position1, position2, color, thickness)
img = 사각형을 그릴 이미지
position1 = 사각형의 왼쪽 상단 좌표
position2 = 사각형의 오른쪽 하단 좌표
color = 사각형의 색깔 ( BGR로 지정 )
thickness = 사각형의 선의 두께 ( -1이면 내부가 채워짐 )
rectangle을 그리는 간단한 코드를 살펴보자
import numpy as np
import cv2
width = 640
height = 480
bpp = 3
img = np.zeros((width, height,bpp), np.uint8)
cv2.rectangle(img, (50,50), (450,450), (0,0,255),3)
cv2.rectangle(img, (150, 200), (250, 300), (0, 255, 0), -1)
cv2.imshow("rectangle", img)
cv2.waitKey(0)
rectangle을 그리는 부분만 간략히 살펴보자면
cv2.rectangle(img, (50,50), (450,450), (0,0,255),3)
img위 왼쪽 위 좌표인(50,50)과
오른쪽 밑 좌표인 (450, 450)을 잡아줘
선 두께가 3인 빨간색 rectangle을 그립니다.
cv2.rectangle(img, (150, 200), (250, 300), (0, 255, 0), -1)
이 코드 역시 (150,200) , (250, 300)을 잡고
속이 채워진 초록색 사각형을 그린다.
[ Result ]
3. Draw_circle
openCV에서 원을 그릴때 cv2.circle()이라는 함수를 지원한다.
cv2.circle(img, center_position, radius, BGR, thickness)
img = 원을 그릴 이미지
center_position = 원의 중점
radius = 원의 반지름
BGR = 원의 색상 지정
thickness = 원의 선 두께 ( -1이면 안이 채워짐 )
바로 코드를 살펴봅시다.
import cv2
import numpy as np
width = 640
height = 480
img = np.zeros((width, height, 3), np.uint8)
cv2.circle(img,(320, 240), 10, (0,255,0), -1)
cv2.circle(img, (320, 420), 100, (0,0,255), 1)
cv2.imshow("circle", img)
cv2.waitKey(0)
하나만 살펴보자면
cv2.circle(img,(320, 240), 10, (0,255,0), -1)
img위에 중심점이 (320,240)이며 반지름이 10인
속이 채워진 초록색 원을 그리겠다는 얘기입니다.
[ Result ]
4. Draw_Line
openCV에서 선을 그릴 때 cv2.line() 함수를 이용한다.
cv2.line(img, Start_Position, Final_Position, color, thickness)
img = 선을 그릴 이미지
Start_Position = 선이 시작되는 좌표
Final_Position = 선이 끝나는 좌표
color = BGR값으로 선의 색상 지정
thickness = 선의 두께 굵기
코드를 살펴보면
import numpy as np
import cv2 as cv
width = 640
height = 480
bpp = 3
img = np.zeros((height, width, bpp), np.uint8)
cv.line(img, (width, 0), (0, height), (0, 255, 0), 3)
cv.line(img, (0, 0), (width, height), (0, 0, 255), 3)
print(width - 1)
cv.imshow("result", img)
cv.waitKey(0);
좌표가 조금 난해하긴 한데 하나하나 보면
cv.line(img, (width, 0), (0, height), (0, 255, 0), 3)
시작 좌표 : (width , 0) -> 상단 오른쪽
끝나는 좌표 : (0, height) -> 하단 왼쪽
선 두께가 3인 초록색 선분
cv.line(img, (0, 0), (width, height), (0, 0, 255), 3)
시작 좌표 : (0, 0) -> 상단 왼쪽
끝나는 좌표 : (width, height) -> 하단 오른쪽
선 두께가 3인 빨간색 선분
[ Result ]
오늘은 여기서 끄-읕😏
'openCV' 카테고리의 다른 글
[openCV] Image Geometric Transformation (1) (0) | 2021.02.20 |
---|---|
[openCV] ROI (0) | 2021.02.17 |
[ openCV ] Image Operation ( Blending, Operate Image Bit, ROI ) (0) | 2021.02.02 |
[openCV] Binarization (0) | 2021.01.23 |
[openCV] Graphic User Interface (0) | 2021.01.16 |