BGRとRGBを間違えて静止画/動画を保存してしまったときの変換
個人的に赤と青が逆の状態で保存してしまったー!ということがよくあります。
ちょっと検索した感じ、BGR→RGB変換のソフトウェアは公開されていないようだったので、OpenCVを使って自作。以下、C++のコード。
静止画用
#include <iostream> #include <sstream> #include <opencv2/opencv.hpp> int main(int argc, char** argv) { if(argc < 2) { std::cerr << "Input an image file\n"; return 1; } cv::Mat bgr_image(cv::imread(argv[1])), rgb_image; cv::cvtColor(bgr_image, rgb_image, CV_BGR2RGB); std::stringstream ss; ss << argv[1]; std::string path_without_extension, extension; std::getline(ss, path_without_extension, '.'); std::getline(ss, extension); cv::imwrite(path_without_extension + "_rgb." + extension, rgb_image); return 0; }
動画用
#include <iostream> #include <opencv2/opencv.hpp> int main(int argc, char** argv){ if(argc < 2) { std::cerr << "Input movie file path" << std::endl; return 1; } std::string input_path(argv[1]); std::string output_path(input_path + "_converted.avi"); cv::VideoCapture reader(input_path); double fps(reader.get(CV_CAP_PROP_FPS)); cv::Size size(reader.get(CV_CAP_PROP_FRAME_WIDTH), reader.get(CV_CAP_PROP_FRAME_HEIGHT)); cv::VideoWriter writer(output_path, CV_FOURCC_DEFAULT, fps, size); cv::Mat frame(size, CV_8UC3); while(1) { reader >> frame; if(frame.empty()) break; cv::cvtColor(frame, frame, CV_RGB2BGR); writer << frame; } reader.release(); writer.release(); std::cout << "done" << std::endl; return 0; }