[ATC] openCV로 이미지, 동영상 출력
파일 읽어오기
이미지 파일을 읽어올때는 cv2.imread(‘파일경로 + 파일명’)로 작성해준다.
imageFile = './data/lena.jpg'
img = cv2.imread(imageFile) # cv2.imread(imageFile, cv2.IMREAD_COLOR)
파일 저장하기
이미지 파일을 저장할때도 마찬가지로 ‘파일경로 + 파일명’으로 경로를 나타낸다.
cv2.imwrite('./data/Lena.bmp', img)
cv2.imwrite('./data/Lena.png', img)
cv2.imwrite('./data/Lena2.png',img, [cv2.IMWRITE_PNG_COMPRESSION, 9])
cv2.imwrite('./data/Lena2.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 90])
컬러 이미지 읽기
opencv는 imread로 컬러 이미지를 읽어오면 컬러순서가 BGR로 읽힌다. 따라서 cvtColor()
함수와 cv2.COLOR_BGRTORGB
옵션을 넣어 컬러 스페이스를 변환해 주어야 한다.
# 컬러로 이미지 읽기
# opencv는 imread로 컬러 이미지를 읽어오면 컬러순서가 BGR
imgBGR = cv2.imread(imageFile) # cv2.IMREAD_COLOR
plt.axis('off')
plt.imshow(imgBGR)
plt.show()
# opencv에서는 컬러 채널의 순서를 바꾸는 라이브러리가 있다.
# cvtColor()는 컬러 스페이스를 변환해주는 함수
# 1st : 입력이미지(igBGR) 2nd : 출력 이미지 포맷BGR
imgRGB = cv2.cvtColor(imgBGR, cv2.COLOR_BGR2RGB)
plt.imshow(imgRGB)
plt.show()
출력 결과
RGB 변환 전 결과
RGB 변환 후 결과
그림에서 볼 수 있는 것과 같이 우선 plt.axis('off')
를 한 첫번째 그림은 축이 표시가 되지 않았고, BGR순서로 읽혔기에 파란빛이 많이 보인다.(원본 사진이 R값이 크기 때문) 따라서, 정확한 이미지를 출력하기 위해 cvtColor함수를 사용해보니 잘 출력된 것을 확인할 수 있다.
GRAYSCALE 이미지 읽기
grayscale은 처음에 파일을 읽어올 때 cv.IMREAD_GRAYSCALE
옵션을 함께 써주면 바로 grayscale로 표현할 수 있다. 하지만 이때도 읽어올때는 RGB값을 BRG순서로 읽어올 것이기 때문에 변환이 필요하다.
imageFile = './data/lena.jpg'
imgGray = cv2.imread(imageFile, cv2.IMREAD_GRAYSCALE)
plt.axis('off')
imgRGB = cv2.cvtColor(imgGray,cv2.COLOR_GRAY2RGB)
plt.imshow(imgGray, cmap = "gray", interpolation='bicubic')
plt.show()
출력 결과
RGB로 변환하지 않은 결과
RGB로 변환한 결과
출력 결과에서 볼 수 있듯이 RGB변환 전 후의 사진이 차이가 있음을 확인할 수 있다.
하나의 창에 여러 이미지 출력하기
하나의 창에 이미지를 여러개 출력할떄는 subplots()
라는 함수를 이용한다. 이때, 괄호 안에 2,2라고 적으면 2행 2열짜리 창이 생성된다.
또한 imshow()
함수의 aspect =
옵션을 보면 ‘None’일때는 이미지가 가지고 있는 고유한 비율을 유지하고, ‘auto’일때는 창의 크기에 따라 자동으로 변한다.
imgBGR1 = cv2.imread(path+'lena.jpg')
imgBGR2 = cv2.imread(path+'apple.jpg')
imgBGR3 = cv2.imread(path+'baboon.jpg')
imgBGR4 = cv2.imread(path+'orange.jpg')
# 컬러 변환: BGR -> RGB
imgRGB1 = cv2.cvtColor(imgBGR1, cv2.COLOR_BGR2RGB)
imgRGB2 = cv2.cvtColor(imgBGR2, cv2.COLOR_BGR2RGB)
imgRGB3 = cv2.cvtColor(imgBGR3, cv2.COLOR_BGR2RGB)
imgRGB4 = cv2.cvtColor(imgBGR4, cv2.COLOR_BGR2RGB)
# 하나의 창에 4개의 이미지를 출력할때는 -> subplots()
# 2,2 2행 2열짜리 창(4개 생성),
# figsize=(4,4) -> 창의 크기는 가로(4) * 세로(4)
fig, ax = plt.subplots(2, 2, figsize=(10,10), sharey=True)
fig.canvas.set_window_title('Sample Pictures')
ax[0][0].axis('off')
# aspect = None은 이미지가 가지고 있는 고유한 비율을 유지한다
ax[0][0].imshow(imgRGB1, aspect = 'auto')
ax[0][1].axis('off')
# aspect = 'auto'는 창의 크기에 따라 변함
ax[0][1].imshow(imgRGB2, aspect = 'auto')
ax[1][0].axis("off")
ax[1][0].imshow(imgRGB3, aspect = "auto")
ax[1][1].axis("off")
ax[1][1].imshow(imgRGB4, aspect = 'auto')
# 창의 여백
plt.subplots_adjust(left=0, bottom=0, right=1, top=1,
wspace=0.05, hspace=0.05)
plt.savefig("./data/0206.png", bbox_inches='tight')
plt.show()
출력 결과
원숭이가 너무 징그럽다,,,,,,,
동영상 읽기
동영상을 읽어올때는 cv2.VideoCapture()
함수를 사용한다.
cap = cv2.VideoCapture('./data/vtest.avi')
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)
# 동영상의 이미지의 width(가로 폭), height(세로 높이)를 확인할 때
frame_size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print('frame_size =', frame_size)
print('total_frame_count=', cap.get(cv2.CAP_PROP_FRAME_COUNT))
fps = cap.get(cv2.CAP_PROP_FPS)
print('fps =', fps)
while True:
# 1st 정상적으로 이미지를 읽었는지 확인,
# 정상적으로 이미지를 가져왔다면 frame에 저장
retval, frame = cap.read() # 프레임 캡처
# 파일에서 정상적으로 이미지를 읽지 못한다면,
# (=동영상 파일을 더 이상 읽어올 프레임이 없을때)
if not retval:
break
cv2.imshow('frame', frame)
key = cv2.waitKey(int(1000/fps))
if key == 27: # Esc
break
if cap.isOpened():
cap.release()
cv2.destroyAllWindows()
만약 카메라를 띄우고 싶다면 cv2.VideoCapture(0)
을 읽어보면 된다.
cap = cv2.VideoCapture(0)
frame_size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print('frame_size =', frame_size)
print('total_frame_count=', cap.get(cv2.CAP_PROP_FRAME_COUNT))
fps = cap.get(cv2.CAP_PROP_FPS)
print('fps =', fps)
while True:
retval, frame = cap.read()
if not retval:
break
cv2.imshow('frame', frame)
key = cv2.waitKey(int(1000/fps))
if key == 27: # Esc
break
if cap.isOpened():
cap.release()
cv2.destroyAllWindows()
출력 결과
vtest.avi 출력
잘된당.. gif 파일이라 용량이 장난아니다 ,,, 줄이느라 고생함
컴퓨터 카메라 띄우기
뭐 .. 이렇게 .. 화면에 잘 뜬다 (갑자기 내 얼굴 떠서 깜짝 놀랐었음)
댓글남기기