图像的矩之寻找图像的重心

// 图形矩.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);
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楚蕊博南谭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值