用FastSAM,你也是扣图小能手
VX搜索晓理紫,回复fastsamremove获取源码
[晓理紫]
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获取核心代码
{晓理紫}喜分享,也很需要你的支持,喜欢留下痕迹哦!