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()
'컴퓨터비전&AI' 카테고리의 다른 글
[배울랑교AI] 영상 처리 (0) | 2024.11.27 |
---|---|
[AI배울랑교] 컴퓨터 비전 (2) | 2024.11.27 |
[AI 과제] 회귀 및 분류 모델을 통한 데이터 분석 및 시각화 (0) | 2024.11.27 |
[AI 과제] 농구 선수 데이터셋 학습을 통해 포지션을 예측하는 모델, 크롤링 (3) | 2024.11.27 |
[AI 배울랑교] 2. 초연결 (2) | 2024.11.27 |