OpenCV C++案例实战八《基于Hu矩轮廓匹配》

  • 前言
  • 一、查找轮廓
  • 二、计算Hu矩
  • 三、显示效果
  • 四、源码
  • 总结

前言

本文将使用OpenCV C++ 基于Hu矩进行轮廓匹配。

一、查找轮廓

原图

测试图

vector<vector<Point>>findContour(Mat Image)
{Mat gray;cvtColor(Image, gray, COLOR_BGR2GRAY);Mat thresh;threshold(gray, thresh, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);vector<vector<Point>>contours;findContours(thresh, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);vector<vector<Point>>EffectConts;for (int i = 0; i < contours.size(); i++){double area = contourArea(contours[i]);if (area > 1000){EffectConts.push_back(contours[i]);}}return EffectConts;
}


如图所示,这就是找到的最外轮廓。接下来,我们基于轮廓进行匹配。

二、计算Hu矩

OpenCV提供moments API计算图像的中心矩;HuMoments API用于中心矩计算Hu矩。关于moments HuMoments相关知识请大家自行查找。

 Moments m_test = moments(test_contours[0]);Mat hu_test;HuMoments(m_test, hu_test);double MinDis = 1000;int MinIndex = 0;for (int i = 0; i < src_contours.size(); i++){Moments m_src = moments(src_contours[i]);Mat hu_src;HuMoments(m_src, hu_src);double dist = matchShapes(hu_test, hu_src, CONTOURS_MATCH_I1, 0);if (dist < MinDis){MinDis = dist;MinIndex = i;}}

上面代码段大致思路是:首先计算测试图的Hu矩;然后使用一个for循环计算原图中所有轮廓的Hu矩,依次计算两Hu矩的相似程度。在这里使用matchShapes API计算两个Hu矩。函数返回值代表两Hu矩的相似程度。完全相同返回值为0。即这里通过计算两Hu矩的相似程度,找到返回值最小的那个作为成功匹配。

三、显示效果

 drawContours(src, src_contours, MinIndex, Scalar(0, 255, 0), 2);Rect rect = boundingRect(src_contours[MinIndex]);rectangle(src, rect, Scalar(0, 0, 255), 2);

最终效果如图所示。

四、源码

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;vector<vector<Point>>findContour(Mat Image)
{Mat gray;cvtColor(Image, gray, COLOR_BGR2GRAY);Mat thresh;threshold(gray, thresh, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);vector<vector<Point>>contours;findContours(thresh, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);vector<vector<Point>>EffectConts;for (int i = 0; i < contours.size(); i++){double area = contourArea(contours[i]);if (area > 1000){EffectConts.push_back(contours[i]);}}return EffectConts;
}int main()
{Mat src = imread("test/hand.jpg");Mat test = imread("test/test-3.jpg");if (src.empty() || test.empty()){cout << "No Image!" << endl;system("pause");return -1;}vector<vector<Point>>src_contours;vector<vector<Point>>test_contours;src_contours = findContour(src);test_contours = findContour(test);Moments m_test = moments(test_contours[0]);Mat hu_test;HuMoments(m_test, hu_test);double MinDis = 1000;int MinIndex = 0;for (int i = 0; i < src_contours.size(); i++){Moments m_src = moments(src_contours[i]);Mat hu_src;HuMoments(m_src, hu_src);double dist = matchShapes(hu_test, hu_src, CONTOURS_MATCH_I1, 0);if (dist < MinDis){MinDis = dist;MinIndex = i;}}drawContours(src, src_contours, MinIndex, Scalar(0, 255, 0), 2);Rect rect = boundingRect(src_contours[MinIndex]);rectangle(src, rect, Scalar(0, 0, 255), 2);imshow("test", test);imshow("Demo", src);waitKey(0);system("pause");return 0;
}

总结

本文使用OpenCV C++基于Hu矩轮廓匹配,关键步骤有以下几点。
1、查找轮廓。在这里,我是基于最外轮廓进行匹配。
2、计算轮廓的Hu矩,然后使用matchShapes计算两Hu矩的距离,以此来判断匹配程度。

