본문 바로가기
공부(연습문제 정답)/컴퓨터 비전과 딥러닝

[2장]컴퓨터 비전과 딥러닝: OpenCV로 시작하는 컴퓨터 비전

by lovedeveloping 2024. 9. 18.
반응형

컴퓨터 비전과 딥러닝
컴퓨터 비전과 딥러닝

오늘은 논문 해석이 아닌 제가 공부한 교재에 대한 연습 문제에 대해 작성하려고 합니다. 문제를 보면 주관적인 생각을 요구하는 문제가 있습니다. 이 부분은 보통 제외하고 나머지 연습 문제에 대해서만 답안을 작성해 보겠습니다. 중간에 보시다가 질문이 생기시면 언제든 댓글

달아주세요!

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라는 멤버 함수를 가진다.

  1.  이 함수들이 각각 무엇을 하는지 조사하시오.
    정답: min: 최솟값, max: 최댓값, argmin: 최솟값의 인덱스, argmax: 최댓값의 인덱스, mean: 평균, sum: 모든 값의 합,
    cumsum: 배열의 누적합, prod: 모든 원소의 곱, cumprod: 누적 곱
  2. 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
반응형