我正在尝试处理迷宫中的以下图像。我的问题是关于如何处理边缘。我在 C++ 中使用 OpenCV 2.4。 我想知道是否有任何方法可以区分地板和墙壁之间的边缘与地板上绘制的线条?
地板是黑色的,墙壁是白色的,地板上画的线条也是白色的。
我想做的是区分墙壁和地板上的标记。地板上的线条会给我一个距离引用,以及我是否可以在迷宫中转弯。而墙壁只是告诉迷宫大厅的界限。
在这里你会找到我完成的过程图像。
我正在使用 Canny 和 HoughLinesP 函数来检测和保存线条。但正如您在图像中看到的那样,程序不会将线条与边缘分开。
代码:
vector<Vec4i> get_lines(Mat dst, Mat cdst)
{
vector<Vec4i> lines;
HoughLinesP(dst, lines, 1, CV_PI/180, 100, 50, 10 );
for( size_t i = 0; i < lines.size(); i++ )
{
Vec4i l = lines[i];
double size = norm(Mat(Point(l[0], l[1])), Mat(Point(l[2], l[3])) );
if(size > 100)
line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA);
}
return lines;
}
主要功能是:
int main(int argc, char** argv)
{
const char* filename = argc >= 2 ? argv[1] : "pic1.jpg";
Mat src = imread(filename, 0);
if(src.empty())
{
help();
cout << "can not open " << filename << endl;
return -1;
}
Mat dst, cdst;
Canny(src, dst, 50, 200, 3);
cvtColor(dst, cdst, CV_GRAY2BGR);
vector<Vec4i> lines = get_lines(dst, cdst);
imshow("source W&B", src);
imshow("edges", dst);
imshow("detected lines", cdst);
imwrite("lines.jpg",cdst);
imwrite("src.jpg",src);
imwrite("canny.jpg",dst);
waitKey();
return 0;
}
最佳答案
显而易见的尝试是比较线条两侧像素的亮度。
制作三个区域:距离线的一侧有一点距离的像素,距离线另一侧有一点距离的像素,以及靠近线的像素。计算任一区域的平均亮度。
墙壁是浅灰色的,地板是黑色的,线条是白色的,所以
- 如果一侧明显比另一侧亮,则可能是边缘(您甚至可以分辨出哪一侧是地板),
- 如果两侧明显比中间暗,则可能是地板上的标记。
- (如果线是垂直的,它就是墙-墙边)
关于c++ - 线条和边缘检测器,opencv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27257755/