opencv 表格識別之表格透視矯正(一)
這個專案的目的是讓使用者選擇模板表格(未填寫的表格)中的多個或者一個小格子,然後將掃描(注意:是掃描的表格)傳入的填寫好的表格對應的格子提取出來,對格子中的選擇進行處理。
在對錶格進行處理之前,我們應該先將傳入的填寫好的表格對照著模板表格進行矯正。一下提供了一種矯正表格的方法,這種方法效果還行,但是當運用到一張紙上有多個的表格的時候,只能對其中最大的表格進行處理,所以下一篇文章,將給出一種能進行多個表格矯正的方法。
Mat src = imread("9.jpg");
Mat srcClone = src.clone();
// 檢查是否為灰度圖,如果不是,轉化為灰度圖
Mat gray;
if (src.channels() == 3) {
cvtColor(src, gray, CV_BGR2GRAY);
}
else {
gray = src;
}
//轉化為二值圖
Mat bw;
adaptiveThreshold(~gray, bw, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
//形態學
Mat Structure = getStructuringElement(MORPH_RECT, Size(3, 3));
// Apply morphology operations
erode(bw, bw, Structure, Point(-1, -1));
dilate(bw, bw, Structure, Point(-1, -1));
閾值化的結果如下:
//提取輪廓
vector<Vec4i> hierarchy;
std::vector<std::vector<cv::Point> > contours;
cv::findContours(bw, contours, hierarchy, CV_RETR_LIST, CHAIN_APPROX_SIMPLE);// , Point(0, 0));
//逼近多邊形
vector<vector<Point> > contours_poly(contours.size());
int indexMax = 0;
double areaMax = 0;
for (size_t i = 0; i < contours.size(); i++)
{
//面積
double area = contourArea(contours[i]);
//篩選可能存在且不代表表的單獨的行的行。
if (area < 20) // value is randomly chosen
continue;
Scalar color(0, 255, 0);
drawContours(srcClone, contours, i, color, 2, 8);
//逼近區域成為一個形狀
approxPolyDP(Mat(contours[i]), contours_poly[i], 10, true);
//不知為何,加了四個點的篩選之後,就沒有最大的框了
//if (contours_poly[i].size() != 4)
// continue;
//找出面積最大的四邊形
if (area > areaMax)
{
areaMax = area;
indexMax = i;
}
}
在原圖上畫出所有的輪廓,效果如下:
Scalar color(0, 0, 255);
drawContours(srcClone, contours, indexMax, color, 2, 8);
imshow("contou1", srcClone);
Mat polyPic = Mat::zeros(src.size(), CV_8UC3);
drawContours(polyPic, contours, indexMax, color, 2, 8);
imshow("Contour2", polyPic);
vector<int> hull;
convexHull(contours_poly[indexMax], hull, false); //檢測該輪廓的凸包
for (int j = 0; j < hull.size(); j++)
{
circle(src, contours_poly[indexMax][j], 10, Scalar(255, 0, 0));
}
在原圖上找出最大的輪廓:
提取出最大輪廓:
繪製凸包:
//矯正後的座標
Mat outPic = Mat(Size(800, 800), src.type());
Point2f srcPoints[4], dstPoints[4];
dstPoints[0] = Point2f(0, 0);
dstPoints[1] = Point2f(outPic.cols, 0);
dstPoints[2] = Point2f(outPic.cols, outPic.rows);
dstPoints[3] = Point2f(0, outPic.rows);
//排序
bool sorted = false;
int n = 4;
while (!sorted)
{
for (int i = 1; i < n; i++)
{
sorted = true;
if (contours_poly[indexMax][i - 1].x > contours_poly[indexMax][i].x)
{
swap(contours_poly[indexMax][i - 1], contours_poly[indexMax][i]);
sorted = false;
}
}
n--;
}
if (contours_poly[indexMax][0].y < contours_poly[indexMax][1].y)
{
srcPoints[0] = contours_poly[indexMax][0];
srcPoints[3] = contours_poly[indexMax][1];
}
else
{
srcPoints[0] = contours_poly[indexMax][1];
srcPoints[3] = contours_poly[indexMax][0];
}
if (contours_poly[indexMax][2].y < contours_poly[indexMax][3].y)
{
srcPoints[1] = contours_poly[indexMax][2];
srcPoints[2] = contours_poly[indexMax][3];
}
else
{
srcPoints[1] = contours_poly[indexMax][3];
srcPoints[2] = contours_poly[indexMax][2];
}
Mat transMat = getPerspectiveTransform(srcPoints, dstPoints); //得到變換矩陣
warpPerspective(src, outPic, transMat, outPic.size()); //進行座標變換
矯正後的影像:
由於程式碼過於簡單,處理過的影像也比較粗糙。
參考:https://blog.csdn.net/xingchenbingbuyu/article/details/50783585
相關文章
- 深入學習OpenCV文件掃描及OCR識別(文件掃描,影像矯正,透視變換,OCR識別)OpenCV
- 表格識別
- opencv外接矩形矯正OpenCV
- 表格識別技術
- 使用 OpenCV 進行文件矯正OpenCV
- excel表格文字識別-ocr表格文字提取api介面整合ExcelAPI
- 表格識別產品介紹
- Qt加Opencv實現 梯度矯正 功能QTOpenCV梯度
- 表格轉文字如何實現-表格文字識別介面整合示例-快速提取表格中的文字
- OCR表單識別/雲脈通用表單識別/表格識別
- 智慧表格識別介面-翔雲C#表格識別對接開啟企業數字化管理C#
- 表格全欄位文字識別-表格內容抽取-翔雲API掛接API
- 論文解讀丨表格識別模型TableMaster模型AST
- opencv實戰——影像矯正演算法深入探討OpenCV演算法
- games101-2 透視深度插值矯正與抗鋸齒分析GAM
- 無線表格識別模型LORE轉換庫:ConvertLOREToONNX模型
- css之表格,表單CSS
- HTML之表格標籤HTML
- 一文輕鬆整合華為HMS ML Kit 表格識別服務
- 外掛級OCR神器:免費文件解析、表格識別、手寫識別、古籍識別、PDF轉Word
- 生成表格與合併表格
- 表格
- Excel表格裡滑鼠雙擊的用法技巧,透過滑鼠雙擊提升Excel表格使用效率Excel
- Poi向Word插入表格,設定表格邊框和表格居中
- VUE-表格佈局、表格查詢、工具欄、表格、分頁欄Vue
- 表格 、背景
- markdown表格
- opencv 人臉識別OpenCV
- 構建靜態頁面 之 [ 表格 ]
- 前端常用方法之匯出excel表格前端Excel
- 如何檢視和分析Excel表格資料Excel
- 辦公利器!用Python批量識別發票並錄入到Excel表格PythonExcel
- 尋找寫程式碼感覺(十九)之 分類表格顯示優化 之 樹形表格展示優化
- 透過 C# 將資料寫入到Excel表格C#Excel
- element-UI庫Table表格匯出Excel表格UIExcel
- JavaScript動態建立表格和增加表格的行JavaScript
- PhpOffice 寫一個漂亮的表格PHP
- C#+OpenCV進階(一)_人體識別C#OpenCV