我正在使用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;
}
}
}
结果是,在广场上检测到三角形..
答案 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
检测到的轮廓,并在图像上绘制三角形顶点并填充它们。
希望有所帮助!