OpenCv-C++下的图像的矩

我主要学习了图像矩,就是计算图像中对象的弧长,面积,求出中心点。
主要步骤如下图所示:
在这里插入图片描述
原理:
在这里插入图片描述
在这里插入图片描述
下面是主要用到的API:
moments():计算图像中的中心矩(最高到三阶);
contoursArea():计算对象面积;
arcLength():计算对象轮廓周长或曲线长度;

参考链接:https://blog.csdn.net/keith_bb/article/details/70197104

在这里插入图片描述
下面贴上代码:

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>

using namespace cv;
using namespace std;

Mat src,dst,gray_src;
int threshold_value = 100;
int threshold_Max = 255;
RNG rng(12345);

void demo_Moments(int, void*);
int main(int argc, char** argv)
{
	src = imread("D:/test/hot-ball.png");
	if (!src.data)
	{
		cout << "图片未找到" << endl;
		return -1;
	}
	cvtColor(src, gray_src, CV_BGR2GRAY);
	namedWindow("output title",CV_WINDOW_AUTOSIZE);
	createTrackbar("move", "output title", &threshold_value, threshold_Max, demo_Moments);
	demo_Moments(0, 0);
	imshow("input title",src);
	waitKey(0);
	return 0;
}

void demo_Moments(int, void *)
{
	Mat canny_out;
	Canny(gray_src, canny_out, threshold_value, threshold_value * 2, 3, false);
	vector<vector<Point>> contours;//获取对象轮廓点
	vector<Vec4i> hierachy;
	findContours(canny_out, contours, hierachy, RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
	vector<Point2f> ccs(contours.size());//矩的中心点
	vector<Moments> contours_moments(contours.size());
	for (size_t i = 0;i < contours.size(); i++)
	{
		contours_moments[i]=moments(contours[i]);
		ccs[i] = Point(static_cast<float>(contours_moments[i].m10 / contours_moments[i].m00), static_cast<float>(contours_moments[i].m01 / contours_moments[i].m00));
		printf("ccs x: %.2f  y:%.2f\n", ccs[i].x,ccs[i].y);

	}
	Mat outImg;
	src.copyTo(outImg);
	for (size_t k = 0; k < contours.size(); k++)
	{
		if (contours.size() < 50)
		{
			continue;//结束本次循环,进入下次循环
		}
		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
		drawContours(outImg, contours, int(k), color, 1, 8, hierachy, 0, Point(0, 0));
		printf("contours:%d  area:%.2f  arcLen:%.2f\n", (int)k, contourArea(contours[k]), arcLength(contours[k], true));
		circle(outImg, ccs[k], 2, color, 1, 8);

	}
	imshow("output title", outImg);
}

运行的结果:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Daker_Huang/article/details/83832528