오늘은 논문 해석이 아닌 제가 공부한 교재에 대한 연습 문제에 대해 작성하려고 합니다. 문제를 보면 주관적인 생각을 요구하는 문제가 있습니다. 이 부분은 보통 제외하고 나머지 연습 문제에 대해서만 답안을 작성해 보겠습니다. 중간에 보시다가 질문이 생기시면 언제든 댓글
달아주세요!
Chapter 02 OpenCV로 시작하는 컴퓨터 비전
01 [프로그램 2-1]의 03행을 a=np.array([400, 52, 'tiger', '24', 230])으로 바꾸어 정수와 문자열을 혼합하여 어떤 일이 벌어지는지
실험하고 파이썬이 이 경우를 어떻게 해석하는지 설명하시오.
import numpy as np
a = np.array([400, 52, 'tiger', '24', 230])
print(a) # ['400' '52' 'tiger' '24' '230']
print(type(a)) # <class 'numpy.ndarray'>
print(a.shape) # (5,)
a.sort() # 정렬
print(a) # ['230' '24' '400' '52' 'tiger']
정답: 모두 문자열로 인식
02 np.ndarry 객체는 min, max, argmin, argmax, mean, sum, cumsum, prod, cumprod라는 멤버 함수를 가진다.
- 이 함수들이 각각 무엇을 하는지 조사하시오.
정답: min: 최솟값, max: 최댓값, argmin: 최솟값의 인덱스, argmax: 최댓값의 인덱스, mean: 평균, sum: 모든 값의 합,
cumsum: 배열의 누적합, prod: 모든 원소의 곱, cumprod: 누적 곱 - 10개가량의 실수를 가진 np.ndarray 객체를 만든 다음 이 객체에 이 함수들을 각각 적용하는 프로그램을 작성하고 조사한 대로 동작하는지 확인하시오.
정답: 아래 코드 참고 부탁드립니다.
import numpy as np
list2 = [1.1,2.1,3.1,4.1,5.1,6.1,7.1,8.1,9.1,10.1]
a = np.array(list2)
print(f"{a.min()}\n{a.max()}\n{a.argmax()}\n{a.mean()}\n{a.sum()}\n{a.cumsum()}\n{a.prod()}\n{a.cumsum()}")
"""
1.1
10.1
9
5.6
56.0
[ 1.1 3.2 6.3 10.4 15.5 21.6 28.7 36.8 45.9 56. ]
4827960.133151254
[ 1.1 3.2 6.3 10.4 15.5 21.6 28.7 36.8 45.9 56. ]
"""
03 [프로그램 2-2]를 서로 다른 영상 2개를 읽어 각각 img1과 img2에 저장하고 서로 다른 윈도우에 디스플레이하는 프로그램으로 확장하시오.
정답: 아래 코드를 참고 부탁드립니다.
import cv2 as cv
import sys
img1 = cv.imread('soccer.jpg')
img2 = cv.imread('apple.jpeg')
if img1 is None or img2 is None:
sys.exit('파일을 찾을 수 없습니다.')
cv.imshow("soccer", img1)
cv.imshow('apple',img2)
cv.waitKey()
cv.destroyAllWindows()
풀이 순서: 1. imread(' ') 각자 생성한다. 2. imshow() 출력, 3. waitKey(), 4.destroyAllWindows()
04 [프로그램 2-4]를 사용자가 중간에 'g'를 입력하면 명암 영상을 디스플레이하고 'c'를 입력하면 컬러 영상을 디스플레이하도록 확장하시오.
정답: 아래 코드를 참고 부탁드립니다.
import cv2 as cv
import sys
cap = cv.VideoCapture(0, cv.CAP_DSHOW)
color_mode = "color"
if not cap.isOpened():
sys.exit("카메라 연결 실패")
while True:
ret, frame = cap.read()
if not ret:
print("프레임 획득 실패")
break
if color_mode == 'gray':
frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
cv.imshow('video display', frame_gray)
else:
cv.imshow('Video Display',frame)
key = cv.waitKey(1)
if key == ord('q'):
break
elif key == ord('g'):
color_mode = 'gray'
elif key == ord('c'):
color_mode = 'color'
cap.release()
cv.destroyAllWindows()
06 [프로그램 2-6]은 직사각형 왼쪽 위에 'laugh'라 써넣었다. 'laugh'를 직사각형에서 조금 떨어뜨려 표시하고 'laugh' 문자열이 화살표로 직사각형을 가리키도록 수정하시오.
정답: 아래 코드를 참고 부탁드립니다.
import cv2 as cv
import sys
img = cv.imread('mistyroad.jpeg')
if img is None:
sys.exit("파일을 찾을 수 없습니다.")
cv.rectangle(img, (430,30), (600,100), (0,0,255), 2)
cv.putText(img, 'laugh',(330,24), cv.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2) # 글씨 쓰기
cv.arrowedLine(img, (330, 24), (430,30), (255,0,0), 2)
cv.imshow('Draw', img)
cv.waitKey()
cv.destroyAllWindows()
풀이 해석 : arrowedLine(이미지, 화살표 시작점, 화살표 끝 점, 색상, 두께)
07 [프로그램 2-7]을 왼쪽 버튼을 클릭하면 직사각형, 오른쪽 버튼을 클릭하면 원이 그려지도록 확장하시오.
정답: 아래 코드를 참고 부탁드립니다.
import cv2 as cv
import sys
img = cv.imread('mistyroad.jpeg')
if img is None:
sys.exit("파일을 찾을 수 없습니다.")
def draw(event, x,y,flags,param):
if event == cv.EVENT_LBUTTONDOWN:
cv.rectangle(img,(x,y), (x+200,y+200),(0,0,255),2)
elif event == cv.EVENT_RBUTTONDOWN:
cv.circle(img,(x,y),50,(0,255,0),2)
cv.imshow('Drawing', img)
cv.namedWindow('Drawing')
cv.imshow('Drawing',img)
cv.setMouseCallback('Drawing',draw)
while(True):
if cv.waitKey(1) == ord('q'):
cv.destroyAllWindows()
break
08 [프로그램 2-8]을 왼쪽 버튼은 이전처럼 직사각형을 그리고 오른쪽 버튼은 원을 그리도록 확장하시오. 오른쪽 버튼을 클릭한 곳이
원의 중심이고 오른쪽 버튼을 놓은 곳이 원주다.
정답: 아래 코드를 참고 부탁드립니다.
import math
import cv2 as cv
import sys
img = cv.imread('img/mistyroad.jpeg')
if img is None:
sys.exit('파일을 찾을 수 없습니다.')
def draw(event, x,y,flags,param):
global ix, iy
if event == cv.EVENT_LBUTTONDOWN:
cv.rectangle(img,(x,y),(x+200,y+200),(0,0,255),2)
elif event == cv.EVENT_LBUTTONUP:
ix,iy = x,y
elif event == cv.EVENT_RBUTTONDOWN:
ix,iy = x,y
elif event == cv.EVENT_RBUTTONUP:
cv.circle(img, (ix,iy), int(math.sqrt((x-ix)**2 + (y-iy)**2)),(0,255,0),2)
cv.imshow('Drawing', img)
cv.namedWindow('Drawing')
cv.imshow('Drawing', img)
cv.setMouseCallback('Drawing', draw)
while True :
if cv.waitKey(1) == ord('q'):
cv.destroyAllWindows()
break
09 [프로그램 2-9]를 +를 누르면 붓이 크기가 1만큼 커지고 -를 누르면 붓의 크기가 1만큼 작아지게 확장하시오.
정답: 아래 코드를 참고 부탁드립니다.
import cv2 as cv
import sys
img = cv.imread('mistyroad.jpeg')
if img is None:
sys.exit('파일을 찾을 수 없습니다.')
BrushSiz = 5
LColor, RColor = (255,0,0), (0,0,255)
def painting(event, x, y, flags, param):
if event == cv.EVENT_LBUTTONDOWN:
cv.circle(img, (x,y), BrushSiz,LColor, -1)
elif event == cv.EVENT_RBUTTONDOWN:
cv.circle(img,(x,y),BrushSiz, RColor, -1)
elif event == cv.EVENT_MOUSEMOVE and flags == cv.EVENT_FLAG_LBUTTON:
cv.circle(img,(x,y), BrushSiz, LColor, -1)
elif event == cv.EVENT_MOUSEMOVE and flags == cv.EVENT_FLAG_RBUTTON:
cv.circle(img, (x,y), BrushSiz, RColor, -1)
cv.imshow('Painting', img)
cv.namedWindow('Painting')
cv.imshow('Painting', img)
cv.setMouseCallback('Painting', painting)
while True:
if cv.waitKey(1) == ord('q'):
cv.destroyAllWindows()
break
elif cv.waitKey(1) == ord('+'):
BrushSiz += 1
elif cv.waitKey(1) == ord('-'):
if BrushSiz > 1:
BrushSiz -= 1
'공부(연습문제 정답) > 컴퓨터 비전과 딥러닝' 카테고리의 다른 글
[5장]컴퓨터 비전과 딥러닝: 지역 특징 (4) | 2024.10.25 |
---|---|
[4장]컴퓨터 비전과 딥러닝 : 에지와 영역 (4) | 2024.09.19 |
[3장] 컴퓨터 비전과 딥러닝 : 영상처리 (5) | 2024.09.19 |