OpenCV : 인텔 사에서 만든 컴퓨터 비전 라이브러리, C와 C++로 개발됨
# ex.2-2
import cv2 as cv # cv2 모듈 불러와 cv 이름 부여
import sys # exit 함수 쓰기 위해 불러옴
img=cv.imread('soccer.jpg') # 영상 읽기
if img is None: # 파일이 없거나 읽는 도중 오류 발생하면
sys.exit('파일을 찾을 수 없습니다.') # 오류 메시지 출력
cv.imshow('Image Display',img) # 윈도우에 영상 표시
cv.waitKey()
cv.destroyAllWindows()
import cv2 as cv
import sys
img=cv.imread('soccer.jpg')
if img is None:
sys.exit('파일을 찾을 수 없습니다.')
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY) # BGR 컬러 영상을 명암 영상으로 변환
gray_small=cv.resize(gray,dsize=(0,0),fx=0.5,fy=0.5) # 크기 반으로 축소
cv.imwrite('soccer_gray.jpg',gray) # 영상을 파일에 저장
cv.imwrite('soccer_gray_small.jpg',gray)
cv.imshow('Color image',img)
cv.imshow('Gray image',gray)
cv.imshow('Gray image small',gray_small)
cv.waitKey()
cv.destroyAllWindows()
output image
import cv2 as cv
import sys
cap = cv.VideoCapture(0,cv.CAP_DSHOW) # 카메라와 연결 시도
if not cap.isOpened():
sys.exit('카메라 연결 실패')
while True:
ret, frame = cap.read() # 비디오를 구성하는 프레임 획득
if not ret:
print('프레임 획득에 실패하여 루프를 나갑니다.')
break
cv.imshow('Video display', frame)
key = cv.waitKey(1) # 1밀리초 동안 키보드 입력 기다림
if key==ord('q'): # 'q' 키가 들어오면 루프를 빠져나감
break
cap.release() # 카메라와 연결을 끊음
cv.destroyAllWindows()
1) VideoCapture 함수 : 웹 캠과 연결 시도함
2) while문으로 동영상 입력
3) 윈도우에 획득한 영상을 지정한 시간 간격마다 디스플레이
import cv2 as cv
import numpy as np
import sys
cap = cv.VideoCapture(0,cv.CAP_DSHOW) # 카메라와 연결 시도
if not cap.isOpened():
sys.exit('카메라 연결 실패')
frames=[]
while True:
ret, frame = cap.read() # 비디오를 구성하는 프레임 획득
if not ret:
print('프레임 획득에 실패하여 루프를 나갑니다.')
break
cv.imshow('Video display', frame)
key = cv.waitKey(1) # 1밀리초 동안 키보드 입력 기다림
if key==ord('c'): # 'c' 키가 들어오면 프레임을 리스트에 추가
frames.append(frame)
elif key==ord('q'): # 'q' 키가 들어오면 루프를 빠져나감
break
cap.release() # 카메라와 연결을 끊음
cv.destroyAllWindows()
if len(frames)>0: # 수집된 영상이 있으면
imgs=frames[0]
for i in range(1,min(3,len(frames))): # 최대 3개까지 이어 붙임
imgs=np.hstack((imgs, len(frames[i])))
cv.imshow('collected images', imgs)
cv.waitKey()
cv.destroyAllWindows()
import cv2 as cv
import sys
img=cv.imread('soccer.jpg')
if img is None:
sys.exit('파일을 찾을 수 없습니다.')
cv.rectangle(img,(830,30),(1000,200),(0,0,255),2) # 빨간색, 선의 두께 2인 직사각형 그리기
cv.putText(img,'LeeGangIn',(830,24),cv.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2) # 글씨 쓰기
cv.imshow('Draw',img)
cv.waitKey()
cv.destroyAllWindows()
import cv2 as cv
import sys
img=cv.imread('soccer.jpg')
if img is None:
sys.exit('파일을 찾을 수 없습니다.')
# 콜백 함수
def draw(event,x,y,flags,param):
if event==cv.EVENT_FLAG_LBUTTONDOWN: # 마우스 왼쪽 버튼 클릭 시
cv.rectangle(img,(x,y),(x+200,y+200),(0,0,255),2)
elif event==cv.EVENT_FLAG_RBUTTONDOWN: # 마우스 오른쪽 버튼 클릭 시
cv.rectangle(img,(x,y),(x+100,y+100),(255,0,0),2)
cv.imshow('Drawing',img)
cv.namedWindow('Drawing')
cv.imshow('Drawing',img)
cv.setMouseCallback('Drawing',draw) # Drawing 윈도우에 draw 콜백 함수 지정
while(True): # 마우스 이벤트가 언제 발생할지 모르므로 무한 반복
if cv.waitKey(1)==ord('q'):
cv.destroyAllWindows()
break
💡 실행 로직
콜백 함수 - 버튼 클랙했을 때 & 놓았을 때의 좌표 읽어서 직사각형 그리면 됨
import cv2 as cv
import sys
img=cv.imread('soccer.jpg')
if img is None:
sys.exit('파일을 찾을 수 없습니다.')
# 콜백 함수
def draw(event,x,y,flags,param):
global ix,iy
if event==cv.EVENT_LBUTTONDOWN: # 마우스 왼쪽 버튼 클릭 시
ix,iy = x,y
elif event==cv.EVENT_LBUTTONUP: # 마우스 오른쪽 버튼 클릭 시
cv.rectangle(img,(ix,iy),(x,y),(0,0,255),2)
cv.imshow('Drawing',img)
cv.namedWindow('Drawing')
cv.imshow('Drawing',img)
cv.setMouseCallback('Drawing',draw) # Drawing 윈도우에 draw 콜백 함수 지정
while(True): # 마우스 이벤트가 언제 발생할지 모르므로 무한 반복
if cv.waitKey(1)==ord('q'):
cv.destroyAllWindows()
break
import cv2 as cv
import sys
img=cv.imread('soccer.jpg')
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