当前位置: 首页 > news >正文

OpenCV C++形状匹配

这个程序使用OpenCV shape模块进行形状匹配。

数据库里有20张图片:

可以很容易看出来每两张图片是一组匹配的形状。

大概就是这个意思:用第一张图片查询时会找到第二张图片。

现在查询左边的第14张图片,可以看到最佳匹配(Best Match)的是右边显示的第13张图片。

代码:

#include "opencv2/shape.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" #include <iostream> #include <string> static vector<Point> simpleContour( const Mat& currentQuery, int n=300 ) { vector<vector<Point> > _contoursQuery; vector <Point> contoursQuery; findContours(currentQuery, _contoursQuery, RETR_LIST, CHAIN_APPROX_NONE); for (size_t border=0; border<_contoursQuery.size(); border++) { for (size_t p=0; p<_contoursQuery[border].size(); p++) { contoursQuery.push_back( _contoursQuery[border][p] ); } } int dummy=0; for (int add=(int)contoursQuery.size()-1; add<n; add++) { contoursQuery.push_back(contoursQuery[dummy++]); } cv::randShuffle(contoursQuery); vector<Point> cont; for (int i=0; i<n; i++) { cont.push_back(contoursQuery[i]); } return cont; } int main() { int indexQuery = 14; string path = "data/shape_sample/"; cv::Ptr <cv::ShapeContextDistanceExtractor> mysc = cv::createShapeContextDistanceExtractor(); Size sz2Sh(300,300); stringstream queryName; queryName<<path<<indexQuery<<".png"; Mat query=imread(queryName.str(), IMREAD_GRAYSCALE); Mat queryToShow; resize(query, queryToShow, sz2Sh, 0, 0, INTER_LINEAR_EXACT); imshow("QUERY", queryToShow); vector<Point> contQuery = simpleContour(query); int bestMatch = 0; float bestDis=FLT_MAX; for ( int ii=1; ii<=20; ii++ ) { if (ii==indexQuery) continue; stringstream iiname; iiname<<path<<ii<<".png"; Mat iiIm=imread(iiname.str(), 0); Mat iiToShow; resize(iiIm, iiToShow, sz2Sh, 0, 0, INTER_LINEAR_EXACT); vector<Point> contii = simpleContour(iiIm); float dis = mysc->computeDistance( contQuery, contii ); if ( dis<bestDis ) { bestMatch = ii; bestDis = dis; } } stringstream bestname; bestname<<path<<bestMatch<<".png"; Mat iiIm=imread(bestname.str(), 0); Mat bestToShow; resize(iiIm, bestToShow, sz2Sh, 0, 0, INTER_LINEAR_EXACT); imshow("BEST MATCH", bestToShow); moveWindow("BEST MATCH", sz2Sh.width+50,0); waitKey(); return 0; }
http://www.jsqmd.com/news/1283466/

相关文章:

  • 2026年8月沈阳甲醛检测怎么选? 只做检测、不做治理的第三方上门检测服务——醛境测研检测中心 - CMA甲醛检测
  • 2026年8月辽阳甲醛检测怎么选? 只做检测、不做治理的第三方上门检测服务——醛境测研检测中心 - CMA甲醛检测
  • MetaERP「成本中心段 / 部门段」的设计哲学,从根源、原则、架构思想、组织对齐、管控理念、与 EBS 异同、典型示例,一次性讲透(不掺实现细节,只讲 “为什么这么设计”)。一、根本哲学:继承
  • React-Selectize API完全手册:Props、方法与事件处理详解
  • 物联网设备安全芯片SE050与PIC18LF26K80实战指南
  • 3个步骤搞定Windows安全防护自定义:no-defender深度解析
  • 终极指南:5个技巧快速掌握Obsidian Modular CSS Layout多列布局
  • TI bq77910A BMS评估模块硬件解析与软件配置实战指南
  • 在 PHP 应用中处理限流和 API 节流:扩展、防滥用的最佳实践
  • AI智能PPT工具:从内容架构到视觉设计的自动化实践
  • 2026年广东深圳建筑资质代办机构推荐榜:专业高效、合规无忧的资质办理优选指南 - 优企名品
  • 2026年8月十堰甲醛检测怎么选? 只做检测、不做治理的第三方上门检测服务——醛境测研检测中心 - CMA甲醛检测
  • 2026年8月聊城甲醛检测怎么选? 只做检测、不做治理的第三方上门检测服务——醛境测研检测中心 - CMA甲醛检测
  • 终极快速虚拟机管理指南:Quickemu让多系统测试变得简单
  • 解决DragListView常见问题:从冲突处理到性能优化
  • MetaERP 与 Oracle EBS 绝非 “一样”—— 业务层逻辑相通,但设计哲学、技术架构、实现逻辑完全不同。下面从设计哲学、实现逻辑、模块对照与实例、关键差异四方面展开,帮你彻底看清二者的同
  • 计算机毕业设计之Hadoop技术下的校园二手交易系统的设计与实现
  • 视频孪生三剑客底层大考:当黎阳之光与潭龙东海还在“画”模型,镜像视界已在“算”坐标
  • 深度剖析AirportBrcmFixup代码:内核补丁实现原理与关键函数解析
  • Unity Slider组件深度解析:从核心原理到高级交互实战
  • 家装选材,2026年佛山木纹砖品牌盘点,附木纹砖通用选材参考要点
  • 2026年8月临沧甲醛检测怎么选? 只做检测、不做治理的第三方上门检测服务——醛境测研检测中心 - CMA甲醛检测
  • Rooster HD-EV培养基解析:MSC外泌体连续生产、低颗粒背景与3D放大工艺
  • 2026年8月石家庄甲醛检测怎么选? 只做检测、不做治理的第三方上门检测服务——醛境测研检测中心 - CMA甲醛检测
  • 2026年7月全新TCL电视售后服务电话24小时400人工热线全面正式启用公告 - 全国网点服务中心
  • 拒绝“裸奔”!一文看懂商标注册“硬核”商业价值
  • 基于stm单片机家庭环境监测系统
  • 开发者必看:ZK Bug Tracker中的约束不足漏洞与修复实例
  • 5分钟彻底清理Windows驱动垃圾:DriverStore Explorer终极指南
  • 如何用Caddy WAF实现GeoIP拦截?3步配置国家黑白名单