本文将使用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);skt冠军皮肤原画 vector<ve计算机一级和二级哪个高ctor<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;}
如图所示,这就是找到的最外轮廓。接下来,我们基于轮廓进行匹配。
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_s在水伊人rc = 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("pau"); 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("pau"); return 0;}
本文使用opencv c++基于hu矩轮廓匹配,关键步骤有以下几点。
1、查找轮廓。在这里,我是基于最外轮廓进行匹配。
2、计算轮廓的hu矩,然后使用matchshapes计算两hu矩的距离,以此来判断匹配程度。
到此这篇关于opencv实战之基于hu矩实现轮廓匹配的文章就介绍到这了,更多相关opencv hu矩轮廓匹配内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 14:21:49,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/9cf4a9a9208ca48d44ae699440e9412d.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:OpenCV实战之基于Hu矩实现轮廓匹配.doc
本文 PDF 下载地址:OpenCV实战之基于Hu矩实现轮廓匹配.pdf
留言与评论(共有 0 条评论) |