OpenCVは輪郭の長さ/周囲と面積を計算します。


本論文の例では、OpenCVの輪郭の長さ/周囲の長さと面積を計算する具体的なコードを共有しています。
輪郭の面積
輪郭面積とは、各輪郭内のすべての画素点が領域を囲む面積を指し、単位は画素である。

double contourArea( InputArray contour, bool oriented = false );
  • contour:輪郭の画素点
  • orented:エリア面積は方向の標識を持つかどうか、trueは面積の方向性を表し、falseは方向性を持たない、デフォルトは方向性を持たないfalseです。
  • 関数の戻り値は統計プロファイルの結果で、データの種類はdoubleです。関数の最初のパラメータは輪郭の画素点を表し、データタイプはvectorまたはMatであり、隣接する2つの画素点の間に1つずつ接続されて構成される多角形領域は輪郭面積の統計領域である。連続する3つの画素点の間の連続線は同一の直線上にある可能性があるので、入力輪郭画素点の数を減らすために、輪郭の頂点画素点、例えば三角形の輪郭だけを入力することができ、輪郭には各辺のすべての画素点があり得るが、統計面積の場合は三角形の3つの頂点のみを入力することができる。関数の2番目のパラメータは領域の面積が方向の標識を持つかどうかで、パラメータはtrueの時に統計の面積が方向性を持つことを表して、輪郭の頂点は時計回りに与えて、反時計回りに与えます。パラメータがfalseの場合、統計の面積は方向性を持たず、輪郭面積の絶対値を出力することを表します。 
    輪郭の長さ /周の長さ
    
    double arcLength( InputArray curve, bool closed );
  • curve:輪郭または曲線の2 Dピクセルポイント。
  • closed:輪郭または曲線がマークを閉じるかどうか、trueは閉じていることを表します。
  • この関数は、輪郭や曲線の長さを統計できます。関数の戻り値は統計長で、単位はピクセルで、データの種類はdoubleです。関数の最初のパラメータは輪郭または曲線の2 Dピクセルポイントで、データタイプはvectorまたはMatです。関数の2番目のパラメータは輪郭または曲線が閉じているかどうかを示すフラグで、trueは閉じています。
    関数統計の長さは、輪郭または曲線の隣接する2つの画素点間の連続線の距離であり、例えば三角形の3つの頂点A、B、Cからなる輪郭長を計算する場合、関数の2番目のパラメータがtrueの場合、統計の長さは三角形の3つの辺AB、BC、CAの長さの和である。パラメータがfalseの場合、統計の長さはAからCまでの3点の間で順次接続される距離の長さの和、すなわちABとBCの長さの和である。
    簡単な例
    
    //
    // Created by smallflyfly on 2021/6/22.
    //
     
    #include "opencv2/opencv.hpp"
    #include <iostream>
     
    using namespace std;
    using namespace cv;
     
    int main() {
        Mat im = imread("rice.jfif");
        resize(im, im, Size(0, 0), 0.5, 0.5);
        Mat gray;
        cvtColor(im, gray, CV_BGR2GRAY);
     
        Mat imBin;
        threshold(gray, imBin, 125, 255, THRESH_BINARY);
     
        vector<vector<Point>> contours;
        findContours(imBin, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
        drawContours(im, contours, -1, Scalar(255, 0, 255));
     
        for (int i = 0; i < contours.size(); ++i) {
            double area = contourArea(contours[i]);
            double length = arcLength(contours[i], true);
            cout << "area: " << area << " " << "length: " << length << endl;
        }
        
        imshow("im", im);
     
        waitKey(0);
        destroyAllWindows();
     
        return 0;
     
    }

    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。