rk3588部署yolov8检测分割模型:Unsupported function: src unsupport width stride 184, rgb888 width stride报错问题

本文讲述了在深度学习中,当RGA图像宽度不是16的倍数时进行目标检测和分割任务可能会遇到的错误。提供了两种解决方案:一是resize图像使其宽度为16的倍数,但可能影响识别结果;二是使用全零填充保持比例。作者推荐在不影响识别的情况下优先考虑全零填充方法。
摘要由CSDN通过智能技术生成

报错原因:

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; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值