[배울랑교 AI] 컴퓨터 비전 기능을 구현

2024. 11. 27. 10:17컴퓨터비전&AI

반응형

윈도우 생성

import numpy as np # numpy 라이브러리를 np라는 이름으로 사용

import cv2 # opencv 라이브러리를 사용

image = np.zeros((300, 400), np.uint8) # 300 x 400 행렬생성, 8비트 부호없는 정수형

image.fill(200) # 밝은 회색으로 바탕 채우기

cv2.imshow("Window title", image) # imshow(윈도우이름, 행렬영상), 영상보기

cv2.waitKey(0) # 키 입력시까지 윈도우 대기

cv2.destroyAllWindows() # 키 입력후에 윈도우 닫기

 

2. 윈도우 크기 변경

image = np.zeros((200, 300), np.uint8) # 200 x 400 행렬생성, 8비트 부호없는 정수형

image.fill(255) # image[:] = 255, 흰색으로 바탕 채우기

title1, title2 = 'AUTOSIZE', 'NORMAL' # 윈도우 이름을 변수로 지정

cv2.namedWindow(title1, cv2.WINDOW_AUTOSIZE) # 윈도우생성 → 윈도우 크기 변경 불가

cv2.namedWindow(title2, cv2.WINDOW_NORMAL) # 윈도우생성 → 윈도우 크기 변경 가능

cv2.imshow(title1, image) # imshow(윈도우이름, 행렬영상), 영상보기

cv2.imshow(title2, image) # imshow(윈도우이름, 행렬영상), 영상보기

cv2.resizeWindow(title1, 400, 300) # 윈도우크기 변경, 400 x 300

cv2.resizeWindow(title2, 400, 300) # 윈도우크기 변경, 400 x 300

cv2.waitKey(0) # 키 입력시까지 윈도우 대기

cv2.destroyAllWindows()

 

3-1 마우스 이벤트 사용

def onMouse(event, x, y, flags, param):

if event == cv2.EVENT_LBUTTONDOWN:

print("마우스 왼쪽 버튼 누르기")

elif event == cv2.EVENT_RBUTTONDOWN:

print("마우스 오른쪽 버튼 누르기")

elif event == cv2.EVENT_RBUTTONUP:

print("마우스 오른쪽 버튼 떼기")

elif event == cv2.EVENT_LBUTTONDBLCLK:

print("마우스 왼쪽 버튼 더블클릭")

image = np.full((200, 300), 255, np.uint8)

title1, title2 = "Mouse Event1", "Mouse Event2"

cv2.imshow(title1, image)

cv2.imshow(title2, image)

cv2.setMouseCallback('Mouse Event1', onMouse)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

 

3-2 마우스 이벤트 사용

def onMouse(event, x, y, flags, param):

if event == cv2.EVENT_LBUTTONDOWN:

print("마우스 왼쪽 버튼 누르기 좌표 -> x:{}, y:{}".format(x,y)) # “{} {}”.format(변수1, 변수2)

elif event == cv2.EVENT_RBUTTONDOWN:

print("마우스 오른쪽 버튼 누르기 좌표 -> x:{}, y:{}".format(x,y))

elif event == cv2.EVENT_LBUTTONUP:

print("마우스 왼쪽 버튼 떼기 좌표 -> x:{}, y:{}".format(x,y))

elif event == cv2.EVENT_RBUTTONUP:

print("마우스 오른쪽 버튼 떼기 좌표 -> x:{}, y:{}".format(x,y))

elif event == cv2.EVENT_LBUTTONDBLCLK:

print("마우스 왼쪽 버튼 더블클릭 좌표 -> x:{}, y:{}".format(x,y))

elif event == cv2.EVENT_MOUSEWHEEL:

print("마우스 휠 좌표 -> x:{}, y:{}".format(x,y))

elif event == cv2.EVENT_MOUSEHWHEEL:

print("마우스 가로휠 좌표 -> x:{}, y:{}".format(x,y))

image = np.full((200, 300), 255, np.uint8)

title1, title2 = "Mouse Event1","Mouse Event2"

cv2.imshow(title1, image)

cv2.imshow(title2, image)

cv2.setMouseCallback('Mouse Event1', onMouse)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

 

 

 

4. 직선 & 사각형 그리기

blue, green, red = (255, 0, 0), (0, 255, 0), (0, 0, 255)

image = np.zeros((400, 600), np.uint8)

image[:] = 255

pt1, pt2 = (50, 50), (250, 150)

pt3, pt4 = (400, 150), (500, 50)

