版权声明:共享知识,欢迎转载 https://blog.csdn.net/kakiebu/article/details/81947042
cv::moments (InputArray array,bool binaryImage = false)
array:输入数组,可以是光栅图像(单通道,8-bit或浮点型二维数组),或者是一个二维数组(1 X N或N X 1),二维数组类型为Point或Point2f(我记得这里输入二值图片和 FindContours 的结果 contours[i]逐个输入 都可以)
binaryImage:默认值是false,如果为true,则所有非零的像素都会按值1对待,也就是说相当于对图像进行了二值化处理,阈值为1,此参数仅对图像有效。
void HuMoments(const Moments& moments, double* hu)¶
const Moments& moments:Moments的输出
double* hu:的计算结果
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
// 第一种写法
Mat image = imread("./Image/Shape_0.png");
cvtColor(image, image, CV_BGR2GRAY);
Moments mts = moments(image);
double hu[7];
HuMoments(mts, hu);
for (int i=0; i<7; i++)
{
cout << log(abs(hu[i])) <<endl;
}
cout << endl << endl << endl ;
// 第二种写法
vector<vector<Point>> contours;
vector<Vec4i> hierachy;
findContours(image, contours, hierachy, RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
for (int i=0; i<contours.size(); i++)
{
Moments mts2 = moments(contours[i]);
HuMoments(mts2, hu);
cout << "i = " << i << endl;
for (int j=0; j<7; j++) {
cout << log(abs(hu[j])) <<endl;
}
cout << endl << endl << endl;
}
getchar();
return 0;
}
PDF版下载连接: