sift特征点模板匹配检测堆叠目标

怎么利用特征点(SIFT SURF或者其他)的模板匹配方式检测图像中很多相同的目标,包括目标堆叠在一起的情况?我看的一些机械臂抓取的文章中没有特别介绍堆叠目标的检测

这些特征点匹配一般只会匹配一个最佳的结果返回吧,如果你要匹配多个的话,要么for循环,将上一个最佳的匹配mask掉,然后匹配下一个,要么换检测或者专门训练一个网络,将特征接近的全部返回。
另外,堆叠这个如果只是匹配的话,基本上没戏,因为会优先匹配完整的,除非你把完整的全部mask掉之后才会去匹配露出部分的,而且还不能保证这部分的匹配结果是否可信,这种我感觉还是得用检测来,检测对于堆叠目标有一个比较好的结果,但是对于堆叠目标只露出部分的情况而言,也会有盲人摸象的问题

堆叠在一起的目标和分离不堆叠的目标不是一类目标

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7793158
  • 这篇博客也不错, 你可以看下关于SIFT和SURF介绍
  • 除此之外, 这篇博客: SIFT或SURF做图像匹配过程中出现 “未声明的标识符”问题以及常用匹配函数中的 匹配常用函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. drawKeypoints( ): 绘制关键点
    //形式:
    void drawKeypoints(const Mat&image, const vector<KeyPoint>& keypoints, Mat& outImage, constScalar& color=Scalar::all(-1), int flags=DrawMatchesFlags::DEFAULT );
    

    参数:
    image:const Mat&类型的src,输入图像;
    keypoints:const vector&类型的keypoints,根据源图像得到的特征点,它是一个输出参数;
    outImage:Mat&类型的outImage,输出图像,其内容取决于第五个参数标识符falgs;
    color:const Scalar&类型的color,关键点的颜色,有默认值Scalar::all(-1);

    1. BruteForceMatcher类中的函数match来匹配两幅图像的特征向量
      BruteForceMatcher<L2<float> > matcher;
      std::vector<DMatch > matches;
      //匹配两幅图中的描述子(descriptors)
      matcher.match(descriptors1, descriptors2, matches );
    
    1. FlannBasedMatcher算法更快但是找到的是最近邻近似匹配,所以当我们需要找到一个相对好的匹配但是不需要最佳匹配的时候往往使用FlannBasedMatcher。当然也可以通过调整FlannBasedMatcher的参数来提高匹配的精度或者提高算法速度,但是相应地算法速度或者算法精度会受到影响
     FlannBasedMatcher matcher;
     std::vector< DMatch > matches;       //定义了一个DMatch类向量matches,用来存放descriptors_1, descriptors_2中匹配的关键点
     matcher.match( descriptors_1, descriptors_2, matches );
    
    1. drawMatches() 从两幅图片中画出发现的匹配的关键点。
    	形式;
    	void drawMatches(const Mat& img1, const vector<KeyPoint>& keypoints1, const Mat& img2, const vector<KeyPoint>& keypoints2, const vector<DMatch>& matches1to2, Mat& outImg, const Scalar& matchColor=Scalar::all(-1), const Scalar& singlePointColor=Scalar::all(-1), const vector<char>& matchesMask=vector<char>(), int flags=DrawMatchesFlags::DEFAULT );
    

    参数:
    img1、img2:两幅源图像;
    keypoints1、keypoints2:两幅源图像中的关键点;
    matches1to2:从第一幅图像来匹配第二幅图像,即从keypoints1[i]中寻找与keypoints2[i]的对应点;
    outImg:输出图像;它的值取决于flags–在图像中绘制的内容;
    matchColor:匹配颜色(线和点的颜色),如果matchColor= =Scalar::all(-1),颜色随机生成 ;
    matchesMask:掩码决定画哪个匹配的关键点,如果掩码为空,画出所有的匹配的关键点;
    singlePointColor:单个关键点的颜色,即没有关键点与之匹配,如果matchColor= =Scalar::all(-1),颜色随机生成;

    参考:

    1. https://blog.csdn.net/holybin/article/details/41144705
    2. https://blog.csdn.net/u014310328/article/details/46463643