- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
计算一个多边形或光栅化形状直到三阶的所有矩。
该函数计算一个向量形状或光栅化形状直到三阶的矩。结果返回在 cv::Moments 结构中。
函数原型
cpp
Moments cv::moments
(
InputArray array,
bool binaryImage = false
)
参数
- 参数array 一个单通道的 8 位或浮点 2D 数组的光栅图像,或一个 1×N 或 N×1 的 2D 点(Point 或 Point2f)数组。
- 参数binaryImage 如果为真,则所有非零图像像素被视为 1。该参数仅用于图像。
代码示例
cpp
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
// 创建一个空白的图像
cv::Mat image = cv::Mat::zeros( 300, 300, CV_8UC1 ); // 单通道8位图像
// 在图像中间画一个白色的圆形作为轮廓
cv::circle( image, cv::Point( 150, 150 ), 50, cv::Scalar( 255 ), -1 );
// 查找图像中的轮廓
std::vector< std::vector< cv::Point > > contours;
cv::findContours( image, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE );
// 计算轮廓的矩
cv::Moments moments = cv::moments( contours[ 0 ] );
// 从矩中计算质心
double cx = moments.m10 / moments.m00;
double cy = moments.m01 / moments.m00;
// 计算面积
double area = moments.m00;
// 在图像上标记质心
cv::circle( image, cv::Point( static_cast< int >( cx ), static_cast< int >( cy ) ), 5, cv::Scalar( 128 ), -1 );
// 输出质心坐标和面积
std::cout << "Centroid at (" << cx << ", " << cy << ")" << std::endl;
std::cout << "Area: " << area << std::endl;
// 显示图像
cv::imshow( "Contour with Centroid", image );
cv::waitKey( 0 );
return 0;
}
运行结果
终端:
bash
Centroid at (150, 150)
Area: 7704
图像: