2014-04-09 65 views
1

我正在編寫一個移動應用程序來繪製表格數據的圖形表示(圖表/圖表)。用戶正在拍攝統計表格的圖像。我必須檢測表格並裁剪所有單元格以便使用tessaract引擎執行OCR。 是否有適當的方法來識別圖像中的表格並循環遍歷單元格並將其保存到數組中?使用opencv讀取表格(圖片)單元格數據單元格

到目前爲止,我已經能夠使用opencv C++如下清理圖像。

代碼:

const char* filename = argc >= 2 ? argv[1] : "test.jpg"; 

Mat src = imread(filename); 
if(src.empty()) 
{ 
    //help(); 
    cout << "can not open " << filename << endl; 
    return -1; 
} 

Mat dst, cdst, img2; 

GaussianBlur(src,dst,Size(5,5),0); 
cvtColor(dst, dst, CV_RGB2GRAY); 
adaptiveThreshold(dst, dst, 255, CV_ADAPTIVE_THRESH_MEAN_C,CV_THRESH_BINARY, 31, 15); 
namedWindow("dst",WINDOW_NORMAL); 

imshow("dst", dst); 

有沒有一種方法來遍歷細胞,並在訂單作物呢?

回答

2

好了,簡單的方法在這裏找到細胞:

你會發現在過濾圖像的輪廓,並建立一個邊框圓他們。

此外,您可以使用特定輪廓的大小和/或顏色信息來消除太小或太大的輪廓。

下面是一些代碼:

Mat src = imread("g.png"); 

    cvtColor(src, src, CV_BGR2GRAY); 

    vector<vector<Point> > contours; 
    vector<Vec4i> hierarchy; 

    Canny(src, src, 100, 200, 3); 
    imshow("g",src); 

    findContours(src, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 

    Mat drawing = Mat::zeros(src.size(), CV_8UC3); 
    char text[200] = ""; 
    CvFont font = cvFont(2,2); 

    for(int i = 0; i< contours.size(); i++) 
    { 
    drawContours(drawing, contours, i, CV_RGB(255,0,0), 2, 8, hierarchy, 0, Point()); 
    cv::Rect brect = cv::boundingRect(contours[i]); 
    if (brect.area() < 1000) 
     continue; 
    sprintf(text,"S = %d", brect.area()); 
    putText(drawing, text, cvPoint(brect.x+20, brect.y+20), 1, 1, CV_RGB(0,255,0)); 
    rectangle(drawing, brect, CV_RGB(0,0,255), 3); 
    } 


    imshow("Contours", drawing); 

enter image description here

分析內容和文字識別是一個相當複雜的任務,而據我所知在OpenCV中沒有默認的方法來執行這一點,所以它需要一些研究明顯。

+0

非常感謝答覆。我會盡快嘗試。我正在使用tesseract引擎做ocr模塊。所以需要裁剪每個單元格,然後將其傳遞給tesseract。無論如何,我可以通過訂單裁剪輪廓嗎? – ChathuraSam

+0

@ user3411228您應該使用某種排序方式,例如先按Y軸排序,然後按X軸排序,同時考慮到單元格的「浮動」邊框。例如:http://codepad.org/GBJBG5Iv – degot

+0

再次感謝。 我試過你的第一個答案。你知道以下錯誤的原因嗎? '錯誤C4996:'sprintf':此函數或變量可能不安全。考慮使用sprintf_s代替。要禁用棄用,請使用_CRT_SECURE_NO_WARNINGS。' – ChathuraSam