2014-12-02 284 views
1

我试图从迷宫中处理以下图像。我的问题是关于如何处理边缘。我用C++使用OpenCV 2.4。 我想知道是否有任何方法通过地板上的线条来区分地板和墙壁之间的边缘?线条和边缘检测器,opencv

地板是黑色的,墙壁是白色的,在地板上画的线条也是白色的。

我想要做的是区分墙和地板上的痕迹。如果我可以进入迷宫,地板上的线条会给我一个距离参考。虽然墙壁只是告诉迷宫的大厅的限制。

在这里你可以找到我已经完成的过程映像。

http://oi61.tinypic.com/34hx7a0.jpg

http://oi60.tinypic.com/2zpqfq0.jpg

我使用的是精明且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; 
} 
+0

事实上您的对象边缘形式相当好线)没得到混淆CV边缘(像素信息)和3D边缘的定义(沿着现实世界中的物体)。我猜你正在寻找的东西是“脊检测” – Micka 2014-12-02 20:34:17

+0

感谢您的评论Micka!不知道脊是我在找什么。我编辑了这个问题,告诉我更多关于我想要达到的内容。 – tul1 2014-12-02 20:54:52

回答

1

最明显的事情,试图将像素的亮度对比上线的两侧。

做出三个区域:像素距线的一侧有一点距离,像素距线的另一侧有一点距离,像素接近线。计算任一区域的平均亮度。

墙壁是浅灰色的,地板是黑色的线条是白色的,所以

  • 如果一侧比另一侧显著亮,它可能是一个边缘(你甚至可以知道哪些侧面是地板),
  • 如果双方都比中间显着更暗,那很可能是地板上的标记。
  • (和如果行是垂直的,它是壁壁边缘)