iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >OpenCV中如何基于Hu矩实现轮廓匹配
  • 130
分享到

OpenCV中如何基于Hu矩实现轮廓匹配

2023-06-26 05:06:06 130人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关OpenCV中如何基于Hu矩实现轮廓匹配,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、查找轮廓原图测试图vector<vector<Point>>f

这篇文章将为大家详细讲解有关OpenCV中如何基于Hu矩实现轮廓匹配,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、查找轮廓

原图

OpenCV中如何基于Hu矩实现轮廓匹配

测试

OpenCV中如何基于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);    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;}

OpenCV中如何基于Hu矩实现轮廓匹配

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

二、计算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);

最终效果如图所示。

OpenCV中如何基于Hu矩实现轮廓匹配

OpenCV中如何基于Hu矩实现轮廓匹配

四、源码

#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("pause");        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("pause");    return 0;}

关于“OpenCV中如何基于Hu矩实现轮廓匹配”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: OpenCV中如何基于Hu矩实现轮廓匹配

本文链接: https://www.lsjlt.com/news/307030.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • OpenCV中如何基于Hu矩实现轮廓匹配
    这篇文章将为大家详细讲解有关OpenCV中如何基于Hu矩实现轮廓匹配,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、查找轮廓原图测试图vector<vector<Point>>f...
    99+
    2023-06-26
  • OpenCV实战之基于Hu矩实现轮廓匹配
    目录前言一、查找轮廓二、计算Hu矩三、显示效果四、源码总结前言 本文将使用OpenCV C++ 基于Hu矩进行轮廓匹配。 一、查找轮廓 原图 测试图 vector<vect...
    99+
    2024-04-02
  • OpenCV如何实现绘制轮廓外接矩形
    本篇内容介绍了“OpenCV如何实现绘制轮廓外接矩形”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.寻找轮廓apivoid cv...
    99+
    2023-07-04
  • OpenCV-Python如何实现轮廓拟合
    这篇文章主要介绍OpenCV-Python如何实现轮廓拟合,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言什么是轮廓?轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同 的颜色或者灰度。轮廓在形状分析...
    99+
    2023-06-15
  • 基于python如何使用OpenCV进行物体轮廓排序
    小编给大家分享一下基于python如何使用OpenCV进行物体轮廓排序,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1 引言在进行图像处理过程中,我们经常会遇到一些和物体轮廓相关的操作,比如求目标轮廓的周长面积等,我们直接...
    99+
    2023-06-22
  • 基于OpenCV的直方图匹配的实现方法
    如何为图像生成直方图,如何使直方图相等,最后如何将图像直方图修改为与其他直方图相似。 01. 什么是图像直方图? 在开始定义直方图之前,为简单起见我们先使用灰度图像,稍后再解释彩色图...
    99+
    2024-04-02
  • 如何利用Python+OpenCV实现简易图像边缘轮廓检测(零基础)
    目录前言函数基础与三方库cv.threshold(pic,thresh,maxvalue,model)cv.findContours(待处理图片,model(提取模式),method...
    99+
    2024-04-02
  • python如何基于OpenCV模板匹配识别图片中的数字
    小编给大家分享一下python如何基于OpenCV模板匹配识别图片中的数字,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!程序目标单个数字模板:(这些单个模板是我自...
    99+
    2023-06-14
  • OpenCV-Python如何实现多模板匹配
    小编给大家分享一下OpenCV-Python如何实现多模板匹配,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!多模板匹配在上一篇的实战中,我们通过人物眼睛的子图,找...
    99+
    2023-06-15
  • 基于jquery如何实现轮播图效果
    这篇文章主要讲解了“基于jquery如何实现轮播图效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于jquery如何实现轮播图效果”吧!轮播图左切换原理图黄色的方框表示的是  ...
    99+
    2023-06-14
  • 基于OpenCV如何实现动态画矩形和多边形并保存坐标
    这篇文章主要讲解了“基于OpenCV如何实现动态画矩形和多边形并保存坐标”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于OpenCV如何实现动态画矩形和多边形并保存坐标”吧!1 画矩形和多...
    99+
    2023-07-05
  • 如何实现基于opencv的行人检测
    这篇文章主要为大家展示了“如何实现基于opencv的行人检测”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现基于opencv的行人检测”这篇文章吧。基于方向梯度直方图(HOG)/线性支持向...
    99+
    2023-06-22
  • js基于myFocus如何实现轮播图效果
    这篇文章将为大家详细讲解有关js基于myFocus如何实现轮播图效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下step1.页面引入相关文件<link...
    99+
    2024-04-02
  • 基于Mediapipe+Opencv如何实现手势检测功能
    今天给大家介绍一下基于Mediapipe+Opencv如何实现手势检测功能。,文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。一、前言基于Mediapipe+Op...
    99+
    2023-06-26
  • 如何基于opencv实现简单的数字识别
    目录前言要解决的问题解决问题的思路总结前言 由于自己学识尚浅,不能用python深度学习来识别这里的数字,所以就完全采用opencv来识别数字,然后在这里分享、记录一下自己在学习过程...
    99+
    2024-04-02
  • Python OpenCV基于HSV的颜色分割如何实现
    本文小编为大家详细介绍“Python OpenCV基于HSV的颜色分割如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python OpenCV基于HSV的颜色分割如何实现”文章能帮助大家解决疑惑,下面跟着小编的...
    99+
    2023-07-02
  • Python+OpenCV如何实现基于颜色的目标识别
    这篇文章给大家介绍Python+OpenCV如何实现基于颜色的目标识别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。任务让摄像头识别到视野范围内的气球并返回每个气球的中心点坐标。因为场地固定,背景单一,所以省下来很多操...
    99+
    2023-06-22
  • OpenCV基于背景减除如何实现行人计数
    OpenCV基于背景减除如何实现行人计数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言下面将使用OpenCV C++ 对视频中的人流量进行统计。一、图像预处理原图如图所...
    99+
    2023-06-26
  • OpenCV基于稠密光流如何实现视频跟踪
    这篇“OpenCV基于稠密光流如何实现视频跟踪”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“OpenCV基于稠密光流如何实现...
    99+
    2023-07-05
  • C语言中如何实现模式匹配
    这篇文章主要介绍了C语言中如何实现模式匹配的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言中如何实现模式匹配文章都会有所收获,下面我们一起来看看吧。C语言数据结构中串的模式匹配串的模式匹配问题:朴素算法与K...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作