图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

轮廓矩用来干嘛?说实话,我是没有找到相关文章专门介绍,不过有一篇文章还算是介绍吧,虽然我觉得介绍的不是很好,链接是Hu矩_传奇的专栏-CSDN博客_hu矩 文中提到说轮廓矩具有旋转、缩放和平移不变性,这几个特性不错,可以应用到图像识别中,具体怎么应用我现在也不知道,以后再说吧!

说下我的理解吧,除了上面提到的优良特性,其实矩可以看作一种常用的中间变量,把它先算出来后可以进一步计算其它的量,比如下面的代码中用矩来计算与外接椭圆相关的参数。

下面上代码吧,我已经把注释写得很清楚了,一看就明白,就不用多说了!

//OpenCV版本3.0.0
//图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
//图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/features2d/features2d.hpp"
#include <stdlib.h>
#include <stdio.h>
using namespace cv;
using namespace std;
// 计算图像矩
void cacMoments(cv::Mat src)
{Mat srcGray;vector<vector<Point> > contours;vector<Vec4i> hierarchy;// 高斯滤波GaussianBlur( src, src, Size(3,3), 0.1, 0, BORDER_DEFAULT );// 灰度转换cvtColor(src, srcGray, CV_RGB2GRAY);// 轮廓边界检测findContours(srcGray, contours, hierarchy,CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));// 绘制边界//drawContours(src, contours, -1, cvScalar(0,0,255));printf("Number of contours: %d\n", (int)contours.size());// 计算轮廓矩vector<Moments> mu(contours.size());for(int i = 0; i < (int)contours.size(); i++){mu[i] = moments(contours[i], false);}// 分析矩计算图像相关特征for(int i = 0; i < (int)contours.size(); i++){int area = mu[i].m00; //外接椭圆的面积int cx = mu[i].m10/mu[i].m00;//外接椭圆重心的x坐标int cy = mu[i].m01/mu[i].m00;//外接椭圆重心的y坐标int perimeter = arcLength(contours.at(i), true);//外接椭圆的边界轮廓长度// 椭圆RotatedRect rRect;double orientation=0;//外接椭圆较立式椭圆的倾斜角度double orientation_rads=0;//外接椭圆较立式椭圆的倾斜弧度double majorAxis=0;//外接椭圆的实轴长度double minorAxis=0;//外接椭圆的虚轴长度double roundness=0;//外接椭圆的圆形度double eccentricity=0;//外接椭圆的离心率double ratio=0; //外接椭圆实轴与虚轴长度之比(放大了一百倍,相当于百分比)double diameter=0; //这个参数不知道是什么意思if (contours[i].size() > 5){rRect = fitEllipse(contours.at(i));orientation = rRect.angle;//外接椭圆较立式椭圆的倾斜角度orientation_rads = orientation*3.1416/180; ;//外接椭圆较立式椭圆的倾斜弧度majorAxis = rRect.size.height > rRect.size.width ? rRect.size.height : rRect.size.width;//外接椭圆的实轴长度minorAxis = rRect.size.height > rRect.size.width ? rRect.size.width : rRect.size.height;//外接椭圆的虚轴长度roundness = pow(perimeter, 2)/(2*3.1416*area); //外接椭圆的圆形度eccentricity = sqrt(1-pow(minorAxis/majorAxis,2));//外接椭圆的离心率ratio = (minorAxis / majorAxis) * 100;//外接椭圆实轴与虚轴长度之比(放大了一百倍,相当于百分比)diameter = sqrt((4*area)/3.1416);//这个参数不知道是什么意思}// 输出相关特征信息printf("Area(第%d个外接椭圆的面积): %d\n", i,area);printf("Perimeter(第%d个外接椭圆的边界轮廓长度): %d\n", i,perimeter);printf("Major Axis(第%d个外接椭圆的实轴长度): %.1f\n",i, majorAxis);printf("Minor Axis(第%d个外接椭圆的虚轴长度): %.1f\n",i, minorAxis);printf("Orientation(第%d个外接椭圆的倾斜角度): %.1f\n",i, orientation);printf("Roundness(第%d个外接椭圆的圆形度): %.1f\n",i, roundness);printf("Eccentricity(第%d个外接椭圆的离心率): %.1f\n",i, eccentricity);printf("Ratio(第%d个外接椭圆实轴与虚轴长度之比(放大了一百倍,相当于百分比)): %.1f\n",i, ratio);//printf("Diameter(这个参数不知道是什么意思): %.1f\n",i, diameter);printf("\n");绘制外接椭圆ellipse(src, rRect, cvScalar(0,255,0));}cv::imshow( "result", src);
}
int main(){cv::Mat srcImage = imread("test.jpg");if( !srcImage.data )return -1; cv::imshow( "srcImage", srcImage );// 计算轮廓矩cacMoments(srcImage);  cv::waitKey(0);return(0);
}

