需求是這樣的:咱們要提取出下圖填空題中的空行,以便統計空行數。api
顯然,這是我本身隨手寫的,可是直線還算比較直。我以爲這個應該也能作吧。spa
好,那就試試吧,首先我增長下亮度,整個圖灰濛濛的看着難受。code
經過以下代碼操做:ip
Mat src_output; src.convertTo(src_output, -1,3,0);//3是亮度
在二、三、四、6個亮度中我選了個3,看着還行。get
接着咱們要將背景色變爲黑色(就是反相)it
爲啥要反相?
來,你不反相試試:io
據沙雕老師嗯嗯嘰嘰的解釋,形態學操做的背景要求是黑色的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);
形態學操做後,咱們獲得幾個直線:
是否是多了一條?沒辦法,誰讓我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)); }
我就畫在原圖上。
(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);