单个模板的多目标识别 OPENCV

初学图像处理, 请多多指教!

我现在想解决的是用单个模板去匹配测试图中的多个目标(目标有仿射变换),参照了现成的一些SURF算法提取特征值进行匹配,可是这样只能匹配到一个目标。
后来发现匹配的knnmatch函数可以对一个 query descriptor返回k个最佳匹配,可是效果并不好, 不知有什么建议?十分感谢!

代码如下:

  Mat img1 = imread( "q.jpg", CV_LOAD_IMAGE_GRAYSCALE );
  Mat img2 = imread( "qw.jpg", CV_LOAD_IMAGE_GRAYSCALE );

    //-- Step 1: Detect the keypoints using Sift Detector
  SiftFeatureDetector  detector( hessian );

  vector<KeyPoint> queryKeypoints, trainKeypoints;

  detector.detect( img1, queryKeypoints );
  detector.detect( img2, trainKeypoints );

    //-- Step 2: Extract the keypoints using Sift Extractor
    Mat queryDescriptor,trainDescriptor;// extract keypoints
     SiftDescriptorExtractor extractor;  //Create Descriptor Extractor
    extractor.compute( img1, queryKeypoints, queryDescriptor );
    extractor.compute( img2, trainKeypoints, trainDescriptor );

        //--Step3: Match 
        vector<vector<DMatch>> m_knnMatches;
        vector<DMatch>m_Matches;
        vector<DMatch>n_Matches;
    const float minRatio = 1.f / 1.5f;

        matcher.knnMatch(queryDescriptor,trainDescriptor,m_knnMatches,3);
        for (size_t i=0; i<m_knnMatches.size(); i++)
        {
            const cv::DMatch& bestMatch = m_knnMatches[i][0];
            const cv::DMatch& betterMatch = m_knnMatches[i][1];
            const cv::DMatch& betterrMatch = m_knnMatches[i][2];
            float distanceRatio = bestMatch.distance / betterMatch.distance;
            float distanceRatio1 = betterMatch.distance / betterrMatch.distance;
            if (distanceRatio < minRatio)
        {
                m_Matches.push_back(bestMatch);
            }
            if (distanceRatio1 < minRatio)
            {
                n_Matches.push_back(betterMatch);
            }
        }

        Mat img_matches;
  drawMatches( img1,queryKeypoints,img2,trainKeypoints,m_Matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

        Mat img_matches2;
  drawMatches( img1,queryKeypoints,img2,trainKeypoints,n_Matches, img_matches2, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

0

3个回答

我记得是可以匹配多个的哇,你代码发上来瞅瞅啊,opencv那些函数效果都一般,你得自己多调试些参数

0
u014173467
MAXSIMJC 感谢您的解答! 已附上代码望指教~
3 年多之前 回复

surf是尺度不变的啊,你这个有仿射变换问题应该也不是很大,你这个knn就找前三个?是不是有点少了
效果不好可能是特征点找多少了,先用高通滤波器滤波一下,我暂时想到这么多

0
u014173467
MAXSIMJC Hi~ 感谢您的回复!我去试下滤波
3 年多之前 回复

特征点这块我也不是很熟,类似有这种是添加一些条件限制什么的,来筛选,距离啊,你说的knn啊什么的

 //-- Quick calculation of max and min distances between keypoints  
    for( int i = 0; i < descriptors_1.rows; i++ )  
    {   
        double dist = matches[i].distance;  
        if( dist < min_dist ) min_dist = dist;  
        if( dist > max_dist ) max_dist = dist;  
    }  
    printf("-- Max dist : %f \n", max_dist );  
    printf("-- Min dist : %f \n", min_dist );  
    //-- Draw only "good" matches (i.e. whose distance is less than 0.6*max_dist )  
    //-- PS.- radiusMatch can also be used here.  
    std::vector< DMatch > good_matches;  
    for( int i = 0; i < descriptors_1.rows; i++ )  
    {   
        if( matches[i].distance < 0.6*max_dist )  
        {   
            good_matches.push_back( matches[i]);   
        }  
    }  

    Mat img_matches;  
    drawMatches(img_1, keyPoints_1, img_2, keyPoints_2,  
        good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),  
        vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);  
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
单个模板的多目标识别 OPENCV
初学图像处理, 请多多指教!rnrn我现在想解决的是用单个模板去匹配测试图中的多个目标(目标有仿射变换),参照了现成的一些SURF算法提取特征值进行匹配,可是这样只能匹配到一个目标。rn后来发现匹配的knnmatch函数可以对一个 query descriptor返回k个最佳匹配,可是效果并不好, 不知有什么建议?十分感谢!rn
多目标识别
基于opencv模板匹配的多目标识别,能够比较有效的识别目标
opencv:多目标跟踪
本文转自:http://stackoverflow.com/questions/25494595/multiple-object-tracking-with-kalman-filter。 代码流程:    1 Background Subtract     2 Smoothing , Blur etc. filters.     3 Find Contours     4 Draw Re
python opencv 多目标跟踪
教程里有单目标跟踪: https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/#comments https://github.com/makelove/OpenCV-Python-Tutorial/tree/master/my02-视频-对象跟踪 https://blog.csdn.net/sinat_3258220...
OCR建立模板,培训,识别(基于opencv)
vs2010基于MFC开发的OCR识别工具。 OCR建立模板,培训,识别(基于opencv)。能快速建立OCR识别的样本图片,并培训。并有OCR识别测试工具U。很人性化,里面有操作说明书。
opencv识别
直线识别
学习 YOLO 多目标识别算法
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...
基于Halcon的多目标模板匹配算法
模板匹配,顾名思义,需要一个模板。然后在图像中寻找与模板能匹配得上的区域。Halcon中,基于灰度值的模板匹配的算法中,算法的基本原理比较简单,就是简单的灰度比对。
基于opencv的交通标志识别
基于opencv的交通标志识别,主要运用轮廓识别和模板匹配。适用于简单自然条件下的识别
OpenCV车辆识别
紧接我上一篇,这个代码是使用OpenCV和自己制作的XML文件对视频中的车辆进行识别的代码。由于样本库不是太完善,而且由于OpenCV进行目标识别时对光线等都比较敏感,希望你能在此基础上进行优化得到你想要的结果。祝你成功!
opencv 神经网络美女识别
opencv 神经网络美女识别 原文链接为:http://blog.csdn.net/qq_15947787/article/details/51394912
Opencv 目标检测和识别
对于学习opencv的初学者有很好的参考,主要是图像的目标检测和识别方法。
基于opencv的火焰识别
本文基于LINUX设计了基于opencv的火焰识别程序,程序包含图像预处理,以及基于RGB与HSI分量的辨判别程序,最后当检测到火源后,通过串口通信的方式传输出去
Opencv认证识别
Opencv认证识别,很好用的opencv文档库,研究人脸识别的质料库Opencv认证识别,很好用的opencv文档库,研究人脸识别的质料库
opencv 识别彩色二维码
使用opencv识别彩色二维码。具体流程可参见blog。50个字
【opencv】神经网络识别美女
最近比较闲,想做一个判断是否是美女的算法 从网上搜集了一些图片,首先要提取这些图片中的人脸并保存作为训练集,可以参考文章: http://blog.csdn.net/qq_15947787/article/details/51393030下面是完整的代码//opencv2.4.9 + vs2012 + win7 x64 #include <opencv2/opencv.hpp> #include
opencv 扬尘识别
去年的时候做了个工地扬尘的项目,我的工作主要是识别一张图里的扬尘,用的算法不麻烦,主要是分水岭的算法,两篇博文把分水岭讲的太好了,分享给大家 http://www.cnblogs.com/mikewolf2002/p/3304118.html http://blog.sciencenet.cn/blog-733228-578509.html 今年找出来了,当时还是用C写的,太跟不上时代了
【opencv】神经网络识别数字
本文参考了http://blog.csdn.net/qq_15947787/article/details/51385861 这位大神的文章,在此基础上稍作改进,可以跨平台运行。程序在opencv2.4.9+VS2013环境下完美运行,能够实现数字0-9的识别#include <iostream> #include <opencv2/opencv.hpp> #include <fstream> #
门牌识别(opencv)
之前数字图像处理大作业就是识别门牌或者车牌,用matlab写,直接就是搬运的!这次用opencv写了一下,基本思路大概如下: 1、利用imread() 来load图片,同时对图片进行灰度化,并进行均值滤波(本文用的图片噪声少,好像滤不滤波没啥影响) 2、图片过大的话进行降采样,resize()函数; 3、因为我们需要提取的只是车牌,所以可以将图片进行裁剪,尽可能地只保留门牌号区域,那样的话可
opencv识别自己的脸
opencv识别自己的脸本篇记录使用训练好的人脸识别模型来识别自己的脸。环境:VS2015,版本:opencv3.3.0。过程 加载opencv人脸检测的分类器; 加载人脸识别模型; 打开摄像头,读取图像; 对读取的图像进行人脸检测,检测到就调整到与训练集图片相同的大小; 把人脸与人类识别模型中的做对比,输出标签值;
【Opencv实战】 识别验证码
环境说明 opencv-python          3.4.4.19 pytesseract            0.2.6 tesseract              0.1.3 安装 第一步:安装Tesseract-OCR,下载地址:tesseract-ocr,请记住自己的安装位置,一会儿要用。 第二步:安装tesseract,直接在cmd,命令行输入 pip inst...
opencv字符切割与识别
#include &amp;amp;amp;amp;amp;quot;head.h&amp;amp;amp;amp;amp;quot; #include &amp;amp;amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;amp;amp;gt; #include &amp;amp;amp;amp;amp;amp;lt;stdlib.h&amp;amp;amp;amp;amp;amp;gt; #include &amp;amp;amp;amp;amp;a
OpenCv识别多条形码
这其实是一个小工程 完成的功能: 使用摄像头采集图像进行预处理(检测部分) 提取出预处理的条形码图像(识别部分) 将条形码进行存入数据库(存储部分) 首先接到这个图像识别的小工程需要先确定这个工程的最初输入,和最后输出,输入就是普通的RGB图像,输出是数据库文件。 其中需要完成的过程,就是我需要做得功能,检测部分、识别部分和存储部分,话不多说,上部分代码: /...
openCV 学习识别汉字
第一步:生成数据图片,当然方法很多,这里用pygame来做图片(字体为电脑中有效中文字体。),图片规格为2000, 1000,每个汉字的规格为40*40,实践汉字为“东西南北中” import pygame import random pygame.init() screen = pygame.display.set_mode((2000, 1000)) font_list = [‘microso...
Opencv识别图中人脸
#!/usr/bin/python #coding=utf-8 # 识别图片中的人脸 import face_recognition jobs_image = face_recognition.load_image_file(&quot;C:/rlsb/jobs.jpg&quot;); obama_image = face_recognition.load_image_file(&quot;C:/rlsb/obama.jpg...
opencv 正方形识别
想通过opencv函数来实现识别图像中的正方形,不要矩形,并计算识别的正方形面积。请问应该如何实现呢?在线等,求帮助。谢谢
opencv 双目识别
[img=https://img-bbs.csdn.net/upload/201604/09/1460197999_328667.png][/img]rnrn这是什么错误?
OPENCV脸部是识别
直接将这个CPP文件放在工程里面,就可以侦测并框除脸部。
opencv 识别圆心
opencv 识别圆心
人脸检测 识别 opencv
opencv环境:opencv 2.4.6.0 特征:eigenface Input:一个人脸数据库,15个人,每人20个样本(左右)。 Output:人脸检测,并识别出每张检测到的人脸。
货币识别Opencv
一种纸币识别VC++程序源码,并含有多国纸币的特征库,如日元、英镑、港币...的特征库。有从纸币图像预处理、特征匹配的全过程
OpenCV人脸检测识别分类器
OpenCV人脸检测识别分类器, OpenCV人脸检测识别分类器, OpenCV人脸检测识别分类器, OpenCV人脸检测识别分类器, OpenCV人脸检测识别分类器
邮政编码识别 OPENCV
用OPENCV 实现邮政编码的识别 包括倾斜矫正和字符分隔
opencv人脸检测与识别
程序基于opencv开发,压缩包中有详细的说明文档。包括人脸检测部分和人脸识别。
opencv识别圆形
关于opencv的配置,在这里暂且不说,如果不明白可查看以下博客, http://www.cnblogs.com/linshuhe/p/5764394.html 这篇博客主要讲述利用opencv对摄像头读取的图像进行识别,并输出圆心,由于采取非机器学习的方法,所以在识别的精度上有所欠缺,日后再做修改。 #include #include #include using
vc opencv 条形码 识别
vc与opencv制作的条形码识别程序,实现条形码图片的翻转
交通标志识别OpenCV源代码
用OpenCV实现的交通标志动态识别,方法是自己想的,希望对大家有帮助,有好的想法可以互相交流。
opencv识别两个网球
#include "cxcore.h"      #include "cv.h"      #include "highgui.h"     #include "iostream" using namespace std;    // 内轮廓填充      // 参数:      // 1. pBinary: 输入二值图像,单通道,位深IPL_DEPTH_8U。     // 2
[opencv]识别人脸和眼睛
本文的目标是实现本地打开一张图片并对其中的人脸和眼睛进行识别。代码如下: #include "stdafx.h" #include <iostream> #include <stdio.h> #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgpr
opencv 验证码去噪到识别~
先来几张验证码的原图吧。    呃,这是某公司很老的一个游戏的验证码了...如果你知道是啥游戏,放心里就好了... 我最初做这个验证码的降噪的时候是先灰化、二值化然后去噪。下面是我第一次做的效果图  这是我最早做的识别程序,最主要的是去噪过程,我第一次的去噪过程十分简单,仅仅是二值化之后用了opencv的腐蚀和膨胀2个函数, 简单的用了个4*4的矩阵去腐蚀后来的效果就是这样
相关热词 c#异步发送kafka c#窗体编号 c# 操作二进制文件 c# 反射 机制 c#线程 窗体失去响应 c#角度转弧度 c# 解析gps数据 c# vs设置 语法版本 c# json含回车 c#多线程demo