OpenCVを使って画像を4分割して連番で画像を書き出す
画像処理では、顔認識の分類器を作るときなど、大量の画像を連番で書き出すときがあると思います。そのような場合に使えるテクニックの紹介です。
ソースコード
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat src = cv::imread("komon.jpg");
if (src.empty()) {
std::cout << "image not found" << std::endl;
return -1;
}
// 4分割するための点を定義
std::vector<cv::Point> p = {
{0, 0}, {src.cols / 2, 0}, {0, src.rows / 2}, {src.cols / 2, src.rows / 2}
};
for (auto itr = p.begin(); itr != p.end(); ++itr) {
// 関心領域を元の画像から矩形で切り出す
cv::Mat roi = src(cv::Rect(itr->x, itr->y, src.cols / 2, src.rows / 2));
// 連番で画像を書き出す
cv::imwrite("dst" + std::to_string(itr - p.begin()) + ".jpg", roi);
}
}
連番で書き出す
cv::imwrite("dst" + std::to_string(itr - p.begin()) + ".jpg", roi);
ファイルを書き出す際の cv::imwrite() 関数はファイル名をstd::string型で指定するため、数値などは変換する必要があります。std::to_string() メソッドを使ってやれば連番で書き出すことができるようになります。