分割一切模型 Fast SAM C++推理部署( 二 )

scores;std::vector boxes;pxvec = dst.ptr(0);for (int i = 0; i < dst.rows; i++) {pxvec = dst.ptr(i);boxes.push_back(cv::Rect(pxvec[0], pxvec[1], pxvec[2], pxvec[3]));scores.push_back(pxvec[4]);}std::vector indices;xiaoliziNMSBoxes(boxes, scores, conf_thres, iou_thres, indices);cv::Mat reMat;for (int i = 0; i < indices.size() && i < max_det; i++) {int index = indices[i];reMat.push_back(dst.rowRange(index, index + 1).clone());}box = reMat.colRange(0, 6).clone();xiaolizixywh2xyxy(box);mask = reMat.colRange(6, reMat.cols).clone();
其次是获取mask相关数据
for (int i = 0; i < bboxes.rows; i++) {pxvec = bboxes.ptr(i);cv::Mat dest, mask;cv::exp(-maskChannels[i], dest);dest = 1.0 / (1.0 + dest);dest = dest(roi);cv::resize(dest, mask, frmae.size(), cv::INTER_LINEAR);cv::Rect roi(pxvec[0], pxvec[1], pxvec[2] - pxvec[0], pxvec[3] - pxvec[1]);cv::Mat temmask = mask(roi);cv::Mat boxMask = cv::Mat(frmae.size(), mask.type(), cv::Scalar(0.0));float rx = std::max(pxvec[0], 0.0f);float ry = std::max(pxvec[1], 0.0f);for (int y = ry, my = 0; my < temmask.rows; y++, my++) {float *ptemmask = temmask.ptr(my);float *pboxmask = boxMask.ptr(y);for (int x = rx, mx = 0; mx < temmask.cols; x++, mx++) {pboxmask[x] = ptemmask[mx] > 0.5 ? 1.0 : 0.0;}}vremat.push_back(boxMask);}
最后是画出相关信息
cv::Mat bbox = vremat[0];float *pxvec = bbox.ptr(0);for (int i = 0; i < bbox.rows; i++) {pxvec = bbox.ptr(i);cv::rectangle(image, cv::Point(pxvec[0], pxvec[1]),cv::Point(int(pxvec[2]), int(pxvec[3])),cv::Scalar(0, 0, 255), 2);}for (int i = 1; i < vremat.size(); i++) {cv::Mat mask = vremat[i];int indx = (rand() % (80 - 0)) + 0;for (int y = 0; y < mask.rows; y++) {const float *mp = mask.ptr(y);uchar *p = image.ptr(y);for (int x = 0; x < mask.cols; x++) {if (mp[x] == 1.0) {p[0] = cv::saturate_cast(p[0] * 0.5 + COLORS[indx][0] * 0.5);p[1] = cv::saturate_cast(p[1] * 0.5 + COLORS[indx][1] * 0.5);p[2] = cv::saturate_cast(p[2] * 0.5 + COLORS[indx][2] * 0.5);}p += 3;}}}
【分割一切模型 Fast SAM C++推理部署】3 核心代码