SonyのビデオカメラHandycam HDR-CX720で撮影した動画mtsフォーマットをOpenCVで読み込んだときのメモ。環境はUbuntu16.04, OpenCV3.2, gcc5.4。
そのビデオカメラで撮影したハイビジョン動画はAVCHD形式で保存され拡張子MTSが付く。このままではOpenCVで読み込めないのでffmpegを使いmp4フォーマットに変換した。
- sudo apt install ffmpeg
- ffmpeg -i input_file.MTS -vcodec copy -acodec copy output_file.mp4
動画ファイルを読み込み原画像とエッジ検出フィルタをかけた画像を表示するサンプルプログラム。
#include <opencv2/core.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/videoio.hpp> #include #define VIDEO_FILE_NAME "/home/demura/src/video/1.mp4" int main(int argc, const char* argv[]) { cv::VideoCapture capture(VIDEO_FILE_NAME); if (!capture.isOpened()) { std::cout << "ERROR:" << VIDEO_FILE_NAME << " (no such file)" << std::endl; } int width = (int)capture.get(CV_CAP_PROP_FRAME_WIDTH); int height = (int)capture.get(CV_CAP_PROP_FRAME_HEIGHT); int count = (int)capture.get(CV_CAP_PROP_FRAME_COUNT); int fourcc = (int)capture.get(CV_CAP_PROP_FOURCC); double fps = capture.get(CV_CAP_PROP_FPS); cv::VideoWriter writer("out.avi", fourcc, fps, cv::Size(width, height), false); cv::namedWindow("frame"); cv::namedWindow("edge"); while (true) { cv::Mat frame; capture >> frame; if (frame.empty()) break; cv::Mat edge, img_tmp; //cv::Canny(frame, edge, 50, 150); // cv::Sobel(frame, img_tmp, CV_32F, 1, 0, 3); // ソーベルフィルタ cv:convertScaleAbs(img_tmp, edge, 1, 0); // 画像として表示できるよう変換 writer << edge; imshow("frame",frame); imshow("edge", edge); cv::waitKey(30); } return 0;
ビルドするためのCMakeLists.txt。以下のコマンでビルドする。
- cmake .
- make
cmake_minimum_required(VERSION 2.8) project(video) find_package(OpenCV REQUIRED) add_executable(video video.cpp) target_link_libraries(video ${OpenCV_LIBS})
終わり
コメント