矩的概念介绍
1.矩是描述图像特征的算子
图形矩(Image Moments)- 求取图像质心,面积,长度
1.几何矩(空间矩)- P(x,y) —像素值,x,y x,yx,y表示像素点的位置,有各阶矩
空间矩的实质为面积或者质量。可以通过一阶矩计算质心/重心
2.中心矩- mu(ji)
中心矩体现的是图像强度的最大和最小方向(中心矩可以构建图像的协方差矩阵)
其只具有平移不变性,所以用中心矩做匹配效果不会很好
3.中心归一化矩- nu(ji)
归一化后具有尺度不变性
4.Hu矩
由于具有尺度、旋转、平移不变性,可以用来做匹配
中心矩计算公式
中心距与中心归一化距是几何矩的变种,矩用来对二值图像的轮廓进行计算从而得到图像的轮廓特征
弧矩(用来进行模式识别)…还有很多其他的矩
图像中心Center: 与对象的位置有关系,是对象的质心位置
Center(x_0, y_0)
x0=m10/m00
y0=m01/m00
API介绍与使用cv::moments计算生成数据
图像矩计算API
moments()函数用来计算多边形和光栅形状的最高达三阶的所有矩
求出图像从1阶到3阶的所有图像矩用来计算形状的重心、面积、主轴和其他形状特征
得到的结果是存储了几何矩、中心距、中心归一化矩的结果
moments
(
InputArray array,//输入数据为findContours()计算出来的数据
bool binaryImage=false//是否为二值图像
)
计算出轮廓的面积(用来计算整个轮廓或部分轮廓的面积)
contourArea
(
InputArray contour,//输入轮廓数据
bool oriented//默认false,返回绝对值
)
计算出轮廓曲线的弧长(用来计算封闭轮廓的周长或曲线的长度)
arcLength
(
InputArray curve,//输入曲线数据
bool closed//是否是封闭曲线
)
步骤
- 转灰度cvtColor
- 提取图像边缘Canny
- 发现轮廓findContours
- 计算每个轮廓对象的矩moments
- 计算每个对象的中心、弧长、面积contourArea arcLength
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
Mat src, dst,srcgray;
int thre = 50,threMax=255;
int CSize;
int kksize = 1;
int dp = 1;
int mindist = 39;
int thlow = 100;
int thcp = 33;
int minr = 94;
int maxr = 157;
int Max = 250;
void Moment(int, void*);
int main()
{
src = imread("D:/实验台/机器视觉/测试图片/硬币2.jpg");
if (src.empty())//如果src这个数据库属性为空
{
cout << "无法打开" << endl;
return -1;
}
imshow("原图", src);
//检测不规则轮廓前要进行灰度处理和高斯模糊等预处理
//cvtColor(src, srcgray, CV_BGR2GRAY);
//GaussianBlur(srcgray, srcgray, Size(3, 3), 0, 0);
namedWindow("图形矩", CV_WINDOW_AUTOSIZE);
namedWindow("圆检测参数调节", CV_WINDOW_NORMAL);
createTrackbar("阈值调节", "图形矩", &thre, threMax, Moment);
createTrackbar("轮廓阈值", "图形矩", &CSize, threMax, Moment);
createTrackbar("中值滤波核子大小", "圆检测参数调节", &kksize, Max, Moment);
createTrackbar("检测尺度", "圆检测参数调节", &dp, Max, Moment);
createTrackbar(