torchvisionで実装されているcenterCropをC++(OpenCV)で再現する方法です。
torchvisionで使われているcenterCropの実装を見れば終わりなんですが、そこまでしたくない人のために実装例を載せます。
cv::Mat img_float; // cropしたい画像(float値)
cv::Mat img_cropped; // crop後の画像
int crop_w, crop_h; // crop後の横幅・縦の長さ
// paddingが必要な場合の前処理
if(crop_w > image_float.cols || crop_h > image_float.rows)
{
const int left = crop_w > image_float.cols ? (crop_w - image_float.cols) / 2 : 0;
const int top = crop_h > image_float.rows ? (crop_h - image_float.rows) / 2 : 0;
const int right = crop_w > image_float.cols ? (crop_w - image_float.cols + 1) / 2 : 0;
const int bottom = crop_h > image_float.rows ? (crop_h - image_float.rows + 1) / 2 : 0;
cv::copyMakeBorder(image_float, image_float, top, bottom, left, right, cv::BORDER_CONSTANT, cv::Scalar(0));
}
// center crop
const int new_width = (image_float.cols - crop_w) / 2;
const int new_height = (image_float.rows - crop_h) / 2;
cv::Rect roi(new_width, new_height, crop_w, crop_h);
img_cropped = image_float(roi).clone();
以下のサイトを参考にしました。
- https://gist.github.com/1duo/c868f0bccf0d1f6cd8b36086ba295e04
- https://stackoverflow.com/questions/11737831/pad-array-with-zeros-opencv
この記事は役に立ちましたか?
もし参考になりましたら、下記のボタンで教えてください。
コメント