报错原因:
RGA图像的宽度需要是16的倍数,在深度学习中,通常这个问题出现在我们先做了目标检测将目标裁剪成小图之后,再使用小图做分割任务,分割任务时报错:Unsupported function: src unsupport width stride 184, rgb888 width stride
解决办法
(1)resize小图,将图像宽度resize到16的倍数的值。
如果图像的大小为184*320,则
cv::Mat img = imread("1.jpg");
int new_width = img.cols+(16-(img.cols%16));
cv::resize(src,src,cv::Size(new_width,320));
直接resize的一个问题是会改变图像的比例,多少会影响识别结果,不建议;
(2)使用全零填充,给图像宽度边缘实现全零填充,类似于yolo系列里面的等比缩放
// 函数用于为图像添加黑色边框以填充至指定大小
cv::Mat addBlackBorder(const cv::Mat& src, int targetWidth, int targetHeight) {
// 获取源图像的尺寸和通道数
int srcWidth = src.cols;
int srcHeight = src.rows;
int channels = src.channels();
// 计算需要添加的边框宽度和高度
int top = 0, bottom = 0, left = 0, right = 0;
if (srcWidth < targetWidth) {
right = targetWidth - srcWidth;
left = 0;
}
if (srcHeight < targetHeight) {
bottom = targetHeight - srcHeight;
top = 0;
}
// 创建目标图像,类型与源图像相同
cv::Mat dst(targetHeight, targetWidth, src.type(), cv::Scalar(0, 0, 0)); // 初始化为黑色
// 使用copyMakeBorder函数将源图像复制到目标图像中,并添加黑色边框
cv::copyMakeBorder(src, dst, top, bottom, left, right, cv::BORDER_CONSTANT, cv::Scalar(0, 0, 0));
return dst;
//RGA处理,宽度为16的倍数
if(img.cols%16!=0){
LOG(INFO)<<"扩充宽度"<<std::endl;
cv::Mat src = img.clone();
// 指定目标宽度和高度
int targetWidth = ((img.cols/16)+1)*16;
int targetHeight = img.rows;
// 添加黑色边框以填充至指定大小
img = addBlackBorder(src, targetWidth, targetHeight);
img_width = img.cols;
}