【OpenCV】グレースケール動画を作る【Java】
前回、動画の入力と情報の取得が成功したのでグレースケール化をしてみる。
(Java版OpenCVのリファレンスに、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; } }