본문 바로가기
컴퓨터비전

OpenCV를 활용하여 이미지 보이기, 원본영상에 바운딩박스 시각화한 새로운 영상 만들기

by 차분한 공돌이 2024. 2. 22.

OpenCV 이미지 로딩 시 주의점

OpenCV에서 imread('파일명')을 이용하여 넘파이 array형태로 가져온다. 이때 RGB형태가 아닌 BGR형태로 로딩하기 때문에 cvtColor(이미지 배열, cv2.COLOR_BGR2RGB)를 이용하여 다시 RGB형태로 바꿔준다.

 

 

 

OpenCV를 활용하여 이미지 보이기

OpenCV의 imread()로 반환된 BGR 이미지 넘파이 배열을 그대로 시각화 하기

 

import cv2

cv2_image = cv2.imread('/content/data/beatles01.jpg')
#cv2_image : numpy array 형태, BGR
plt.figure(figsize=(10, 10))
plt.imshow(cv2_image)
plt.show()

 

 

imwrite()를 활용하여 RGB형태로 반환 후 보이기

 

import cv2

cv2_image = cv2.imread('/content/data/beatles01.jpg')
#cv2_image : numpy array 형태, BGR
cv2.imwrite('/content/data/beatles02_cv.jpg', cv2_image)
#cv2.imwrite(RGB형태로 여기에 저장한다,이 이미지를)
print('cv_image type:', type(cv2_image), ' cv_image shape:', cv2_image.shape)

plt.figure(figsize=(10, 10))
img = plt.imread('/content/data/beatles02_cv.jpg') #RGB형태

plt.imshow(img)
#plt.show()

 

 

 

 

cvtColor()를 활용하여 RGB형태로 반환 후 보이기

 

cv2_image = cv2.imread('/content/data/beatles01.jpg')
draw_image = cv2.cvtColor(cv2_image, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(10, 10))
plt.imshow(draw_image)
plt.show()

 

원본영상에 바운딩박스 시각화한 새로운 영상 만들기

 

# 0. 준비 :  import cv2
import cv2

# 1. video_input_path = '원본영상 파일 경로'
video_input_path = '/content/data/Night_Day_Chase.mp4'
# linux에서 video output의 확장자는 반드시 avi 로 설정 필요.

# 2. video_output_path = ' 새로운 영상 파일 경로 지정'
video_output_path = '/content/data/Night_Day_Chase_out.mp4'

# 3. VidepCapture 클래스를 활용하여 객체 만들기 -> 이후 cap 객체는 영상의 높이, 너비, fps등의 정보를 얻기 위해서 쓰임
cap = cv2.VideoCapture(video_input_path)

# Codec은 *'XVID'로 설정.
#codec : 비디오 파일을 압축(인코딩), 압축 해제(디코딩)에 필요함

# 4. codec = cv2.VideoWriter_fourcc(*'원하는 코덱 종류')  ex :  XVID, H.264 등등
codec = cv2.VideoWriter_fourcc(*'XVID')

# 5. 영상의 너비, 높이 구하기
vid_size = (round(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),round(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))) #(200, 400)

# 6. 영상의 FPS 구하기
vid_fps = cap.get(cv2.CAP_PROP_FPS )

# 7. 원본을 편집해서 다시 만들어주는 역할을 하는 VideoWriter 설정하기
vid_writer = cv2.VideoWriter(video_output_path, codec, vid_fps, vid_size)

#8. 바운딩 박스 색깔, 그 위에 텍스트 색깔 설정
green_color=(0, 255, 0)
red_color=(0, 0, 255)

# 모든 이미지 프레임에 대하여
index=0
while True:
    hasFrame, img_frame = cap.read() #img_frame : 영상이 칼라면 numpy 3차원 배열
    if not hasFrame:
        print('더 이상 처리할 frame이 없습니다.')
        break
    index += 1
    print('frame :', index, '처리 완료')

    cv2.rectangle(img_frame, (300, 100, 800, 400), color=green_color, thickness=2)
    #(300, 100, 800, 400) 은 임의로 설정한 바운딩 박스 좌표, 나중에 yolo등을 통해
    #바운딩박스 좌표를 얻어낸 후 이 자리에 넣으면  돼

    # "frame:{}".format(넣고싶은 수)
    caption = "frame:{}".format(index)

   #cv2.putText(img_frame, caption, 텍스트 위치, 사용할 폰트, 텍스트 크기, 텍스트 색상, 1)
    cv2.putText(img_frame, caption, (300, 95), cv2.FONT_HERSHEY_SIMPLEX, 0.7, red_color, 1)
   
    #지금까지 바운딩박스와 텍스트를 표시한 화면(img_frame)으로 새 영상을 만들기
   
    vid_writer.write(img_frame)

#사용한 객체들 해제
vid_writer.release()
cap.release()

 

Reference