预处理算法
static cv::Mat preprocess_img(cv::Mat& img, int input_w, int input_h) {
int w, h, x, y;
float r_w = input_w / (img.cols*1.0);
float r_h = input_h / (img.rows*1.0);
if (r_h > r_w) {
w = input_w;
h = r_w * img.rows;
x = 0;
y = (input_h - h) / 2;
} else {
w = r_h * img.cols;
h = input_h;
x = (input_w - w) / 2;
y = 0;
}
cv::Mat re(h, w, CV_8UC3);
cv::resize(img, re, re.size(), 0, 0, cv::INTER_LINEAR);
cv::Mat out(input_h, input_w, CV_8UC3, cv::Scalar(128, 128, 128));
re.copyTo(out(cv::Rect(x, y, re.cols, re.rows)));
return out;
}
将原始输入图像缩放到模型需要的尺寸,比如640x640。这一步需要注意的是,原始图像是按照等比例进行缩放的,如果缩放后的图像某个维度上比目标值小,那么就需要进行填充。举个例子:假设输入图像尺寸为768x576,模型输入尺寸为640x640,按照等比例缩放的原则缩放后的图像尺寸为640x480,那么在y方向上还需要填充640-480=160(分别在图像的顶部和底部各填充80)。
if (r_h > r_w) {
w = input_w;
h =

该博客介绍了如何使用OpenCV进行图像预处理,确保图像按比例缩放后适应模型输入尺寸,如640x640。在保持纵横比的情况下,若缩放后图像尺寸小于目标尺寸,则通过填充来补足缺失的部分,以避免信息丢失。文章详细阐述了缩放和填充的算法实现,并展示了如何利用`cv::resize`和`cv::copyTo`函数完成这一过程。
最低0.47元/天 解锁文章
667

被折叠的 条评论
为什么被折叠?



