从square.c中检测三角形

时间:2012-07-23 06:15:11

标签: c opencv

我正在使用opencv工作。我想从网络摄像头检测形状。我已经成功通过编辑square.c来检测square,现在我想使用square.c来检测triangel。

是否可以从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;
        }
    }
}

结果是,在广场上检测到三角形..

2 个答案:

答案 0 :(得分:0)

是i = 1:

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

您可以访问元素1,0和序列的最后一个元素。那是为了吗?

第二:为什么

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

为什么不

for (int i = 1; ...

答案 1 :(得分:0)

您还可以考虑查看我的previous answers之一,检测图像中的许多三角形。

以下是该示例中要注意的主要功能:

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检测到的轮廓,并在图像上绘制三角形顶点并填充它们。

希望有所帮助!