roi = 50, 200, 200, 100

cv2.line(image, pt1, pt2, red)

cv2.line(image, pt3, pt4, green, 3, cv2.LINE_AA)

cv2.rectangle(image, pt1, pt2, blue, 3, cv2.LINE_4)

cv2.rectangle(image, roi, red, 3, cv2.LINE_8)

cv2.rectangle(image, (400, 200, 100, 100), green, cv2.FILLED)

cv2.imshow('Line & Rectangle', image)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

 

 

4-2 직선 & 사각형 그리기

blue, green, red = (255, 0, 0), (0, 255, 0), (0, 0, 255)

image = np.zeros((400,600,3),np.uint8) #기존 gray 채널은 2차원구조 , 3차원으로 rgb 채널을 추가함

image[:] = 255

pt1, pt2 = (50, 50), (250, 150)

pt3, pt4 = (400, 150), (500, 50)

roi = 50, 200, 200, 100

cv2.line(image, pt1, pt2, red)

cv2.line(image, pt3, pt4, green, 3, cv2.LINE_AA)

cv2.rectangle(image, pt1, pt2, blue, 3, cv2.LINE_4)

cv2.rectangle(image, roi, red, 3, cv2.LINE_8)

cv2.rectangle(image, (400, 200, 100, 100), green, cv2.FILLED)

cv2.imshow('Line & Rectangle', image)

cv2.waitKey(0)

cv2.destroyAllWindows()

1차원 - 파 : 흰색 초 : 검은색 빨 : 검은색

 

 

 

5. 글자 쓰기

olive, violet, brown = (128, 128, 0), (221, 160, 221), (42, 42, 165)

pt1, pt2 = (50, 200), (50, 260) # p1,p3 좌표

image = np.zeros((300, 500, 3), np.uint8)

image.fill(255)#배경색

cv2.putText(image, "SIMPLEX", (50, 50) ,#시작 좌표

cv2.FONT_HERSHEY_SIMPLEX, 2, brown) #중간 크기의 산세리프 폰트

cv2.putText(image, "DUPLEX" , (50, 130),

cv2.FONT_HERSHEY_DUPLEX , 3, olive) #2줄 산세리프 폰트

cv2.putText(image, "TRIPLEX", pt1,

cv2.FONT_HERSHEY_TRIPLEX, 2, violet) #3줄 산세리프 폰트

fontFace = cv2.FONT_HERSHEY_PLAIN + cv2.FONT_ITALIC #폰트 합체

cv2.putText(image, "ITALIC" , pt2, fontFace, 4, violet)

cv2.imshow("Put Text", image)

cv2.waitKey(0)

 

6. 원 그리기

img = np.zeros((500, 700, 3), np.uint8)

img.fill(255)

#cv2.circle(img, center, 반지름, color, thickness, lineType)

cv2.circle(img, (100, 250), 40, (0,0,255), -1)

cv2.circle(img, (150, 250), 60, (0,127,255), -1)

cv2.circle(img, (210, 250), 80, (0,255,255), -1)

cv2.circle(img, (270, 250), 100, (0,255,0), -1)

cv2.circle(img, (330, 250), 120, (255,0,0), -1)

cv2.circle(img, (390, 250), 140, (128,0,0), -1)

cv2.circle(img, (450, 250), 160, (255,0,139), -1)

font = cv2.FONT_HERSHEY_TRIPLEX + cv2.FONT_ITALIC #글씨체

#(IMG, 글자, 좌표, 글자크기, 색 )

cv2.putText(img, "r", (100, 50), font, 1, (0,0,255))

cv2.putText(img, "o", (150, 50), font, 1, (0,127,255))

cv2.putText(img, "y", (210, 50), font, 1, (0,255,255))

cv2.putText(img, "g", (270, 50), font, 1, (0,255,0))

cv2.putText(img, "b", (330, 50), font, 1, (255,0,0))

cv2.putText(img, "n", (390, 50), font, 1, (128,0,0))

cv2.putText(img, "p", (450, 50), font, 1, (255,0,139))

cv2.imshow('circle', img) #윈도우 제목과 img 출력시킴

cv2.waitKey(0)

cv2.destroyAllWindows()

 

 

7. 타원 및 호 그리기

orange, blue, white = (0, 165, 255), (255, 0, 0), (255,255,255)

image = np.full((300, 700, 3), white, np.uint8)

pt1, pt2 = (180, 150), (550, 150) # center

size = (120, 60) #장축 , 단축

#cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness, lineType)

cv2.circle(image, pt1, 1, 0, 2) #cv2.ellipse(img, center, 반지름, 시작, 선의 두께 )

cv2.circle(image, pt2, 1, 0, 2)

cv2.ellipse(image, pt1, size, 0, 0, 360, blue, 1)#cv2.ellipse(img, center, 장축단축, 반지름, 시작기준, 찐 시작 점, 작성각도, 색, 선의 두께 )

cv2.ellipse(image, pt1, size, 0, 30, 270, orange, 4)

cv2.ellipse(image, pt2, size, 90, 0, 360, blue, 1)# 시작기준을 90으로 해서 x,y축 바뀜

cv2.ellipse(image, pt2, size, 90, -45, 90, orange, 4)

cv2.imshow("Draw Eclipse & Arc", image)

cv2.waitKey()

cv2.destroyAllWindows()

 

 

 

 

 

. 태극기 그리다가 말기

red=(0, 0, 255)

blue=(255, 0, 0)

black=(0, 0, 0)

center=(150, 100)

left_center=(129, 88)

right_center=(171, 112)

image = np.zeros((200, 300, 3), np.uint8)

image[:] = 255

pt1, pt2 = (30, 60), (80, 20)

cv2.line(image, pt1, pt2, black, 4)

pt3, pt4 = (40, 70), (90, 30)

cv2.line(image, pt3, pt4, black, 4)

pt5, pt6 = (50, 80), (100, 40)

cv2.line(image, pt5, pt6, black, 4)

pt7, pt8 = (220,20), (245, 40)

cv2.line(image, pt7, pt8, black, 4)

pt3, pt4 = (210, 30), (260, 70)

cv2.line(image, pt3, pt4, black, 4)

pt5, pt6 = (50, 80), (100, 40)

cv2.line(image, pt5, pt6, black, 4)

cv2.ellipse(image, center, (50, 50), 210, 0, 180, red, -1)

cv2.ellipse(image, center, (50, 50), 30, 0, 180, blue, -1)

cv2.ellipse(image, left_center, (25, 25), 0, 0, 360, red, -1)

cv2.ellipse(image, right_center, (25, 25), 0, 0, 360, blue, -1)

cv2.namedWindow('korea', cv2.WINDOW_NORMAL)

cv2.imshow('korea', image)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

 

 

 

 

9. 동영상 프레임 읽기

cap = cv2.VideoCapture('Images/Cat.mp4')

 

if not cap.isOpened():

print("Camera open failed!")

exit()

print('Frame width:', int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))#프레임 너비

print('Frame height:', int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))#프레임 높이

print('Frame count:', int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))#동영상 파일 총 프레임 수

print('FPS:', cap.get(cv2.CAP_PROP_FPS))#초당 프레임 수

cv2.namedWindow("frame", cv2.WINDOW_NORMAL)

cv2.resizeWindow("frame", 1280, 720)

while True: # 무한 반복

ret, frame = cap.read() # 프레임 읽기, ret=Ture → 읽기 성공

if ret == False:

break

cv2.imshow('frame', frame)

if cv2.waitKey(10) == 27: # 아스키코드 → ESC

break

cap.release() # 캡처 반납

cv2.destroyAllWindows() # 윈도우 닫기

 

9-2. 동영상 프레임 읽기

cap = cv2.VideoCapture('Images/Cat.mp4')

if not cap.isOpened():

print("Camera open failed!")

exit()

def put_string(frame, text, pt, value, color=(120, 200, 90)):

text += str(value)

shade = (pt[0] + 2, pt[1] + 2)

font = cv2.FONT_HERSHEY_SIMPLEX

cv2.putText(frame, text, shade, font, 2, (0, 0, 0), 2)

cv2.putText(frame, text, pt, font, 2, (120, 200, 90), 2)

cv2.namedWindow("frame", cv2.WINDOW_NORMAL)

cv2.resizeWindow("frame", 1280, 720)

while True:

ret, frame = cap.read()

if ret == False:

break

W = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))

H = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

C = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

F = round(cap.get(cv2.CAP_PROP_FPS), 3)

put_string(frame, "Width: ", (850, 50), W)

put_string(frame, "Height: ", (850, 100), H)

put_string(frame, "Count: ", (850, 150), C)

put_string(frame, "FPS: ", (850, 200), F)

cv2.imshow('frame', frame)

if cv2.waitKey(10) == 27:

break

cap.release()

cv2.destroyAllWindows()

 

 

 

 

 

 

반응형