首页 > 作文

OpenCV实战之基于Hu矩实现轮廓匹配

更新时间:2023-04-04 14:21:51 阅读: 评论:0

目录
前言一、查找轮廓二、计算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);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;}

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

二、计算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_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 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图