OpenCV中如何基于Hu矩实现轮廓匹配
发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,这篇文章将为大家详细讲解有关OpenCV中如何基于Hu矩实现轮廓匹配,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、查找轮廓原图测试图vector>findCon
千家信息网最后更新 2024年12月12日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安全错误
数据库的锁怎样保障安全
服务器地区不选择本地可以吗
《网络安全 人人有责》
辽宁网络软件开发定制均价
app软件开发商哪家靠谱
网络安全工程师的电脑
软件开发面试问题 研究生
数据库表一般保存在哪里
管理软件开发
柳州市互联网掌上科技
第一届网络安全自主可控
数据库 特性
网络数据采集服务器
广东服务器机柜公司
软件开发转测试面试
菲律宾电脑软件开发行业
幻塔服务器已关闭是什么意思
网络技术费的会计账务处理
远程登录服务器出现安全登录
公司软件开发行政功能
网络安全黑板报的标语
数据库的授权语句
知网万方数据库优劣比较
我的世界服务器免费租用
镇网络安全宣传
网络技术应用化学
上海奂恒网络技术有限责任公司
500左右服务器主机推荐
电脑进入带网络安全模式
bms软件开发是干什么
华为外包常用的数据库