运行结果如下图所示:

图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

使用OpenCV计算图像的轮廓矩的代码相关推荐

  1. python图片相似度计算_python Opencv计算图像相似度过程解析

    这篇文章主要介绍了python Opencv计算图像相似度过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.相关概念 一般我们人区分谁是谁 ...

  2. 使用Python,OpenCV计算图像直方图(cv2.calcHist)

    使用Python,OpenCV计算图像直方图(cv2.calcHist 1. 效果图 2. 原理 2.1 什么是图像直方图? 2.2 计算直方图 2.3 可视化蒙版区域 3. 源码 参考 这篇博客将介 ...

  3. 利用OpenCV进行图像的轮廓检测

    简 介: 本文对于OpenCV中的轮廓检测算法进行了讨论,可以看到一些基于轮廓检测的应用.接着对四种不同的提取方式的结果进行了讨论.你还了解了如何将轮廓进行绘制的方法. 关键词: 轮廓检测,二值化 § ...

  4. opencv计算图像的水平投影和垂直投影

    本文介绍使用opencv实现计算一幅图像的水平投影和垂直投影,代码如下: class HorizontalProjection { private:int maxLine;//255最大行位置int ...

  5. OpenCV——计算图像均值和标准方差

    图像的均值表示图像整体的亮暗程度,图像的均值越大图像整体越亮.标准方差表示图像中明暗变化的对比程度,标准差越大表示图像中明暗变化越明显. 计算图像均值 计算图像每个通道的均值 Scalar mean( ...

  6. C++ opencv计算图像的水平投影,并返回一幅图像

    效果图 输入图像 输出图像 代码 //计算图像的水平投影,并返回一幅图像 cv::Mat getVerProjImage(const cv::Mat &image) {cv::Mat matT ...

  7. OpenCV计算图像的平均值和标准差的函数meanStdDev函数的使用

    计算一个矩阵的平均值和标准差,每个通道都是独立的,通过以下输出参数获取返回值: [N=∑I,mask(I)≠01meanc=∑I:mask(I)≠0src(I)cNstddevc=∑I:mask(I) ...

  8. 【OpenCv】图像的轮廓查找

    1 原理   边界或者轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.轮廓在形状分析和物体的检测和识别中很有用. 在机器视觉领域最常用的轮廓查找的算法之一是 Moore ...

  9. OpenCV计算图像梯度

    文章目录 Sobel算子 Scharr算子 Laplacian算子 不同算子直接的比较 Sobel算子 如何理解梯度? 我们可以把梯度理解为一个图像的边界点. 如何计算梯度,我们可以之前定义kerne ...

最新文章

  1. 重新学习Ubuntu -- 截图软件的选择和安装
  2. Java中封装、关键字及构造方法
  3. 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 xor (根号分治)
  4. asp和php漏洞,ASP_实例分析ASP上传漏洞入侵实战及扩展,【上传漏洞欺骗技术】 - phpStudy...
  5. 如何将java项目部署到Linux服务器上
  6. 手工清除severe.exe病毒
  7. 局域网电脑使用同一台鼠标键盘控制
  8. 《善用佳软:高效能人士的软件应用之道》一2.5 PDF:跨平台文档解决方案
  9. 安国主控,U盘量产,起死回生
  10. java 图片画框并读取成base64数据
  11. 马哥教育SRE第五周作业
  12. 银行半结构化面试题目汇总
  13. UE4快速实现涂鸦功能
  14. 30天突破英语口语!(MP3版)
  15. py233基于 python的诚交大学生二手交易平台Django#毕业设计
  16. 浅谈Java中try catch 的用法
  17. 怎么进行用户体验与可用性测试?
  18. 关于腾讯云服务器使用FTP详细配置教程
  19. 为论文添加目录的方法
  20. setFocus不能生效的问题

热门文章

  1. python快速入门答案-Python 开发 14 天快速入门
  2. python turtle画熊-Python使用turtle库绘制小猪佩奇(实例代码)
  3. python文件输出-python将控制台输出保存至文件的方法
  4. python三层装饰器-python3装饰器
  5. python里面的之前打过的记忆信息-python中的if __name__ == 'main'
  6. python不想学了-十分钟也学不会python?就不要学python了
  7. 如何用python画数据图-关于如何使用Python绘制基本数据图形模型
  8. 零基础自学python教程-零基础入门学习Python_Python教程
  9. python免费试听-哈尔滨Python人工智能课程免费试听
  10. 零基础自学python看什么书-零基础想要学习Python编程 ,不知道看哪本书?