OpenCV学习三十二:HU矩以及Zernike矩

版权声明:共享知识,欢迎转载 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版下载连接:

https://download.csdn.net/download/kakiebu/10620202

猜你喜欢

转载自blog.csdn.net/kakiebu/article/details/81947042