图像处理-单个模板的多目标识别 OPENCV

问题描述

单个模板的多目标识别 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 queryDescriptortrainDescriptor;// 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(queryDescriptortrainDescriptorm_knnMatches3);        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( img1queryKeypointsimg2trainKeypointsm_Matches img_matches Scalar::all(-1) Scalar::all(-1) vector<char>() DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );        Mat img_matches2;  drawMatches( img1queryKeypointsimg2trainKeypointsn_Matches img_matches2 Scalar::all(-1) Scalar::all(-1) vector<char>() DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

解决方案

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

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

解决方案三:
特征点这块我也不是很熟,类似有这种是添加一些条件限制什么的,来筛选,距离啊,你说的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);  
时间: 2024-09-12 03:17:13

图像处理-单个模板的多目标识别 OPENCV的相关文章

《OpenCV图像处理》——1.4 使用OpenCV创建用户项目

1.4 使用OpenCV创建用户项目 本书中,我们假定C++是图像处理应用编程的主要语言,尽管实际上也提供了其他编程语言的接口和封装器(例如,Python.Java.MATLAB/Octave等). 本节说明如何用OpenCV的C++ API(一种易用的跨平台框架)开发应用.1.4.1 库的一般使用方法 为了用C++开发一个OpenCV应用,需要在代码中: 包含OpenCV的头文件定义 链接OpenCV库(二进制文件),以获取最终的可执行文件 OpenCV头文件位于OPENCV_BUILD\in

javascript模板引擎artTemplate的特性实现

文章简介:本文将用最简单的示例代码描述现有的 javascript 模板引擎的原理,包括新一代 javascript 模板引擎 artTemplate 的特性实现原理,欢迎共同探讨. 随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC 思想也开始流行起来.javascript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,近一年来在

smarty模板嵌套之include与fetch性能测试

方法一.使用在父模板中使用{include file="child.tpl"}直接将子模板包含进来 优点: 1.有利于模块的划分和模板的重用. 2.嵌套层次不多的时候,模板的结构清晰,一眼过去就知道这个模板的内容和结构. 3.只需要一个smarty实例就能做完所有的事情,减少系统资源的占用. 不足: 1.子模板中的变量可能与父模板的变量发生冲突 2.多重嵌套的时候,变量名冲突的几率增大,为所有的变量赋值的难度也加大. 3.子模板的可操控性差,例如不能通过设置$cache_id, $co

PHPLIB Template入门系列之模板嵌套

在PHP程序里,我们常常会把"公用代码"或"公用部分"写进一个文件里,前者象我们的系统配置文件,比如config.php,或者公共函数都写入一个functions.php文件里;后者象一个站点都需要用到的页面头部,尾部.这样做的好处是可以很方便的维护站点,而如果这个公用部分要有所改动,无需再去改每一个页面,大大减少了我们的工作量. PHPLIB Template入门系列 - 4 模板嵌套[楼 主] 在PHP程序里,我们常常会把"公用代码"或&qu

C++/CLR泛型与C++模板之间的对比

Visual Studio 2005把泛型编程的类型参数模型引入了微软.NET框架组件.C++/CLI支持两种类型参数机制--通用语言运行时(CLR)泛型和C++模板.本文将介绍两者之间的一些区别--特别是参数列表和类型约束模型之间的区别. 参数列表又回来了 参数列表与函数的信号(signature)类似:它标明了参数的数量和每个参数的类型,并把给每个参数关联一个唯一的标识符,这样在模板定义的内部,每个参数就可以被唯一地引用. 参数在模板或泛型的定义中起占位符(placeholder)的作用.用

高性能JavaScript模板引擎原理解析

随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC 思想也开始流行起来.javascript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,近一年来在开源社区中更是百花齐放,在 Twitter.淘宝网.新浪微博.腾讯QQ空间.腾讯微博等大型网站中均能看到它们的身影. 本文将用最简单的示例代码描述现有的 javascript 模板引擎

使用artTemplate模板开发网站(node.js + express环境)

本文详细说明了如何利用artTemplate模板引擎开发网站,主要是搭配node.js.express环境进行讲解.同时在文章开头会简单介绍了模板.模板引擎概念,以及artTemplate模板引擎的发展史,比较熟悉模板.模板引擎的读者可以跳过这部分.artTemplate的语法将放在文章最后稍作说明,因为语法不是本文的重点所在,可以参考其它文章详细了解语法知识. 为什么要写作这篇文章? 在学习artTemplate模板时,大家自然而然地想到参考artTemplate官方公布的文档,也就是托管在G

mfc opengl-mfc与opencv,OpenGL等库的结合

问题描述 mfc与opencv,OpenGL等库的结合 想用mfc做个界面,图像处理的过程和数据用opencv和OpenGL来运行,但是一直没找到合适的办法,做过相关的能解释一下吗? 解决方案 OpenCV和MFC的完美结合

C#开发微信门户及应用(27)-公众号模板消息管理

原文:C#开发微信门户及应用(27)-公众号模板消息管理 通过模板消息接口,公众号能向关注其账号的用户发送预设模板的消息.模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等.不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息.本文主要介绍基于C#开发实现公众号模板消息的管理功能. "模板消息功能的推出,将极大地增强服务号的服务通知能力",在一些一直期待微信模板消息功能开放的公众号运营者看来,微信一对一沟通的社交属性