// 图形矩.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "opencv2/opencv.hpp"
#include "iostream"
using namespace cv;
using namespace std;
int threshold1 = 11;
int threshold2 = 29;
int maxValue = 50;
Mat src, gaussianImage, hsvImage, cannyImage, dest;
void callback(int, void *);
int main()
{
src = imread("temp.png");
if (src.empty()) {
return -1;
}
namedWindow("src");
imshow("src", src);
namedWindow("test");
createTrackbar("threshold1", "test", &threshold1, maxValue, callback);
createTrackbar("threshold2", "test", &threshold2, maxValue, callback);
callback(0,0);
waitKey();
return 0;
}
void callback(int , void *) {
vector<vector<Point>> contours; //存储每个层级的轮廓的点,因为轮廓是由大量的点构成 例如:contours.size()//获取的轮廓的数量 contours[0].size()//获取的是层级为0的点的个数
vector<Vec4i> hierarchy; //存储层级信息
GaussianBlur(src, gaussianImage, Size(5, 5), 0, 0);
cvtColor(gaussianImage, hsvImage, CV_BGR2GRAY);
Canny(hsvImage, cannyImage, threshold1, threshold2); //获取转化成边缘图像
findContours(cannyImage, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_TC89_L1); //获取轮廓信息
dest = Mat::zeros(src.size(), CV_8UC3);
RNG rng = RNG(2222); //随机数对象
vector<Moments> contours_moments(contours.size()); //存储几何矩
vector<Point2f> contours_center(contours.size()); //存储中心点
for (int i = 0; i < contours.size(); i++) {
Scalar color = Scalar(rng.uniform(0,255), rng.uniform(0, 255) , rng.uniform(0, 255)); //为了区分每个层级的区别,给每个层级设置不同的颜色
drawContours(dest, contours, i , color, 1, LINE_AA, hierarchy); //绘制轮廓
//获取几何矩
contours_moments[i] = moments(contours[i]);
//获取每个轮廓的重心位值点 重心点的计算方式为:x = moments.m10 / moments.m00; y = moments.m01 / moments.m00
contours_center[i] = Point2f(static_cast<float>(contours_moments[i].m10/contours_moments[i].m00), static_cast<float>(contours_moments[i].m01 / contours_moments[i].m00));
//在重心位值画上圆形
circle(dest, contours_center[i], 2, Scalar(0, 0, 255), 2, LINE_AA);
//绘制文字,给重心点标号
putText(dest, to_string(i), contours_center[i], CV_FONT_HERSHEY_SCRIPT_COMPLEX, 0.7, color, 1, LINE_AA);
//打印轮廓的面积和轮廓的长度
cout << "Area=" << contourArea(contours[i]) << ",length=" << arcLength(contours[i], false) << endl;;
}
imshow("test", dest);
}
图像的矩之寻找图像的重心
最新推荐文章于 2023-10-19 15:39:26 发布