• opencv::图像矩(Image Moments)


    矩的概念介绍

     1、几何矩

     

     2、中心距

      

     3、中心归一化距

      

       4、图像中心Center(x0, y0)

      

        

    计算矩
    moments(
        InputArray  array,           // 输入数据
        bool   binaryImage=false     // 是否为二值图像
    )
    
    contourArea(
        InputArray  contour,   // 输入轮廓数据
        bool   oriented        // 默认false、返回绝对值
    )
    
    arcLength(
        InputArray  curve,   // 输入曲线数据
        bool   closed        // 是否是封闭曲线
    )
    步骤
        提取图像边缘
        发现轮廓
        计算每个轮廓对象的矩
        计算每个对象的中心、弧长、面积
    Mat src, gray_src;
    int threshold_value = 80;
    int threshold_max = 255;
    const char* output_win = "image moents demo";
    RNG rng(12345);
    void Demo_Moments(int, void*);
    int main(int argc, char** argv) {
        src = imread(STRPAHT3);
        if (!src.data) {
            printf("could not load image...
    ");
            return -1;
        }
        cvtColor(src, gray_src, CV_BGR2GRAY);
        GaussianBlur(gray_src, gray_src, Size(3, 3), 0, 0);
    
        char input_win[] = "input image";
        namedWindow(input_win, CV_WINDOW_AUTOSIZE);
        namedWindow(output_win, CV_WINDOW_AUTOSIZE);
        imshow(input_win, src);
    
        createTrackbar("Threshold Value : ", output_win, &threshold_value, threshold_max, Demo_Moments);
        Demo_Moments(0, 0);
    
        waitKey(0);
        return 0;
    }
    
    void Demo_Moments(int, void*) {
        Mat canny_output;
        vector<vector<Point>> contours;
        vector<Vec4i> hierachy;
    
        //提取图像边缘
        Canny(gray_src, canny_output, threshold_value, threshold_value * 2, 3, false);
        //发现轮廓
        findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
    
        vector<Moments> contours_moments(contours.size());
        vector<Point2f> ccs(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));
        }
    
        Mat drawImg;// = Mat::zeros(src.size(), CV_8UC3);
        src.copyTo(drawImg);
        for (size_t i = 0; i < contours.size(); i++) {
            if (contours[i].size() < 100) {
                continue;
            }
            Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
            printf("center point x : %.2f y : %.2f
    ", ccs[i].x, ccs[i].y);
            printf("contours %d area : %.2f   arc length : %.2f
    ", i, contourArea(contours[i]), arcLength(contours[i], true));
            drawContours(drawImg, contours, i, color, 2, 8, hierachy, 0, Point(0, 0));
            circle(drawImg, ccs[i], 2, color, 2, 8);
        }
    
        imshow(output_win, drawImg);
        return;
    }

       

  • 相关阅读:
    索引结构
    云时代基础设置自动化管理利器: Chef
    软件Scrum
    选择置换+败者树搞定外部排序
    selenium webdriver (python)2
    [置顶] javascript-基于对象or面向对象?
    4.7 阻止对某几列插入
    mysql数据损坏修复方法
    阿里云挂载数据盘
    Delphi 使用双缓冲解决图片切换时的闪烁问题 good
  • 原文地址:https://www.cnblogs.com/osbreak/p/11498607.html
Copyright © 2020-2023  润新知