我正在寻找一些示例,说明如何为三角形检测实现霍夫变换。 用于符号检测。 我已经完成了颜色阈值处理。 您对使用HoughLinesP()
什么HoughLinesP()
? 我正在做Canny,然后阈值化并使用HoughLines,但是结果是很多行,而且我的标志里面也有。 我不认为现在找到路口将是我的解决方案。
你怎么看? 有任何例子或其他想法吗? 我也尝试过findContours()
,但是三角形是圆形的,因此它们需要很大的近似值,这使得检测到的垃圾非常丰富。
我正在寻找一些示例,说明如何为三角形检测实现霍夫变换。 用于符号检测。 我已经完成了颜色阈值处理。 您对使用HoughLinesP()
什么HoughLinesP()
? 我正在做Canny,然后阈值化并使用HoughLines,但是结果是很多行,而且我的标志里面也有。 我不认为现在找到路口将是我的解决方案。
你怎么看? 有任何例子或其他想法吗? 我也尝试过findContours()
,但是三角形是圆形的,因此它们需要很大的近似值,这使得检测到的垃圾非常丰富。
在我看来,将HoughLinesP
用于此任务将非常困难,因为它很不稳定并且在很大程度上取决于输入图像和参数的预处理。 不久前,我解决了类似的任务,并向您推荐了以下处理管道(假设输入图像是灰度的):
cv::blur
用于图像增强 cv::MSER
来查找区域(此处需要调整参数)。 您可能要拒绝小的区域。 对于每个区域:
3.1。 cv::convexHull
查找区域的凸包。
3.2。 对cv::approxPolyDP
使用增加epsilon
参数的凸包,直到它返回3条或更少的折线。 您可以拒绝行数少于3的区域。
3.3。 最后,您可以计算线之间的角度并检查其为三角形。 如果所有角度都接近60度(或略小于90度),则将该区域标记为三角形。
希望对您有所帮助。 如果您将成功解决此任务,请在此处描述您的经验。
问题是,行数极高或为一。 这是我的代码:
#define red 10, 180, 180, 25, 255, 255
void SetScalars(int h1, int s1, int v1, int h2, int s2, int v2){
color_min = Scalar(h1, s1, v1);
color_max = Scalar(h2, s2, v2);
}
void triangles(){
ToHSV();
SetScalars(red);
Thresh();
Mat dst = frame.clone();
vector<vector<Point>> contours;
blur(frame_thresh, frame_thresh, Size(3, 3));
MSER(15,250,1000,0.15)(frame_thresh, contours);
// Find the convex hull object for each contour
vector<vector<Point> >hull(contours.size());
for (int i = 0; i < contours.size(); i++)
{
int vtc = hull[i].size();
convexHull(Mat(contours[i]), hull[i], false);
approxPolyDP(Mat(contours[i]), hull[i], arcLength(Mat(contours[i]), true) * 0.1, true);
cout << vtc << endl;
if (vtc == 3){
vector<double> cos;
cos.push_back(angle(hull[i][0], hull[i][1], hull[i][2]));
cos.push_back(angle(hull[i][1], hull[i][2], hull[i][0]));
cos.push_back(angle(hull[i][0], hull[i][2], hull[i][1]));
sort(cos.begin(), cos.end());
double mincos = cos.front();
double maxcos = cos.back();
if (vtc == 3 && mincos > 0.4 && maxcos < 0.6){
Rect r = boundingRect(contours[i]);
Mat croppedImage = dst(r);
imshow("detected triangle", croppedImage);
}
}
}
Mat drawing = Mat::zeros(frame_thresh.size(), CV_8UC3);
for (int i = 0; i< contours.size(); i++)
{
drawContours(drawing, contours, i, Scalar(0,0,255));
drawContours(drawing, hull, i, Scalar(255, 0, 255));
int vtc = hull[i].size();
}
imshow("mser", drawing);
}
您正在寻找的是广义霍夫变换 ,它是霍夫变换的一般性,可以检测任意形状。 这样,您可以将形状指定为三角形。
OpenCV中有一个通用化Hough的实现: http : //docs.opencv.org/master/d7/dd4/classcv_1_1GeneralizedHough.html ,您可以使用setTemplate方法定义形状。