2017-10-02 9 views
0

私は車の正面図が記録されたビデオを持っています。ファイルは.mp4なので、より多くの情報(オブジェクト、レーンラインなど)を抽出できるように、単一の画像を処理したい。問題は、処理されたファイルからビデオを作成したいときにエラーが発生することです。ここで私はこれまでやっていることです:Python:処理された画像のビデオを作成する

  1. は)(cv2.VideoCaptureでビデオを開設 - cv2.imwriteとビデオ(の単一のフレームを保存細かい
  2. ワークス) - 作成罰金
  3. 作品cv2.VideoWriterを持つ単一のフレームのうちビデオ() - cv2.cvtColorで動画を(後処理
  4. ファインワークス)、cv2.GaussianBlur()とcv2.Canny() - のうちのビデオを作成する
  5. ファインワークス処理された画像 - 機能しません。ここで

私が使用したコードです:

enter code here 
def process_image(image): 
    gray = functions.grayscale(image) 
    blur_gray = functions.gaussian_blur(gray, 5) 
    canny_blur = functions.canny(blur_gray, 100, 200) 

    return canny_blur 

process_on =0 
count =0 

video= cv2.VideoWriter("output.avi", cv2.VideoWriter_fourcc(*"MJPG"), 10, (1600, 1200)) 

vidcap = cv2.VideoCapture('input.mp4') 
success,image = vidcap.read() 

success = True 
while success: 
    processed = process_image(image) 
    video.write(processed) 

これは私が取得エラーです:

OpenCV Error: Assertion failed (img.cols == width && img.rows == height*3) in cv::mjpeg::MotionJpegWriter::write, file D:\Build\OpenCV\opencv-3.2.0\modules\videoio\src\cap_mjpeg_encoder.cpp, line 834 Traceback (most recent call last): File "W:/Roborace/03_Information/10_Data/01_Montreal/camera/right_front_camera/01_Processed/Roborace_CAMERA_create_video.py", line 30, in video.write(processed) cv2.error: D:\Build\OpenCV\opencv-3.2.0\modules\videoio\src\cap_mjpeg_encoder.cpp:834: error: (-215) img.cols == width && img.rows == height*3 in function cv::mjpeg::MotionJpegWriter::write

私の提案は次のとおりです。通常のイメージがあるため、RGBカラーの3次元を持っていますフィールド。処理された画像は1つの次元しか持たない。どうすればこれをcv2.VideoWriter関数で調整できますか?あなたの助け

答えて

2

VideoWriter()クラスため

おかげでのみはあなたがあなたの出力のパスから判断されるかもしれないように見えるのWindows、上にあるない限り、カラー画像ではなくグレースケール画像を書き込みます。 Windowsでは、オプションの引数isColor=0またはisColor=FalseVideoWriter()コンストラクタに渡して、シングルチャネルイメージを書き込むことができます。それ以外の場合は、簡単な解決策は、ちょうど(あなたがcv2.merge([gray, gray, gray])を使用して、それを書くことができる3つのチャンネルの画像にあなたのグレースケールフレームを積み重ねることである

VideoWriter() docsから:。

Parameters:

isColor – If it is not zero, the encoder will expect and encode color frames, otherwise it will work with grayscale frames (the flag is currently supported on Windows only).

ので、デフォルト、isColor=Trueとフラグで。

video.write(cv2.merge([processed, processed, processed]) 

をWindowsの変異体は、グレースケールフレームを書くことができたとしても、platforのために、この第二の方法を使用する方が良いかもしれあなたをパッチを適用する必要があります。だから、単にやってするWindows以外のシステム上で変更することはできません独立。


またここにあなたのコードと他の可能な多くの問題があるZindarod mentions in the comments belowとして。私はあなたがここで実際には動作していなかった修正済みのコードを貼り付けたと仮定しています。そうでなければ修正したでしょう... minimal, complete, and verifiableのコード例を投稿してください。

まず、ループには終了条件がないため、不定です。第二に、フレームサイズをハードコーディングしていますが、VideoWriter()はイメージをそのサイズにリサイズするだけではありません。 VideoWriter()に渡すフレームのサイズを指定する必要があります。書き込みする前にフレームを同じサイズにリサイズするか、VideoCapture()デバイスで定義されているフレームサイズ(フレームサイズのプロパティには.get() methodsを使用)を使用してVideoWriterを作成してください。

さらに、ループ外の最初のフレームだけを読み込んでいます。たぶんそれは意図的だったかもしれませんが、ビデオの各フレームを処理する場合は、ループでそれらを読み、処理してから書き込む必要があります。

最後に、コードでエラーを捕まえるのがよいでしょう。たとえば、OpenCV "Getting Started with Video" Python tutorialを参照してください。 「ビデオを保存する」セクションには適切なチェックとバランスがあります。whileビデオキャプチャデバイスが開かれていて、frameが正しく読み取られた場合にのみ、フレームを処理して書き込みます。一度フレームがなくなると、.read()メソッドはFalseを返します。これにより、ループから抜け出し、キャプチャデバイスとライターデバイスを閉じることができます。ここで注文することに注意してください。VideoCapture()デバイスは、最後のフレームを読み込んだ場合でも「開かれている」ので、フレームの内容を確認してループを閉じる必要があります。

+0

彼のコードには他にもいくつかのあいまいさがありますので、あなたの答えに答えてください。例えば、フレームサイズはコンストラクタに与えられたサイズと一致しなければならず、 'VideoWriter'クラスは自動的にctorに合うようにフレームのサイズを変更しません。また、彼はループでフレームを書いているが、ループの外にあるフレームを読み込んでいる。 – zindarod

+1

@Zindarodはいいですね。私はOPが一連の作業行為を列挙しているため、これらの提案は含まれていなかったので、私はOPがおそらくこれを正しく使用していると思わせたが、悪い例を貼り付けただけだった。しかし、私は間違っている可能性があります。また、他の人が質問に遭遇した場合にも書く価値があるので、提案に感謝します。 –

関連する問題