OpenCV中如何基于Hu矩实现轮廓匹配
发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,这篇文章将为大家详细讲解有关OpenCV中如何基于Hu矩实现轮廓匹配,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、查找轮廓原图测试图vector>findCon
千家信息网最后更新 2025年11月14日OpenCV中如何基于Hu矩实现轮廓匹配
这篇文章将为大家详细讲解有关OpenCV中如何基于Hu矩实现轮廓匹配,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
一、查找轮廓
原图

测试图
vector>findContour(Mat Image){ Mat gray; cvtColor(Image, gray, COLOR_BGR2GRAY); Mat thresh; threshold(gray, thresh, 0, 255, THRESH_BINARY_INV | THRESH_OTSU); vector >contours; findContours(thresh, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE); vector >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#include using namespace std;using namespace cv;vector >findContour(Mat Image){ Mat gray; cvtColor(Image, gray, COLOR_BGR2GRAY); Mat thresh; threshold(gray, thresh, 0, 255, THRESH_BINARY_INV | THRESH_OTSU); vector >contours; findContours(thresh, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE); vector >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 >src_contours; vector >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中如何基于Hu矩实现轮廓匹配"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
轮廓
相似
程度
篇文章
原图
效果
更多
知识
如图
测试
不错
实用
最小
相同
成功
接下来
两个
代码
代表
内容
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
河北红色文化馆软件开发公司
dash软件开发
软件开发人员的交接清单
知名的数据库实例
网络安全攻防体系
谷歌哪个版本可以连服务器
对方服务器拒绝
四川卫星同步数显钟服务器云主机
深圳网络安全技术协会
广州建行软件开发中心
滴滴网络安全工程师
崇明区优势软件开发服务不二之选
漯河金蝶销售软件开发
计算机软件开发哪家可靠
网络技术是哪个学科
三级网络技术视频 百度网盘
上海诚信网络技术开发常见问题
网络安全写作金句
公司数据库管理方法
数据库怎么求解闭包问题
网络安全数据保护隐私保护
互联网科技泛
人民银行网络安全招标
戴尔双路服务器二手
数据库将值写到角标
对方服务器拒绝
百度云盘服务器忙
强化网络安全的技术手段
全世界网络安全会议
大学生网络安全征文800字