利用單應(yīng)性矩陣實現(xiàn)文檔對齊顯示
重磅干貨,第一時間送達
本文轉(zhuǎn)載自微信公眾號:OpenCV學(xué)堂
關(guān)注獲取更多計算機視覺與深度學(xué)習(xí)知識
有時候文本圖像,需要適當(dāng)?shù)男U蟛艜玫奖容^好的對齊顯示,常用的方法有兩個,一個是基于幾何變換,另外一個是基于透視變換。常見的處理步驟如下:
文本對象輪廓提取或者手動調(diào)整
應(yīng)用幾何變換或者透視變換實現(xiàn)顯示對齊
然后再繼續(xù)其它的后續(xù)處理
如果可以得到文檔的四個輪廓點就可以進行單應(yīng)性矩陣計算,然后完成透視變換實現(xiàn)文檔對齊顯示。首先看一下我的運行效果:

最左側(cè)是輸入的圖像,中間是輪廓分析之后得到四個頂點,右側(cè)是單應(yīng)性矩陣變換之后得到輸出結(jié)果。
代碼實現(xiàn)
實現(xiàn)步驟
1.首先對輸入圖像進行二值變換,然后進行輪廓分析,得到文檔輪廓
2.調(diào)用approxPolyDP函數(shù)進行輪廓逼近,找到四個頂點坐標,這里需要注意一下,使用approxPolyDP函數(shù)進行輪廓逼近的時候,最后一個參數(shù)是表示輪廓逼近得到輪廓與原來輪廓之后的距離差值,值越小越逼近真實輪廓。我們這里希望得到一個大致近似的矩形即可,所以該值要盡可能的大一點,這個也是使用這個函數(shù)的一個編程技巧。
3.得到四個點之后,創(chuàng)建目標點,然后調(diào)用findHomography,得到變換矩陣H,基于H完成透視變換得到最終的輸出。
第一步的代碼實現(xiàn)如下:
Mat?src?=?imread("D:/images/mytest.jpg");
Mat?image?=?src.clone();
Mat?gray,?binary;
cvtColor(image,?gray,?COLOR_BGR2GRAY);
threshold(gray,?binary,?0,?255,?THRESH_BINARY?|?THRESH_OTSU);
//?發(fā)現(xiàn)輪廓
vector<vector>?contours;
vector?hierachy;
findContours(binary,?contours,?hierachy,?RETR_EXTERNAL,?CHAIN_APPROX_SIMPLE);
int?index?=?-1;
double?max?=?-1;
double?angle?=?0;
for?(int?i?=?0;?i?????double?area?=?contourArea(contours[i]);
????if?(area?>?max)?{
????????max?=?area;
????????index?=?i;
????}
}
drawContours(image,?contours,?index,?Scalar(0,?255,?0),?2,?8); 輸出如下:

第二步的代碼實現(xiàn)如下:
//?尋找矩形輪廓四個點
Mat?approxCurves;
approxPolyDP(contours[index],?approxCurves,?100,?true);
printf("rows?:?%d,?cols?:?%d?\n",?approxCurves.rows,?approxCurves.cols);
vector?srcPts;
for?(int?n?=?0;?n?????Vec2i?pt?=?approxCurves.at(n,?0);
????printf("pt.x=?%d,?pt.y?=?%d?\n",?pt[0],?pt[1]);
????srcPts.push_back(Point2f(pt[0],?pt[1]));
????circle(image,?Point(pt[0],?pt[1]),?12,?Scalar(0,?0,?255),?8,?8,?0);
}
imwrite("D:/result.png",?image); 輸出如下:

第三步,透視變換
Mat?h?=?findHomography(srcPts,?dstPts);
warpPerspective(src,?dst,?h,?src.size());
imwrite("D:/correct_document.png",?dst);輸出如下:

好消息!?
小白學(xué)視覺知識星球
開始面向外開放啦??????
下載1:OpenCV-Contrib擴展模塊中文版教程 在「小白學(xué)視覺」公眾號后臺回復(fù):擴展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴展模塊教程中文版,涵蓋擴展模塊安裝、SFM算法、立體視覺、目標跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺實戰(zhàn)項目52講 在「小白學(xué)視覺」公眾號后臺回復(fù):Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學(xué)校計算機視覺。 下載3:OpenCV實戰(zhàn)項目20講 在「小白學(xué)視覺」公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學(xué)習(xí)進階。 交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

