怎么利用特征点(SIFT SURF或者其他)的模板匹配方式检测图像中很多相同的目标,包括目标堆叠在一起的情况?我看的一些机械臂抓取的文章中没有特别介绍堆叠目标的检测
这些特征点匹配一般只会匹配一个最佳的结果返回吧,如果你要匹配多个的话,要么for循环,将上一个最佳的匹配mask掉,然后匹配下一个,要么换检测或者专门训练一个网络,将特征接近的全部返回。
另外,堆叠这个如果只是匹配的话,基本上没戏,因为会优先匹配完整的,除非你把完整的全部mask掉之后才会去匹配露出部分的,而且还不能保证这部分的匹配结果是否可信,这种我感觉还是得用检测来,检测对于堆叠目标有一个比较好的结果,但是对于堆叠目标只露出部分的情况而言,也会有盲人摸象的问题
堆叠在一起的目标和分离不堆叠的目标不是一类目标
//形式:
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);
BruteForceMatcher<L2<float> > matcher;
std::vector<DMatch > matches;
//匹配两幅图中的描述子(descriptors)
matcher.match(descriptors1, descriptors2, matches );
FlannBasedMatcher matcher;
std::vector< DMatch > matches; //定义了一个DMatch类向量matches,用来存放descriptors_1, descriptors_2中匹配的关键点
matcher.match( descriptors_1, descriptors_2, matches );
形式;
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),颜色随机生成;
参考: