2

私はopencvを使用してプロジェクトに取り組んでいます。ウェブカメラから形状を検出したい。私はすでに square.c を編集して正方形を検出することに成功しています。

square.cから三角形を検出することは可能ですか? どの部分を追加または変更する必要がありますか?

編集

私はこのコードを追加しようとしました:

else if ( result->total == 3 &&
    fabs ( cvContourArea(result, CV_WHOLE_SEQ)) > 1000 &&
    cvCheckContourConvexity(result))
{
    s = 0;
    for (int i = 0; i < 3; i++)
    {
        if (i >= 1)
        {
            t = fabs( angle(
                      (CvPoint*)cvGetSeqElem(result, i),
                      (CvPoint*)cvGetSeqElem(result, i-1),
                      (CvPoint*)cvGetSeqElem(result, i-2)));
            s =  s > s ? s : t;
        }
    }
}

結果は、正方形で検出された三角形です..

4

2 に答える 2

0

また、画像内の多くの三角形の検出に関する私の以前の回答の1つを確認することを検討してください。

その例で注意を払うべき主な機能は次のとおりです。

vector<Point> getAllTriangleVertices(Mat& img, const vector< vector<Point> >& contours)
{
    vector<Point> approxTriangle;
    vector<Point> allTriangleVertices;
    for(size_t i = 0; i < contours.size(); i++)
    {
        approxPolyDP(contours[i], approxTriangle, arcLength(Mat(contours[i]), true)*0.05, true);
        if(approxTriangle.size() == 3)
        {
            copy(approxTriangle.begin(), approxTriangle.end(), back_inserter(allTriangleVertices));
            drawContours(img, contours, i, Scalar(0, 255, 0), CV_FILLED);

            vector<Point>::iterator vertex;
            for(vertex = approxTriangle.begin(); vertex != approxTriangle.end(); ++vertex)
            {
                circle(img, *vertex, 3, Scalar(0, 0, 255), 1);
            }
        }
    }

    return allTriangleVertices;
}

基本的に、この関数は、によって検出された輪郭を使用findContoursして、画像上に三角形の頂点を描画し、それらを塗りつぶします。

お役に立てば幸いです。

于 2012-07-23T13:09:29.543 に答える
0

be i = 1:with

...
(CvPoint*)cvGetSeqElem(result, i),
(CvPoint*)cvGetSeqElem(result, i-1),
(CvPoint*)cvGetSeqElem(result, i-2)));

要素1、0、およびシーケンスの最後の要素にアクセスします。それは意図されていますか?

2番目:なぜ

for (int i = 0; i < 3; i++)
{
    if (i >= 1)

なぜだめですか

for (int i = 1; ...
于 2012-07-23T11:33:02.317 に答える