2

我正在使用opencv做一个项目。我想从网络摄像头检测形状。我已经通过编辑 square.c 成功检测到正方形,现在我想使用 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

您也可以考虑查看我之前关于检测图像中的许多三角形的答案之一。

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

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

是 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; ...
于 2012-07-23T11:33:02.317 回答