11

輪郭の重心を見つけようとしていますが、C++ (OpenCV 2.3.1) でサンプル コードを実装するのに問題があります。誰でも私を助けることができますか?

4

4 に答える 4

16

等高線の重心を見つけるには、モーメント法を使用できます。また、関数は OpenCV で実装されています。

これらのモーメント関数 (中心モーメントと空間モーメント) を確認してください。

以下のコードは、OpenCV 2.3 docs チュートリアルから取得したものです。完全なコードはこちら。


/// Find contours
findContours( canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );

/// Get the moments
vector<Moments> mu(contours.size() );
for( int i = 0; i < contours.size(); i++ )
 { mu[i] = moments( contours[i], false ); }

///  Get the mass centers:
vector<Point2f> mc( contours.size() );
for( int i = 0; i < contours.size(); i++ )
 { mc[i] = Point2f( mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 ); } 

この SOFもチェックしてください。これは Python ですが、役に立つでしょう。輪郭のすべてのパラメータを見つけます。

于 2012-01-31T05:18:35.657 に答える
6

輪郭領域のマスクがある場合は、次のように図心の位置を見つけることができます。

cv::Point computeCentroid(const cv::Mat &mask) {
    cv::Moments m = moments(mask, true);
    cv::Point center(m.m10/m.m00, m.m01/m.m00);
    return center;
}

このアプローチは、マスクはあるが輪郭がない場合に役立ちます。cv::findContours(...)その場合、上記の方法は、質量中心を使用して見つけるよりも計算効率が高くなります。

これがソースです

于 2013-03-04T19:12:59.130 に答える
0

重心の概算だけが必要な場合は、いくつかの簡単な方法があります。

sumX = 0; sumY = 0;
size = array_points.size;
if(size > 0){

    foreach(point in array_points){
        sumX += point.x;
        sumY += point.y;
    }
            
 centroid.x = sumX/size;
 centroid.y = sumY/size;
}

または Opencv の boundingRect の助けを借りて:

//pseudo-code:

Rect bRect = Imgproc.boundingRect(array_points);

centroid.x = bRect.x + (bRect.width / 2);
centroid.y = bRect.y + (bRect.height / 2);
于 2012-12-15T00:07:13.963 に答える