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

本文介绍如何使用OpenCV库计算图像的矩及Hu不变矩,通过两种不同的方式实现,一种是对整个图像进行处理,另一种是针对图像中找到的轮廓进行处理。通过实例代码展示了如何提取并打印这些矩,帮助理解图像特征提取的基础概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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.youkuaiyun.com/download/kakiebu/10620202

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值