opencv学习(二十五)①计算轮廓的矩moments()&面积contourArea()②分水岭算法函数watershed()!!待深入!!//③图像修补inpaint()

这篇博客介绍了OpenCV中如何使用moments()函数计算轮廓的矩和contourArea()函数求面积,同时提及了分水岭算法watershed()的应用,并计划深入探讨。还讨论了图像修补技术inpaint()的一个实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,计算轮廓的矩moments()&面积contourArea()

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

实例1,(从而求面积,长度)

待,对比参考书中程序发现错误

#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;

#define Windows_name1"【原始图】"
#define Window_name2"【图像轮廓】"
static void on_ThreshChange(int, void*);

//全局变量申明
Mat g_srcimg, g_GRAYIMG;
int g_nThresh = 100;
int g_nMaxThresh = 255;
RNG g_rng(12345);
Mat g_cannyMat_output;
vector<vector<Point>>g_vcontours;
vector<Vec4i>g_vHierarchy;

//主函数
int main(int argc, char**argv)
{
    g_srcimg=imread( "D://1.jpg,1" );

    cvtColor(g_srcimg, g_GRAYIMG, COLOR_BGR2GRAY);
    blur(g_GRAYIMG, g_GRAYIMG, Size(3, 3));

     namedWindow(Windows_name1, WINDOW_AUTOSIZE);
    imshow(Windows_name1, g_srcimg);

    //创建滚动条并初始化
    createTrackbar("阈值", Windows_name1, &g_nThresh, g_nMaxThresh, on_ThreshChange);
    on_ThreshChange(0, 0);
    waitKey(0);
    return 0;
}
void on_ThreshChange(int, void*)
{
//使用canny边缘检测
    Canny(g_GRAYIMG, g_cannyMat_output, g_nThresh, g_nThresh * 2, 3);
//找轮廓
    findContours(g_cannyMat_output, g_vcontours, g_vHierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
//计算矩
    vector<Moments>mu(g_vcontours.size());
    for (unsigned int i = 0; i < g_vcontours.size(); i++)
    {
        mu[i]=moments(g_vcontours[i],false);

    }
//计算中心矩
    vector<Point2f>mc(g_vcontours.size());
    for (unsigned int i = 0; i < g_vcontours.size(); i++)
    {
        mc[i] = Point2f(static_cast<float>(mu[i].m10 / mu[i].m00), static_cast<float>(mu[i].m01 / mu[i].m00));
    }
    //绘制轮廓
    Mat drawing = Mat::zeros(g_cannyMat_output.size(), CV_8UC3);
    for (unsigned int i = 0; i < g_vcontours.size(); i++)
    {
        Scalar color = Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));//随机生成颜色值
        drawContours(drawing, g_vcontours, i, color, 2, 8, g_vHierarchy, 0, Point());
        circle(drawing, mc[i], 4, color, -1, 8, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值