Open CV 提取直線

Open CV 提取直線

要求

需求是這樣的:咱們要提取出下圖填空題中的空行,以便統計空行數。api

clipboard.png

顯然,這是我本身隨手寫的,可是直線還算比較直。我以爲這個應該也能作吧。spa

開始作

好,那就試試吧,首先我增長下亮度,整個圖灰濛濛的看着難受。code

clipboard.png

經過以下代碼操做:ip

Mat src_output;
src.convertTo(src_output, -1,3,0);//3是亮度

在二、三、四、6個亮度中我選了個3,看着還行。get

接着咱們要將背景色變爲黑色(就是反相)it

爲啥要反相?
來,你不反相試試:io

clipboard.png

據沙雕老師嗯嗯嘰嘰的解釋,形態學操做的背景要求是黑色的xxxx之類的。(我纔不信)class

好,在二值化的同時咱們乖乖反相一下:cli

//二值化
cvtColor(src_output, graySrc, CV_BGR2GRAY);
threshold(graySrc, graySrc, 0,255, THRESH_BINARY_INV | THRESH_OTSU);
imshow("th_out", graySrc);

其中 THRESH_BINARY_INV 就是二值化並反相的參數foreach

接着咱們要作形態學操做了:

//先準備一個Kernel(Size比較重要,這裏的20,1表示長20px、高爲1px。那麼這個kernel就表示你要找長20高1的圖形)
Mat kernel = getStructuringElement(MORPH_RECT, Size(20, 1));
//告訴形態學Ex你要對誰操做,保存到誰那,進行什麼操做(是開仍是閉仍是別的),你的kernel叫啥
morphologyEx(graySrc, graySrc, MORPH_OPEN, kernel);

形態學操做後,咱們獲得幾個直線:

clipboard.png

是否是多了一條?沒辦法,誰讓我quantum寫連着了。

好,既然只剩直線了,那咱們就上霍夫老哥的直線檢測了。

//霍夫直線檢測
//注意api
vector<Vec4i> lines;
HoughLinesP(graySrc, lines,1,CV_PI / 180.0,10,7.0,0);
這裏須要注意,API是HoughLinesP(graySrc, lines,1,CV_PI / 180.0,10,7.0,0);
後面有個P!千萬別忘了!害死我了找了半天問題。

講霍夫檢測到的直線所有存放在lines裏,接下來咱們就foreach畫出來。

for (size_t i = 0; i < lines.size(); i++)
{
    Vec4i currPoints = lines[i];
    //這裏能夠騷着寫
    line(src, Point(currPoints[0],currPoints[1]), Point(lines[i][2],lines[i][3]), Scalar(0, 0, 255));
}

我就畫在原圖上。

結果

clipboard.png

所有代碼

(src是原圖)

#pragma region 直線檢測
    
    Mat src_output;
    src.convertTo(src_output, -1,3,0);//3是亮度
    imshow("src_out2", src_output);//如今這個亮度還不錯
    
    //二值化
    cvtColor(src_output, graySrc, CV_BGR2GRAY);
    threshold(graySrc, graySrc, 0,255, THRESH_BINARY_INV | THRESH_OTSU);
    imshow("th_out", graySrc);

    //形態學操做
    Mat kernel = getStructuringElement(MORPH_RECT, Size(20, 1));
    
    morphologyEx(graySrc, graySrc, MORPH_OPEN, kernel);
    imshow("mor", graySrc);

    //霍夫直線檢測
    //注意api
    vector<Vec4i> lines;
    HoughLinesP(graySrc, lines,1,CV_PI / 180.0,10,7.0,0);
    for (size_t i = 0; i < lines.size(); i++)
    {
        Vec4i currPoints = lines[i];
        //這裏能夠騷着寫
        line(src, Point(currPoints[0],currPoints[1]), Point(lines[i][2],lines[i][3]), Scalar(0, 0, 255));

    }
    imshow("src", src);

    #pragma endregion

    waitKey(0);
相關文章
相關標籤/搜索