【问题标题】:Lines and edges detector, opencv线和边缘检测器,opencv
【发布时间】:2014-12-02 19:52:08
【问题描述】:

我正在尝试处理迷宫中的以下图像。我的问题是关于如何处理边缘。我将 OpenCV 2.4 与 c++ 一起使用。 我想知道是否有任何方法可以将地板和墙壁之间的边缘与地板上的线条区分开来?

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

我想做的是区分墙壁和地板上的标记。地板上的线条将为我提供距离参考,以及我是否可以在迷宫中转弯。而墙壁只是说明了迷宫大厅的界限。

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

我正在使用 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;
}

【问题讨论】:

  • 事实上,您的对象边缘形成了很好的线条;) 不要对 cv 边缘(像素信息)和 3D 边缘(沿着现实世界中的对象)的定义感到困惑。我猜你正在寻找的东西是“山脊检测”
  • 感谢米卡的评论!不确定山脊是否是我要找的。我已经编辑了这个问题,更详细地说明了我想要达到的目标。

标签: c++ opencv hough-transform


【解决方案1】:

最明显的尝试是比较线条两侧像素的亮度。

制作三个区域:到直线一侧稍远的像素,到直线另一侧稍远的像素,以及靠近直线的像素。计算任一区域的平均亮度。

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

  • 如果一侧明显比另一侧亮,则可能是边缘(您甚至可以分辨出哪一侧是地板),
  • 如果两侧比中间明显更暗,则可能是地板上的标记。
  • (如果线是垂直的,它就是墙墙边)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多