OpenCV C++案例实战八《基于Hu矩轮廓匹配》相关推荐

  1. OpenCV C++案例实战十八《抖音特效——“蓝线挑战”》

    OpenCV C++案例实战十八<抖音特效--"蓝线挑战"> 前言 一.图像扫描 二.生成定格图像 三.图像混合 四.效果显示 五.源码 总结 前言 本文将使用Open ...

  2. [OpenCV实战]10 使用Hu矩进行形状匹配

    目录 1 什么是图像矩? 2 如何计算图像矩 2.1 质心获取 2.2 中心矩 2.3 Hu矩 3 基于Hu矩实现形状匹配 3.1 Hu矩的计算 3.2 基于matchShapes函数计算两个图形之间 ...

  3. OpenCV C++案例实战二十九《遥感图像分割》

    OpenCV C++案例实战二十九<遥感图像分割> 前言 一.准备数据 二.K-Means分类 三.效果显示 四.源码 总结 前言 本案例基于k-means机器学习算法进行遥感图像分割.主 ...

  4. OpenCV4学习笔记(23)——几何矩、中心矩、归一化矩和Hu矩的计算,以及基于Hu矩的轮廓匹配

    在上次的笔记中,整理记录了有关轮廓发现及轮廓信息提取的一部分内容,同时还记录了Hu矩的计算方式,今天就来记录一下Hu矩的一个应用--轮廓匹配. 在<OpenCV学习笔记(19)--模板匹配> ...

  5. OpenCV C++案例实战三《二维码检测》

    OpenCV C++案例实战三<二维码检测> 前言 一.二维码检测 二.二维码识别 1.通过findContours找到轮廓层级关系 三.二维码绘制 四.源码 总结 前言 本文将使用Ope ...

  6. OpenCV C++案例实战五《答题卡识别》

    OpenCV C++案例实战五<答题卡识别> 前言 一.图像矫正 1.源码 二.获取选项区域 1.扣出每题选项 2.源码 三.获取答案 1.思路 2.辅助函数 3.源码 4.效果 总结 前 ...

  7. OpenCV C++案例实战六《绿幕视频背景替换》

    OpenCV C++案例实战六<绿幕视频背景替换> 前言 一.图像预处理 二.HSV色彩空间转换 1. cvtColor色彩空间转换 2. inRange抠图 三.背景替换 四.源码 总结 ...

  8. 【OpenCV C++ 案例实战一】实现双人篮球游戏

    [OpenCV C++ 案例实战一]实现双人篮球游戏 概述 一. 预处理 1.1定义结构体 1.2背景处理 1.3篮球处理 二.项目实现 2.1篮球放置(角色放置同理) 2.2篮球移动(角色移动同理, ...

  9. OpenCV C++案例实战二《生成蒙太奇图像》

    OpenCV C++案例实战二<生成蒙太奇图像> 前言 一.输入模板图像 二.读取素材图像 三.生成蒙太奇模板 四.生成蒙太奇图像 五.源码 总结 前言 本文将使用OpenCV C++ 生 ...

最新文章

  1. VS2008中配置 Windows SDK v7
  2. 使用page-slot显示SAP Spartacus section里包含的Component和layout设计
  3. [蓝桥杯2017初赛]方格分割-dfs+思维
  4. 厉害了!牛顿法深度学习优化器,效果比肩SGD和Adam
  5. 阿里云云计算 34 RDS的概念
  6. Cisco Packet Tracer 6.2 安装教程 | 计算机网络
  7. php redis 实时聊天,php+redis聊天室
  8. Hexo博客主题安装及Next主题个性化修改
  9. 计算机硬盘与格式化,什么是磁盘格式化 格式化与快速格式化区别 - 驱动管家...
  10. excel2010 向程序发送命令时出现问题
  11. 9月25日百度大脑开放日人像特效专场火热报名中!
  12. Solr Facet 统计查询
  13. 机械硬盘启动失败,总是转一下挺停一下
  14. 简单教你贴-iPhone新一代超薄卡贴
  15. 零基础开发--歌曲管理系统
  16. 日本最大的120家医用物资供应商列表
  17. 铁姆肯公司收购Aurora轴承公司
  18. 斐波那契兔子问题(递归实现)
  19. wolframalpha最新版_Wolfram Alpha安装包-数学工具wolfram alpha最新版1.4.4.2018021301下载_飞翔下载...
  20. The Swift Programming Language swift 4 下载地址

热门文章

  1. Swig超详细入门教程(Java调用C/C++, CMake)——更新于2021.12
  2. 源声家电维修资料查询系统 v3.0 怎么用
  3. 艰难的辞职,完美的新生。
  4. 黑马程序员—关于黑马,关于学习,关于求职,关于工作
  5. 未来网络安全十大趋势
  6. linux uefi U盘安装
  7. Intellij IDEA官方最完美编程字体Mono
  8. 关于ubuntu14中libgomp.so.1:version 'GOMP_4.0' not fount问题的解决方案
  9. JAVA使用正则表达式校验手机号码
  10. 日语助词の的语法汇总附带例句,请牢记