簡體   English   中英

線條和邊緣檢測器,opencv

[英]Lines and edges detector, opencv

我正在嘗試從迷宮中處理以下圖像。 我的問題是關於如何處理邊緣。 我正在將OpenCV 2.4與c ++一起使用。 我想知道是否有任何方法可以將地板和牆壁之間的邊緣與地板上的線條區別開來?

地板是黑色的,牆壁是白色的,地板上塗的線條也是白色的。

我想做的是區分牆壁和地板上的標記。 地板上的線會給我一個距離參考,如果我可以上迷宮的話。 而牆壁只是告訴迷宮大廳的界限。

在這里,您將找到我完成的過程映像。

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

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

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

要嘗試的顯而易見的事情是比較行兩邊的像素的亮度。

制作三個區域:像素到線的一側略微距離,像素到線的另一側略微距離以及像素接近線。 計算任一區域的平均亮度。

牆壁是淺灰色,地板是黑色,線條是白色,所以

  • 如果一側明顯比另一側明亮,則可能是邊緣(您甚至可以分辨出哪一側是地板),
  • 如果兩面都比中間明顯暗,則可能是地板上的標記。
  • (如果線是垂直的,則為牆到牆的邊緣)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM