随后膨胀的侵蚀会扭曲三角形的形状。您可以使用connected components (CC) 甚至更好的floodFill 并根据面积删除(用零填充)(floodFill 输出它找到的每个 CC 的面积)。当然,如果您确定要保留的始终是三角形,则可以添加一个额外的步骤以在消除噪声之前验证三角形。下面的代码找到最大的段并用红色勾勒出它的轮廓。三角形形状的验证由绿色圆圈表示,可以通过查看 approx 向量中的多边形近似来进一步探索。
vector<vector<Point> > contours;
Mat hierarchy, I Icol;
Icol = imread("triang.png");
cvtColor(Icol, I, CV_BGR2GRAY);
// Find connected components (CC)
findContours(I.clone(), contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);
// Select the largest CC
int ncontours = contours.size();
int max_sz = 0, max_idx;
for (int i=0; i<ncontours; i++) {
int sz = contours[i].size();
if (max_sz<sz) {
max_sz = sz;
max_idx = i;
}
}
for (int i=0; i<max_sz; i++) {
Point pt = contours[max_idx][i];
Icol.at<Vec3b>(pt.y, pt.x) = Vec3b(0, 0, 255);
}
// Verify triangle
vector<Point> approx;
approxPolyDP(contours[max_idx], approx, 10, true);
cout<<Mat(approx)<<endl;
for (int i=0; i<approx.size(); i++) {
Point pt = approx[i];
circle(Icol, pt, 3, Scalar(0, 255, 0), 2);
}
imshow("largest", Icol); imwrite("triangle.png", Icol);
waitKey(-1);