OpenCV中如何基于Hu矩实现轮廓匹配
发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,这篇文章将为大家详细讲解有关OpenCV中如何基于Hu矩实现轮廓匹配,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、查找轮廓原图测试图vector>findCon
千家信息网最后更新 2025年02月08日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安全错误
数据库的锁怎样保障安全
联想总是提示代理服务器问题
腾讯科技移动互联网大会
互联网科技人才引进
联通宽带服务器连接失败
小米2无法连接服务器
科技公司范围包含软件开发吗
mysql建立班级表数据库
数据库底层库什么意思
数据库支持那三大数据类型
华为云服务器防火墙转发配置
怎么查看数据库服务
网络安全手抄报 步骤
归档日志恢复数据库
软件开发转行快递
群发邮件用什么服务器
网络安全学习培训视频
网上手机销售数据库设计报告
楚上网络技术
网络安全抖音脚本
自噬转录因子数据库
扬州网络技术服务企业
著名软件开发公司排名
美信网络技术有效公司
余姚虚拟服务器
阿南网络技术是什么
国互联网科技有限公司官网
汾阳市委网络安全宣传
网络安全华迪实训体会
服务器中的前端目录
怎样做好一个数据库