【问题标题】:detect triangle from square.c从 square.c 检测三角形
【发布时间】:2012-07-23 21:09:29
【问题描述】:

我正在使用 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;
        }
    }
}

结果是,在正方形上检测到的三角形..

【问题讨论】:

  • 请提出一个与编程相关的具体问题。
  • 显示并解释你到目前为止所尝试的。
  • @PeterMiehle 我尝试在cvApproxPoly 的结果上添加if,但结果是程序检测到正方形=三角形。
  • 条件s &gt; s 将始终为假。
  • @JoachimPileborg 我已更改为s &gt; t,但结果仍然相同。

标签: c opencv


【解决方案1】:

成为 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; ...

【讨论】:

    【解决方案2】:

    您还可以考虑查看我的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 检测到的轮廓,并在图像上绘制三角形顶点并填充它们。

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多