OpenCV基于DLCO描述子匹配

OpenCV学堂 2022-07-02 00:00

点击上方蓝字关注我们

微信公众号:OpenCV学堂

关注获取更多计算机视觉与深度学习知识

一:局部特征描述子介绍

2014年VGG发表了一篇基于凸优化的局部特征描述子学习(DLCO)的论文,OpenCV3.2以后在扩展模块中对该论文的完成了代码实现并发布了API支持,提供了基于DLCO的描述子生成支持、基于生成的描述子,可以实现图像特征匹配的对象识别。关于特征描述子学习相关的细节可以看这里:

http://www.robots.ox.ac.uk/~vgg/software/learn_desc/

提供了描述子模型,学习数据,C++版本实现的源代码下载

二:OpenCV程序演示

OpenCV中VGG的DLCO描述子生成支持下面几种

  • VGG_120 = 100,

  • VGG_80 = 101,

  • VGG_64 = 102,

  • VGG_48 = 103

默认支持输出描述子是120个向量即VGG_120。基于DLCO在OpenCV中代码实现对象检测与匹配大致分为如下几步:

1.加载图像

  1. Mat box = imread("D:/vcprojects/images/box.png");

  2. Mat scene = imread("D:/vcprojects/images/box_in_scene.png");

  3. imshow("box image", box);

  4. imshow("scene image", scene);

2.关键点检测(SURF)

  1. Ptr<SURF> detector = SURF::create();

  2. int minHessian = 400;

  3. vector<KeyPoint> keypoints_1, keypoints_2;

  4. detector->setHessianThreshold(minHessian);

  5. detector->detect(box, keypoints_1);

  6. detector->detect(box_scene, keypoints_2);

3.描述子生成(DLCO)

  1. Ptr<VGG> vgg_descriptor = VGG::create();

  2. Mat descriptors_1, descriptors_2;

  3. vgg_descriptor->compute(box,  keypoints_1, descriptors_1);

  4. vgg_descriptor->compute(box_scene, keypoints_2, descriptors_2);

