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;
}
取mask下边界
于 2023-05-26 13:15:09 首次发布