opencv 1阶矩m10 m01意义
时间: 2024-04-24 08:20:52 浏览: 40
OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。在OpenCV中,矩是一种用于描述图像特征的统计量。其中,1阶矩m10和m01分别表示图像的水平和垂直方向上的灰度值加权平均。
具体来说,m10表示图像在水平方向上的灰度值加权平均,它可以用来描述图像的水平位置。m01表示图像在垂直方向上的灰度值加权平均,它可以用来描述图像的垂直位置。
这两个矩可以用于计算图像的质心,即图像的重心位置。质心是图像中所有像素点的加权平均位置,可以用来描述图像的整体位置信息。
相关问题
opencv中,Moments的m00、m10、m01、m20分别表示什么意思
在OpenCV中,Moments(矩)是计算图像或轮廓的几何特征的函数之一。Moments函数返回一个包含10个值的矩向量,其中包含了图像或轮廓的一些基本信息。
其中,m00表示零阶矩,它是图像的面积或轮廓的长度。m10和m01分别表示一阶矩,它们是图像或轮廓的质心的坐标。m20和m02分别表示二阶矩,它们是图像或轮廓的水平和垂直方向上的集中度。
具体来说,m00就是图像或者轮廓的面积,m10和m01表示图像或者轮廓的质心坐标,m20和m02表示图像或者轮廓在x和y方向的集中度。如果将m10和m01除以m00,就可以得到图像或轮廓的重心坐标。
opencv c++计算轮廓的几何矩
要计算轮廓的几何矩,可以使用OpenCV中的moments函数。该函数可以计算轮廓的各种矩,包括中心矩、标准化矩和 Hu 矩等。
以下是一个简单的示例代码:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat image = imread("contour.jpg");
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
// 阈值分割
Mat binary;
threshold(gray, binary, 127, 255, THRESH_BINARY);
// 查找轮廓
std::vector<std::vector<Point>> contours;
findContours(binary, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
// 计算轮廓的几何矩
for (auto contour : contours)
{
Moments moments = moments(contour);
double area = moments.m00;
double cx = moments.m10 / area;
double cy = moments.m01 / area;
double mu11 = moments.mu11;
double mu20 = moments.mu20;
double mu02 = moments.mu02;
double nu20 = moments.nu20;
double nu02 = moments.nu02;
double hu1 = nu20 + nu02;
double hu2 = pow(nu20 - nu02, 2) + 4 * pow(nu11, 2);
double hu3 = pow(nu30 - 3 * nu12, 2) + pow(3 * nu21 - nu03, 2);
double hu4 = pow(nu30 + nu12, 2) + pow(nu21 + nu03, 2);
double hu5 = (nu30 - 3 * nu12) * (nu30 + nu12) * (pow(nu30 + nu12, 2) - 3 * pow(nu21 + nu03, 2)) + (3 * nu21 - nu03) * (nu21 + nu03) * (3 * pow(nu30 + nu12, 2) - pow(nu21 + nu03, 2));
double hu6 = (nu20 - nu02) * (pow(nu30 + nu12, 2) - pow(nu21 + nu03, 2)) + 4 * nu11 * (nu30 + nu12) * (nu21 + nu03);
double hu7 = (3 * nu21 - nu03) * (nu30 + nu12) * (pow(nu30 + nu12, 2) - 3 * pow(nu21 + nu03, 2)) - (nu30 - 3 * nu12) * (nu21 + nu03) * (3 * pow(nu30 + nu12, 2) - pow(nu21 + nu03, 2));
std::cout << "Area: " << area << std::endl;
std::cout << "Center: (" << cx << ", " << cy << ")" << std::endl;
std::cout << "mu11: " << mu11 << std::endl;
std::cout << "mu20: " << mu20 << std::endl;
std::cout << "mu02: " << mu02 << std::endl;
std::cout << "nu20: " << nu20 << std::endl;
std::cout << "nu02: " << nu02 << std::endl;
std::cout << "Hu1: " << hu1 << std::endl;
std::cout << "Hu2: " << hu2 << std::endl;
std::cout << "Hu3: " << hu3 << std::endl;
std::cout << "Hu4: " << hu4 << std::endl;
std::cout << "Hu5: " << hu5 << std::endl;
std::cout << "Hu6: " << hu6 << std::endl;
std::cout << "Hu7: " << hu7 << std::endl;
}
return 0;
}
```
在这个示例中,我们先对图像进行阈值分割,然后使用findContours函数查找图像中的轮廓。对于每个轮廓,我们使用moments函数计算几何矩。在这个示例中,我们计算了轮廓的面积、中心、mu11、mu20、mu02、nu20、nu02和7个Hu矩。最后,我们在控制台上输出这些值。