4.特征匹配实现对象识别

  1. // 计算匹配点

  2. FlannBasedMatcher matcher;

  3. std::vector< DMatch > matches;

  4. matcher.match(descriptors_1, descriptors_2, matches);

  5. double max_dist = 0; double min_dist = 100;

  6. // 计算最大与最小距离

  7. for (int i = 0; i < descriptors_1.rows; i++)

  8. {

  9.    double dist = matches[i].distance;

  10.    if (dist < min_dist) min_dist = dist;

  11.    if (dist > max_dist) max_dist = dist;

  12. }

  13. printf("-- Max dist : %f \n", max_dist);

  14. printf("-- Min dist : %f \n", min_dist);

  15. // 寻找最佳匹配,距离越小越好

  16. std::vector< DMatch > good_matches;

  17. for (int i = 0; i < descriptors_1.rows; i++)

  18. {

  19.    if (matches[i].distance <= min(2 * min_dist, 1.5))

  20.    {

  21.        good_matches.push_back(matches[i]);

  22.    }

  23. }

  24. // 绘制最终匹配点

  25. Mat img_matches;

  26. drawMatches(box, keypoints_1, box_scene, keypoints_2,

  27.    good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),

  28.    vector(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

  29. //-- Localize the object

  30. std::vector<Point2f> obj;

  31. std::vector<Point2f> scene;

  32. for (size_t i = 0; i < good_matches.size(); i++)

  33. {

  34.    //-- Get the keypoints from the good matches

  35.    obj.push_back(keypoints_1[good_matches[i].queryIdx].pt);

  36.    scene.push_back(keypoints_2[good_matches[i].trainIdx].pt);

  37. }

  38. Mat H = findHomography(obj, scene, RANSAC);

  39. //-- Get the corners from the image_1 ( the object to be "detected" )

  40. std::vector<Point2f> obj_corners(4);

  41. obj_corners[0] = cvPoint(0, 0); obj_corners[1] = cvPoint(box.cols, 0);

  42. obj_corners[2] = cvPoint(box.cols, box.rows); obj_corners[3] = cvPoint(0, box.rows);

  43. std::vector<Point2f> scene_corners(4);

  44. perspectiveTransform(obj_corners, scene_corners, H);

  45. //-- Draw lines between the corners (the mapped object in the scene - image_2 )

  46. line(img_matches, scene_corners[0] + Point2f(box.cols, 0), scene_corners[1] + Point2f(box.cols, 0), Scalar(0, 255, 0), 4);

  47. line(img_matches, scene_corners[1] + Point2f(box.cols, 0), scene_corners[2] + Point2f(box.cols, 0), Scalar(0, 255, 0), 4);

  48. line(img_matches, scene_corners[2] + Point2f(box.cols, 0), scene_corners[3] + Point2f(box.cols, 0), Scalar(0, 255, 0), 4);

  49. line(img_matches, scene_corners[3] + Point2f(box.cols, 0), scene_corners[0] + Point2f(box.cols, 0), Scalar(0, 255, 0), 4);

  50. //-- Show detected matches

  51. imshow("Good Matches & Object detection", img_matches);

原图:

特征匹配结果


为山者基于一篑之土,以成千丈之峭


扫码查看OpenCV+OpenVIO+Pytorch系统化学习路线图


 推荐阅读 

CV全栈开发者说 - 从传统算法到深度学习怎么修炼

2022入坑深度学习,我选择Pytorch框架!

Pytorch轻松实现经典视觉任务

教程推荐 | Pytorch框架CV开发-从入门到实战

OpenCV4 C++学习 必备基础语法知识三

OpenCV4 C++学习 必备基础语法知识二

OpenCV4.5.4 人脸检测+五点landmark新功能测试

OpenCV4.5.4人脸识别详解与代码演示

OpenCV二值图象分析之Blob分析找圆

OpenCV4.5.x DNN + YOLOv5 C++推理

OpenCV4.5.4 直接支持YOLOv5 6.1版本模型推理

OpenVINO2021.4+YOLOX目标检测模型部署测试

比YOLOv5还厉害的YOLOX来了,官方支持OpenVINO推理


OpenCV学堂 专注计算机视觉开发技术分享,技术框架使用,包括OpenCV,Tensorflow,Pytorch教程与案例,相关算法详解,最新CV方向论文,硬核代码干货与代码案例详解!作者在CV工程化方面深度耕耘15年,感谢您的关注!
评论
  • ​摘要:低价大流量卡正全面退市,政策收紧已成定局。面对传统号卡的不确定性,随身WiFi凭借稳定连接、多设备共享、独立设备和灵活套餐等优势,成为务实可靠的备选方案。1、流量卡黄金时代要结束了通信行业正迎来一场前所未有的“地震式”调整——曾让无数用户追捧的低价大流量卡,正在全速退出各大平台。这早已不是一次普通的竞合,而是一场趋势性的行业洗牌。回望过去,19元200G的神卡,那时真是“睡着都能笑醒”,便宜到不敢相信,爽到忍不住炫耀。那些日子,好像随便刷、随便看,流量自由触手可及。可如今,回头再看,那种
    爱上电路设计 2026-08-03 10:21 128869浏览
  • 摘要在防爆电气设计中,只参照芯数选型而忽略额定载流量,长期满负荷运行会出现插头发热、接触面氧化、IP67 密封受热老化等问题。结合常用 3 针 3 孔、4 芯、5PIN、8PIN 圆形防爆连接器,制作分级电流参数对照表,区分冷压免焊接、焊接两种接线结构的安全载流数值,设置合理电流冗余系数,搭配使用环境修正参数,规范防爆接近开关连接器、防爆法兰插座的选型计算方式。关键词圆形防爆连接器,载流参数表,防爆法兰插座,防爆端子接头,IP67 防爆防水接插件1 产品概述圆形防爆连接器触点载流能力由插针直径、
    kyfbest科迎法电气 2026-08-03 09:18 128642浏览
  • 在前六期中,我们已经分别讨论了 CRA 的适用范围、整体影响、漏洞通报义务、风险评估与技术文档证据链、第三方组件与 SBOM 供应链治理,以及产品上市后的支持期、安全更新、用户说明和终止支持管理。到这里,企业已经能够回答几个核心问题:产品是否落入 CRA 适用范围,产品由哪些组件构成,企业如何证明自己在设计、开发和上市前采取了必要的安全措施,以及产品上市后如何持续维护和安全下线。但对于真正准备落地 CRA 合规的企业来说,还有一个更现实的问题:CRA 的法规条文相对原则化,企业应当如何把“网络安
    虹科云科技 2026-08-03 16:51 149219浏览
  •        很多人只见过封装在SMD外壳里的小尺寸晶振,却不知道一颗2016、1612甚至1210封装的微型石英晶振,从一块巴掌大的石英原矿,到最终能稳定起振的成品,要经过十几道精密工序。它内部的石英晶片厚度最薄不到20微米,比普通A4纸的1/5还薄,整个生产过程里哪怕0.1微米的误差,都会直接废掉整批产品,这也是小尺寸晶振过去长期依赖进口,国内厂商花了十几年才啃下量产硬骨头的核心原因。1. 原石定向切割:0.01度的角度误差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 374浏览
  • 在EMC测试过程中,传导发射(Conducted Emission,CE)超标是工程师最常遇到的问题之一。更令人头疼的是,同样的超标曲线背后,可能对应着完全不同的干扰机理:有的是差模噪声沿电源回路传播,有的是共模电流通过寄生路径耦合,还有些问题甚至并非来自电源本身,而是负载、电缆布局或接地结构引起的连锁反应。 · 150kHz~1MHz 超标:多为差模噪声为主,干扰沿火线-零线回路传输。 · 1MHz~30MHz 超标:通常共模噪声占主导,干扰通过火线/零线对地回路传播。 如果条件允许,用电流探
    誉磁电磁兼容EMC 2026-07-31 18:45 501浏览
  •                                                                        
    广州铁金刚 2026-08-06 17:44 100327浏览
  • 智能宠物用品这几年快速普及,自动清理几乎成了智能猫砂盆的标配。猫咪用完离场,设备自动翻转清理,养宠家庭省去了每天弯腰清理的麻烦。但自动清理的第一步,是先准确判断猫到底在不在盆里。这个看似简单的问题,在小空间里并不容易做好。近场检测的痛点:距离太远反而误事猫砂盆内部空间有限。如果传感器的检测距离设得偏大,盆外路过的猫、人甚至物品都会被误判为猫在盆内,结果该清理时不清理、不该清理时乱清理,体验直接崩坏。这类产品的核心诉求其实就一句话:近距离、小范围、精准识别,不能有半点误判。常规感应方案常因检测距离
    唯创知音语音芯片 2026-07-31 16:51 306浏览
  • 摘要防爆自控系统同时布设本安信号、工业总线、动力供电三类线路,仅依靠标识标牌管控插接极易出现人为错插问题,高压动力回路窜入本安弱电回路会突破安全栅限能标准,产生点火风险。依托 A、D、K 标准化机械防呆编码体系,搭配护套颜色区分管理,适配 3 针 3 孔免焊接冷压增安型防爆航插、5PIN 总线防爆航空插头、8 芯焊接防爆法兰插座的选型使用,从物理结构层面杜绝防爆接近开关连接器、防爆传感器航插接头混用插接问题,补齐防爆系统被动安全防护体系。关键词圆形防爆连接器,防呆编码防爆航插,防爆航空插头,防爆
    kyfbest科迎法电气 2026-07-31 18:29 407浏览
  • 文:杜杰编辑:侯煜当地时间7月28日,美国特朗普政府落地最新科技封锁政策,美国联邦通信委员会(FCC)正式更新《受管制清单》,新增两大类设备——境外生产的先进机器人设备、境外生产的联网电力逆变器。FCC在官方情况说明书中明确,该类境外制造产品,“会对美国国家安全或美国民众的人身安全构成无法承受的风险”。本次新规设置明确豁免机制:经美国国防部(DoW)、电力逆变器品类经美国国土安全部(DHS)审核并授予“有条件批准”,认定对应设备品类不存在重大安全风险,即可获得准入豁免。同时政策严格执行新老划断原
    华尔街科技眼 2026-08-03 21:28 325浏览
  •     长期专注WiFi领域,也算是行业老兵了!同行闲聊中,时不时能提起我和我们!从疫情起,国产替代风生水起,起起落落,大浪淘沙,生存下来的都是强者!    WiFi模块应用广泛,对于高端市场和特定市场,要求WIFI模块需要过CE/FCC之类的认证,也就是说没有认证的模块,不具备导入产品设计.接下来就和大家聊聊认证模块选型参考!    WIFi模块硬件方面主要考虑以下九点特性:    1
    纳拓科技 2026-07-31 17:56 252浏览
  • 在物联网从“万物互联”迈向“万物智联”的进程中,LTE Cat.1凭借其在速率、成本与网络覆盖之间的完美平衡,正成为中低速物联网市场的绝对主力。随着2G/3G网络的逐步退网以及新国标对终端设备智能化、定位功能的强制要求,Cat.1模组迎来了爆发式的增长窗口。在这一关键节点,基于华为海思Hi2131芯片设计的LTE Cat.1模组,凭借其在能效、射频、架构及物理规格上的底层创新,成功打破了“高性能必高功耗”的传统魔咒,为行业提供了极具竞争力的连接最优解。核心技术优势:重塑Cat.1能效与连接标杆海
    用户1778981989717 2026-08-05 21:04 169浏览
  • 做蓝牙音箱的工程师大概都碰过这个局面。产品要连手机放歌,要本地播开机提示音和按键音,还要接 App 做配网和状态上报。三件事拆开,早先的常规做法是音频蓝牙一颗料、数传蓝牙一颗料、本地播放再挂一颗小 MCU 加一片 Flash。板子越画越大,BOM 越算越贵,待机电流和固件工作量也跟着涨。WT2605C 出来以后,这套需求可以集成到一颗芯片,就是 WT2605C-32N,该芯片采用QFN32 封装,4×4 毫米,把音频蓝牙、BLE 数传和 MP3 本地播放三样全包了。对蓝牙音箱来说,最实在的好处就
    唯创知音语音芯片 2026-08-06 15:14 284浏览
  • 导语在现代高速数字电路设计中,信号的完整性已不仅是理想波形推演,而是一场与物理非理想特性正面博弈的工程实践。滤波器芯片作为净化传输链路的关键屏障,其核心挑战在于:能否有效识别并滤除那些隐匿在电平跳变过程中的亚纳秒级瞬态脉冲干扰,这类干扰持续极短,却足以在高速链路中引发误触发。然而,传统函数发生器受限于采样率与边沿速率,根本无法忠实复现如此狭窄且陡峭的异常波形。针对此困境,德思特TS-AWG7000系列任意波形发生器以17 GS/s采样率与50 ps原生边沿速度,为瞬态脉冲提供精细刻画,配合SPG
    德思特测试测量 2026-08-05 14:06 5浏览
  • 产品使用18V供电,配套4串锂离子电池,需要设计一个充电器。因为输入18V,电池最高 16.8V,压差仅 1.2V。因为压差太小。使用开关型的充电控制芯片不稳定。尝试自行设计一个。整体采用分立三极管 + TL431架构,分4个功能单元:使能控制回路、限流环路、TL431 精密恒压反馈环路、PNP 功率管主功率输出回路;实现完整锂电池充电逻辑。使能控制回路按键按下:5V 电压经 R12 (2kΩ) 送入 NPN 管 Q3 基极,Q3 饱和导通,对地拉低 R1、R2 组成的分压控制节点电位;该节点直
    southcreek 2026-08-07 13:45 316浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