読者です 読者をやめる 読者になる 読者になる

<!--親の顔より見た光景-->

日々の発見を残していきます。

【OpenCV】グレースケール動画を作る【Java】

前回、動画の入力と情報の取得が成功したのでグレースケール化をしてみる。
JavaOpenCVのリファレンスに、C++OpenCVで使われるキャプチャ関数名が無かったのでけっこー時間がかかってしまった。)
【VideoApp.java

package videoapp;
import org.opencv.core.Core;
import org.opencv.videoio.VideoCapture;
import org.opencv.videoio.Videoio;
import org.opencv.videoio.VideoWriter;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;

public class VideoApp {
    public static void main( String[] args ) {
        System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
        VideoCapture source_video = new VideoCapture( "test.mp4" );     // 動画ファイル読み込み
        if ( source_video == null ) {
            System.out.println( "動画が読み込めません" );
            System.exit( 0 );
        }
        VideoWriter video_writer = new VideoWriter( "test_gray.avi", VideoWriter.fourcc( 'M', 'J', 'P', 'G' ),
                                                     source_video.get( Videoio.CAP_PROP_FPS ), new Size( 512, 384 ) );
        Mat frame_im = new Mat();
        while ( true ) {
            if ( source_video.read( frame_im ) ) {
                Imgproc.cvtColor( frame_im, frame_im, Imgproc.COLOR_RGB2GRAY );
                Imgproc.cvtColor( frame_im, frame_im, Imgproc.COLOR_GRAY2RGB );
                video_writer.write( frame_im );
            }
            else {
                break;
            }
        }
        video_writer.release();
    }
}

実行を終えてから気づいたが、画像処理なので出力された動画の音声情報は失われる。
frame_imはキャプチャした画像を格納するMat型変数。
cvtColorでグレースケールに変換してるが、変換と同時にRGB3チャンネルから1チャンネルになる。1チャンネル画像のままwriteメソッドに突っ込むとエラーを吐くので、冗長な処理だがcvtColorでRGB3チャンネルに直している。

動画処理と言っても基本は画像処理であり、↓のソースコードのwhileループ内で自分のやりたい処理を書くだけである。OpenCVでの画像処理に慣れていれば楽勝(?)だと思う。

while ( true ) {
    if ( source_video.read( frame_im ) ) {
        // ここでグレースケール化や、エッジ化、コントラスト強調、HSV変換による色変換処理など…
        video_writer.write( frame_im );
    }
    else {
        break;
    }
}