opencv c++计算轮廓的几何矩
时间: 2023-06-28 15:15:16 浏览: 49
要计算轮廓的几何矩,可以使用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矩。最后,我们在控制台上输出这些值。