針對發票識別之類的自然環境中文字識別,對結果影響最大的應該是文字定位的問題。
下面本人參考 boytnt 的基於opencv進行文字分塊切割(c#)
本人寫了乙份c++的** 僅供參考
因為有一些干擾,所以文字定位並不是很完美,可以通過二值化的方法去掉一些干擾,以後再改進。
**
#include
#include
#include
using
namespace cv;
using
namespace
std;
vector
getrowrects(mat gray)
}bool inline = false;
int start = 0;
for (int i = 0; i < height; i++)
else
if ((i - start > 5) && projection[i] < 10 && inline)}}
delete projection;
return rows;
}vector
getblockrects(mat gray, int rowy)
}bool inblock = false;
int start = 0;
//開始根據投影值識別分割點
for (int i = 0; i < width; ++i)
else
if ((i - start > 10) && inblock && projection[i] < 2)
else
}else}}
return blocks;
}int main(int argc, char* argv)
mat gray, data;
cvtcolor(image, gray, cv_bgr2gray);
data = image.clone();
int blocksize = 25;
int constvalue = 10;
//threshold(gray, gray, 0, 255, thresh_binary_inv | cv_thresh_otsu);
adaptivethreshold(gray, gray, 255, cv_adaptive_thresh_mean_c, cv_thresh_binary_inv, blocksize, constvalue);
imshow("1", gray);
vector
rows = getrowrects(gray);
cout
<< rows.size();
vector
items;
for each(cvrect row in rows)
for each (cvrect rect in items)
imshow("result", image);
waitkey(0);
}
opencv利用投影法進行水平切割和垂直切割
水平投影切割 include include using namespace std using namespace cv int main for y 0 yheight y vectorroilist 用於儲存分割出來的每個字元 int startindex 0 記錄進入字元區的索引 int e...
基於OpenCV的任意方向投影
目前在opencv中,有reduce函式可以進行水平或者垂直方向的投影。c voidreduce inputarraymtx,outputarrayvec,intdim,intreduceop,intdtype 1 parameters reduction operation that could ...
利用投影法進行字元分割
目錄 字元分割有很多方法,但並不是每一種方法是萬能的,那麼就需要根據自己的需要來分析。例如 我現在專案的需求是將一串編號給切分開來。查了網上的資料和文獻,大致適合專案的有兩種方法 投影分割法和連通域分割法。當然還有其他的一些改進的演算法,今天就不作深入討論,以後研究了再分享。投影法的原理其實很簡單,...