1. 程式人生 > >OpenCv-C++下的影象的矩

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);
}

執行的結果:
在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述