取mask下边界

cv::Mat method_ForCols(cv::Mat& img, int padding = 5, int interval = 3, bool timer = true) {
/*
    @brief 选取mask最下方的点作为边界
    @param img      : 模型推理结果的边界mask (drawContours的结果)
    @param padding  : 线条宽度
    @param interval : 列间隔 (interval = 1 效率较低 像素大时没有必要)
    @param timer    : 处理时间
    @return         : 处理后的mask
*/
/*
    可以根据上游处理,减少二值化步骤
*/    
    double st = clock();

    cv::Mat mask(img.rows, img.cols, CV_8UC1, cv::Scalar(0));
    cv::threshold(img, img, 100, 255, cv::THRESH_BINARY);

    for (int col_idx = 0; col_idx < img.cols; col_idx += interval) {
        bool hasWhitePixel = false;
        int upest = img.rows;
        
        // 从下往上
        for (int row = img.rows - 1; row >= 0; --row) {
            uchar pixel = img.at<uchar>(row, col_idx);

            if (pixel == 255) {
                hasWhitePixel = true;
                upest = row;
                break;
            }
        }

        if (hasWhitePixel) {
            mask.rowRange(upest, std::min(upest + padding, img.rows)).colRange(col_idx, std::min(col_idx + interval, img.cols)).setTo(255);
        }
    }

    if (timer)
        std::cout << "[Filter method_ForCols] time cost " << (clock() - st) / CLOCKS_PER_SEC << std::endl;

    return mask;

}

请添加图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值