Predator's Vision

画像処理、3D点群処理、DeepLearning等の備忘録

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;
}