마사미 방송 동영상을 IPPON 그랑프리 풍으로 해 보았다 (OpenCV : 파이썬 버전)

계기



동영상내의 문자를 추출하려고 2치화해 보았는데, 배경이 자연 환경하가 아니라 클리어로 아무것도 찍혀 있지 않기 때문인지 인물과 텔롭만이 추출된 번역입니다만, ,, 배경색 노란색으로 하면 IPPON 그랑프리처럼 되지 않을까 생각해 실장해 보았습니다.

개발


import cv2
import numpy as np

if __name__ == '__main__':

    cap = cv2.VideoCapture('one_minutes.mp4')

    cap_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    cap_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv2.CAP_PROP_FPS)

    telop_height = 50

    fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
    writer = cv2.VideoWriter('threshold_raw.mp4',fourcc, fps, (cap_width, cap_height + telop_height))

    kernel = np.ones((3,3),np.uint8)

    count = 0
    try :
        while True:
            if not cap.isOpened():
                break

            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

            ret, frame = cap.read()

            if frame is None:
                break

            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            ret2, frame = cv2.threshold(frame, 0, 255, cv2.THRESH_OTSU)

            #収縮 -> 膨張
            frame = cv2.morphologyEx(frame, cv2.MORPH_OPEN, kernel)

            background = np.zeros((cap_height, cap_width, 3), np.uint8)
            background[:] = tuple((80,235,247))

            telop = np.zeros((telop_height, cap_width, 3), np.uint8)
            telop[:] = tuple((128,128,128))

            #一旦モノクロ(dim=1)からカラー(dim=3)に変換
            frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)
            #背景色と合成
            frame = cv2.bitwise_and(frame, background)

            images = [frame, telop]

            frame = np.concatenate(images, axis=0)
            font = cv2.FONT_HERSHEY_SIMPLEX
            cv2.putText(frame, "{:.4f} [sec]".format(round(count/fps, 4)), 
                        (cap_width - 250, cap_height + telop_height - 10), 
                        font, 
                        1, 
                        (0, 0, 255), 
                        2, 
                        cv2.LINE_AA)

            writer.write(frame)
            count += 1

    except cv2.error as e:
        print(e)    

    writer.release()
    cap.release()


보충


ret2, frame = cv2.threshold(frame, 0, 255, cv2.THRESH_OTSU)으로 이진화하고 있습니다. 여기에서는 오쓰의 알고리즘을 사용하고 있습니다.
frame = cv2.morphologyEx(frame, cv2.MORPH_OPEN, kernel)그러면 이진화된 이미지에서 수축 -> 팽창하여 수축 단계에서 하얀 반점이 검은색으로 채워져 노이즈가 제거됩니다.

background = np.zeros((cap_height, cap_width, 3), np.uint8)
            background[:] = tuple((80,235,247))
background[:] = tuple((80,235,247))

#一旦モノクロ(dim=1)からカラー(dim=3)に変換
frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)
#背景色と合成
frame = cv2.bitwise_and(frame, background)

는 노란색의 단일 배경색을 작성해, 2치화한 화상과 bitwise_and 로 합성하고 있습니다.

결과



오프닝 처리 없음 (가공 없음)





오프닝 처리 있음





조금 알기 어려울지도 모릅니다만, 위의 정당명을 보고 있으면 수축 축소를 하는 것이 노이즈가 사라지고 있는 것을 알 수 있다고 생각합니다.

결론



비교적 깨끗하게 오브젝트를 분리할 수 있었으므로, 다음에는 문자를 추출해 보려고 합니다.

참고로 한 링크


  • opencv-python 오프닝(Opening)
  • opencv-python 비트 단위로 처리
  • IPPON 그랑프리
  • 좋은 웹페이지 즐겨찾기