

opencvの使い方で分からないことがあります。

元の動画ファイルをopencvでエッジ検出させ、新たに動画ファイルとして保存したいと思い、  
以下のコードで実行しようとしました。

[code]

    import numpy as np
    import cv2
    
    cap = cv2.VideoCapture('video.mp4')
    
    fps    = cap.get(cv2.CAP_PROP_FPS)
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    width  = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    
    fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
    out = cv2.VideoWriter('output.mp4', int(fourcc), fps, (int(width), int(height)))
    
    while(cap.isOpened()):
        try:
            ret, frame = cap.read()
            edge = cv2.Canny(frame,50,100)
            out.write(edge)
            cv2.imshow('frame',edge)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        except:
            break
    
    out.release()
    cap.release()
    cv2.destroyAllWindows()
    
[/code]

動画ファイルは出力されますが、中身が再生できません。  
ご教授お願いします。


CC BY-SA 3.0
2017-11-04T23:30:31.690
39303
2019-01-06T12:00:50.143
2017-11-05T04:27:07.020
25868
26051
question
python opencv
opencvでの動画ファイルエッジ検出後の保存方法


一旦フレーム毎の画像に切り出して画像をフレーム毎につなげることで動画にできました。  
以下参考にしてください。  
またこちらの動画をエッジ処理に使いました。  
[利用した動画](http://www.cellstat.net/aerial/)

[code]

    import cv2
    import glob
    import re
    import os
    
    INPUT_FILE_NAME = "aerial.mp4"
    OUTPUT_FILE_NAME = "output.m4v"
    
    # ソートされた連番の画像ファイルパスを取得できます
    def numerical_sort(value):
        numbers = re.compile(r'(\d+)')
        parts = numbers.split(value)
        parts[1::2] = map(int, parts[1::2])
        return parts
    
    
    def convert_video_2_images():
        # 元ビデオファイル読み込み
        org = cv2.VideoCapture(INPUT_FILE_NAME)
        i = 0
        if not os.path.exists("./images"):
            os.mkdir("./images")
        while org.isOpened():
            end_flag, frame = org.read()
            edge = cv2.Canny(frame, 100, 200)
            if not end_flag:
                break
            save_file = "./images/img_{}.png".format(i)
            cv2.imwrite(save_file, edge)
            print("Save...{}".format(save_file))
            i += 1
        org.release()
    
    
    def convert_images_2_video():
        fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
        output = cv2.VideoWriter(OUTPUT_FILE_NAME,
                                 fourcc,
                                 30,
                                 (1280, 720))
    
        for img_file in sorted(glob.glob("images/*.png"), key=numerical_sort):
            img = cv2.imread(img_file)
            output.write(img)
        output.release()
    
    def main():
        convert_video_2_images()
        convert_images_2_video()
    
    
    if __name__ == '__main__':
        main()
    
[/code]


CC BY-SA 3.0
2017-11-05T06:59:48.007
39308
2017-11-05T10:30:26.057
2017-11-05T10:30:26.057
25868
25868
39303
answer