小夥伴們在日常的工作學習中,或多或少的都會遇到,將書籍或者是資料文件,用手機進行拍攝,方便文檔的保存,但是由於拍攝的角度或者是拍攝手法的原因,拍攝出來的照片往往會出現偏差,閱讀起來也不方便。
今天,小編就爲大家制作了一款簡易的掃描器,幫助大家將拍攝的圖片進行糾正,並將糾正的圖片進行保存,一起來看看吧。
01.程序講解
接下來,我們通過程序的一點點解析,讓大家更好的對軟件有更好的認識。對於程序部分的講解,我們可以拆解爲兩個部分:
- 圖片的糾正
- 軟件界面的構建
02.圖片的糾正
對於圖片的糾正,可以歸結爲邊緣檢測——>角點檢測——>透視變換的過程,邊緣檢測的作用是檢測圖片中的圖像的邊緣,程序如下圖所示。
03.邊緣檢測
程序通過opencv中的Canny函數來檢測物體的邊界,這裏需要注意的是,有兩個閾值數值需要調節:
- 程序中分別用threshold_bar1和threshold_bar2兩個滑動條來控制,threshold_bar2用來檢測較爲明顯的邊界;
- 而threshold_bar1則是負責將threshold_bar2檢測出來的邊界進行連接,組成一個完整的物體邊界信息;
通過dilate和erode函數來將邊緣進行填充後,通過findContours函數,來得到物體的輪廓的位置座標信息,程序中contours變量保存的是位置座標數值。對於邊緣檢測後填充的效果,效果如下圖所示:
04.角點檢測
對於角點的檢測,也就是對於輪廓中“角”的檢測,程序如下圖所示。
程序通過對於輪廓數值中每一組數值的面積計算,如果面積大於5000,就利用approxPolyDP函數對輪廓進行多邊形的擬合操作;如果擬合出來的圖形是四邊形的話,則說明該組輪廓數據下,檢測到了類似於書本、紙張等矩形的目標,那麼就返回approxPolyDP函數所擬合的四個角點座標的數值。如下圖所示。
05.透視變換
在得到擬合的角點數據之後,接下來就是要進行透視變換的操作,所謂的透視變換,可以理解爲將偏斜角度拍攝的目標,轉變爲正視圖。程序如下圖所示:
程序將擬合得到的四個角點座標,通過透視變換轉變爲480x640大小的正視圖,程序中通過getPerspectiveTransform函數生成透視變換的變換矩陣,利用warpPerspective函數來完成對於原圖的透視變換,其結果如下圖所示:
06.軟件界面的構建
軟件界面的構建,利用的是PyQt5進行製作,其界面如下所示:
軟件界面中,位於界面中央顯示的是圖像的展示區域,分別是原圖展示,提取到的矩形目標以及最終的透視變換的結果圖。
界面中黃色的模塊表示的是按鈕控件,其中,“文件”按鈕,表示選取本地的原始圖片,“開始”按鈕表示的是執行圖片的投視變換,
保存按鈕則是將最終的透視變換結果進行保存。
“退出”按鈕則是代表退出整個軟件。
這裏我們以“開始”按鈕爲例,解析一下其控制的函數。
“開始“按鈕綁定openImg函數,當點擊按鈕時,程序通過getOpenFileName函數來選取本地的文件,獲取得到本地文件的路徑,並將本地的圖片展示在界面當中。
07.總結
以上就是小編爲大家分享的圖片掃描器的內容,大家可以下載軟件進行測試,需要注意的是,在圖片拍攝的過程中,爲了保證掃描器結果準確性,大家儘量保證拍攝圖片的背景爲單一的顏色,如上圖中,原始圖片中,書本的背景爲單一的黑色,這樣,最大程度的保證了結果的準確性。覺得本篇不錯的小夥伴,記得在留言區給個三連哦!
【菜鳥學Python】累計原創近400篇趣味乾貨(爬蟲,數據分析,算法,面試指南,原創趣味實戰,Python遊戲,機器學習),歡迎一起學Python,交流指正。