模糊圖像有助於找到交叉口的代碼所示
#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