有了它你还不会扣图么?

用FastSAM,你也是扣图小能手
VX搜索晓理紫,回复fastsamremove获取源码
[晓理紫]

1 用图说话

有了它你还不会扣图么?_第1张图片

2 核心代码

在onnx部署,trt部署,yolov8+fastsam分别介绍了FastSAM通过OnnxRuntime,TensorRT部署以及与yolov8一起的应用,通过点进行选取分割区域和前两者的部署方式一样,感兴趣的可以去前面文章去获取代码,这里只介绍如何通过mask获取要扣的图。mask覆盖区域是我们要关注对象的区域,我们只需要把非此区域的部分去除就行了,最简单的去除方式就是设置为黑色背景。核心代码如下:

void xiaolizifastSAMModel::xiaolizidraw_objects(
    cv::Mat &image, std::vector<cv::Mat> vremat,
    std::vector<std::vector<int>> point, int &i) {
  cv::Mat maskImage = image.clone();
  cv::Mat orimange = image.clone();
  if (point.size() == 0) {
    cv::Mat bbox = vremat[0];
    float *pxvec = bbox.ptr<float>(0);
    for (int i = 0; i < bbox.rows; i++) {
      pxvec = bbox.ptr<float>(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<float>(y);
      uchar *p = maskImage.ptr<uchar>(y);
      for (int x = 0; x < mask.cols; x++) {
        if (mp[x] != 1.0) {
          p[0] = cv::saturate_cast<uchar>(p[0] * 0.0 + COLORS[indx][0] * 0.0);
          p[1] = cv::saturate_cast<uchar>(p[1] * 0.0 + COLORS[indx][1] * 0.0);
          p[2] = cv::saturate_cast<uchar>(p[2] * 0.0 + COLORS[indx][2] * 0.0);
        }
        p += 3;
      }
    }
  }
  if (vremat.size() > 1) {
    for (auto pp : point) {
      std::cout << "dddd:" << pp[0] << ":" << pp[1] << std::endl;
      cv::Point p(pp[0], pp[1]); //初始化点坐标为(20,20)
      circle(orimange, p, 10, cv::Scalar((rand() % (255)), (rand() % (255)), 0),
             -1); // 画半径为1的圆(画点)
    }
  }
  cv::imwrite("image2/" + std::to_string(stasum) + "_point.png", orimange);
  cv::imwrite("image2/" + std::to_string(stasum) + "_mask.png", maskImage);
  stasum++;
}

3 核心代码获取方式

VX搜索“晓理紫”,关注并回复fastsamremove获取核心代码

{晓理紫}喜分享,也很需要你的支持,喜欢留下痕迹哦!

你可能感兴趣的:(机器学习,opencv,人工智能,计算机视觉)