模糊图像有助于找到交叉口的代码所示
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
int main(int argc, char** argv)
{
Mat src = imread(argv[1]);
Mat gray, blurred;
cvtColor(src, gray, COLOR_BGR2GRAY);
threshold(gray, gray, 127, 255, THRESH_BINARY);
GaussianBlur(gray, blurred, Size(), 9);
threshold(blurred, blurred, 200, 255, THRESH_BINARY_INV);
gray.setTo(255, blurred);
imshow("result",gray);
waitKey();
return 0;
}
结果图像:
第2步
简单地说,从generalContours_demo2.cpp
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src = imread(argv[1]);
Mat gray, blurred;
cvtColor(src, gray, COLOR_BGR2GRAY);
threshold(gray, gray, 127, 255, THRESH_BINARY);
GaussianBlur(gray, blurred, Size(), 5);
threshold(blurred, blurred, 180, 255, THRESH_BINARY_INV);
gray.setTo(255, blurred);
imshow("result of step 1",gray);
vector<vector<Point> > contours;
/// Find contours
findContours(gray.clone(), contours, RETR_TREE, CHAIN_APPROX_SIMPLE);
/// Find the rotated rectangles and ellipses for each contour
vector<RotatedRect> minRect(contours.size());
vector<RotatedRect> minEllipse(contours.size());
for(size_t i = 0; i < contours.size(); i++)
{
minRect[i] = minAreaRect(Mat(contours[i]));
if(contours[i].size() > 5)
{
minEllipse[i] = fitEllipse(Mat(contours[i]));
}
}
/// Draw contours + rotated rects + ellipses
for(size_t i = 0; i< contours.size(); i++)
{
Mat drawing = src.clone();
// contour
//drawContours(drawing, contours, (int)i, color, 1, 8, vector<Vec4i>(), 0, Point());
// ellipse
ellipse(drawing, minEllipse[i], Scalar(0, 0, 255), 2);
// rotated rectangle
Point2f rect_points[4];
minRect[i].points(rect_points);
for(int j = 0; j < 4; j++)
line(drawing, rect_points[j], rect_points[(j+1)%4], Scalar(0, 255, 0), 2);
/// Show in a window
imshow("results of step 2", drawing);
waitKey();
}
return 0;
}
你借码可以得到以下结果图像等等。我希望你能解决最后一步。
你如何找到结合点?我认为如下所示的模糊不是基于某种数学属性,而是基于它自己的尝试 - 如果你能找到交点,那么它就成为一个图形问题。每个传入段都会有可能的输出段,并基于曲率进行匹配。但你如何检测交点? – gpasch
我尝试了很多方法来找到角落,并发现'goodFeaturesToTrack'在这种情况下效果最好。 Disadventage是它不仅检测路口,还检测矩形的核心。 在我看来,仅检测连接点的能力只是算法。 –
如果它检测到矩形拐角就好 - 你必须将一个线段与一个线段配对 - 如果goodFeaturesToTrack找到所有突出显示的点,那么它就是你需要的 – gpasch