HarmonyOS之AI能力·文檔檢測校正
文檔校正提供了文檔翻拍過程的輔助增強功能,包含兩個子功能:文檔檢測和文檔校驗。
文檔檢測:能夠自動識別圖片中的文檔,返回文檔在原圖中的位置信息。這里的文檔泛指外形方正的事物,比如書本、相片、畫框等。
文檔校正:能根據(jù)文檔在原始圖片中的位置信息校正文檔的拍攝角度,自動將拍攝視角調(diào)整到正對文檔的角度上。
調(diào)用文檔檢測接口,識別圖片中的文檔,返回文檔在原圖中的位置信息;
如下圖中的紅點所示,文檔檢測接口返回了圖中相片文檔四個頂點相對圖像左上角的坐標信息:
文檔檢測結果如下,該 JSON 保存了原圖中相片文檔四個角相對原圖左上頂點的坐標信息(單位:像素),其中 resultCode 為返回碼:
{ "resultCode":0, "doc": "{ \"bottom_left\":{\"x\":17,\"y\":440}, \"bottom_right\":{\"x\":589,\"y\":760}, \"top_left\":{\"x\":256,\"y\":13}, \"top_right\":{\"x\":829,\"y\":332} }" }
1
2
3
4
5
6
7
8
9
10
11
根據(jù)文檔在原始圖片中的位置信息校正文檔的拍攝角度(可自定義校正的區(qū)域)。
圖片中的校正區(qū)域:
校正上圖中深藍色矩形(文檔檢測接口返回的文檔區(qū)域)區(qū)域,校正后的效果如下圖:
支持處理的圖片格式包括 JPEG、JPG、PNG,最終輸出的圖片僅支持 JPEG 格式。
拍攝時盡量將文檔放置在與文檔背景色有一定色差的平面上,并盡量讓文檔充滿畫面,保持文檔邊界入鏡,以獲得最佳效果。
輸入圖片高和寬最小為 100 像素,最大為 10000 像素。
將紙質(zhì)信件等舊文檔翻拍成電子版,幫助改善舊文檔的翻拍效果。
記錄書畫展覽中的精彩作品,幫助將作品拍攝得更加端正。
文檔校正提供了 setVisionConfiguration()、docDetect() 和 docRefine() 三個函數(shù)接口。
setVisionConfiguration 是 IDocRefine 接口的成員,通過傳入的 DocRefineConfiguration,選擇需要調(diào)用的文檔校正類型:
void setVisionConfiguration(DocRefineConfiguration docRefineConfiguration);
1
DocRefineConfiguration 的常用設置:
調(diào)用 IDocRefine的docDetect() 方法,獲取檢測結果:
int docDetect(VisionImage image, DocCoordinates result, VisionCallback
1
說明:
image 為待文檔檢測的輸入圖片。
如果 visionCallback 為 null,執(zhí)行同步調(diào)用,結果碼由方法返回,檢測結果由 result 中返回。
如果 visionCallback 為有效的回調(diào)函數(shù),則該函數(shù)為異步調(diào)用,函數(shù)返回時 result 中的值無效,實際識別結果由回調(diào)函數(shù)返回。
同步模式調(diào)用成功時,該函數(shù)返回結果碼 0。異步模式調(diào)用請求發(fā)送成功時,該函數(shù)返回結果碼 700。
調(diào)用 IDocRefine 的 docRefine() 方法,獲取校正結果:
int docRefine(VisionImage image, DocCoordinates coordinates, ImageResult result, VisionCallback
1
2
說明:
image 為待文檔校正的輸入圖片。
如果 visionCallback 為 null,執(zhí)行同步調(diào)用,結果碼由方法返回,校正結果由 result 中返回。
如果 visionCallback 為有效的回調(diào)函數(shù),則該函數(shù)為異步調(diào)用,函數(shù)返回時 result 中的值無效,實際識別結果由回調(diào)函數(shù)返回。
同步模式調(diào)用成功時,該函數(shù)返回結果碼 0。異步模式調(diào)用請求發(fā)送成功時,該函數(shù)返回結果碼 700。
在使用文檔校正時,先將相關的類添加至工程:
import ohos.ai.cv.common.ConnectionCallback; import ohos.ai.cv.common.VisionCallback; import ohos.ai.cv.common.VisionImage; import ohos.ai.cv.common.VisionManager; import ohos.ai.cv.common.ImageResult; import ohos.ai.cv.docrefine.DocCoordinates; import ohos.ai.cv.docrefine.DocRefineConfiguration; import ohos.ai.cv.docrefine.IDocRefine; import ohos.app.Context; import ohos.media.image.PixelMap;
1
2
3
4
5
6
7
8
9
10
定義 ConnectionCallback 回調(diào),實現(xiàn)連接能力引擎成功與否后的操作:
ConnectionCallback connectionCallback = new ConnectionCallback() { @Override public void onServiceConnect() { // 定義連接能力引擎成功后的操作。 } @Override public void onServiceDisconnect() { // 定義連接能力引擎失敗后的操作。 } };
1
2
3
4
5
6
7
8
9
10
11
調(diào)用 VisionManager.init() 方法,將此工程的 context 和已經(jīng)定義的 connectionCallback 作為入?yún)ⅲ⑴c能力引擎的連接,context 應為 ohos.aafwk.ability.Ability 或 ohos.aafwk.ability.AbilitySlice 的實例或子類實例:
int result = VisionManager.init(context, connectionCallback);
1
實例化 IDocRefine 接口,將此工程的 context 作為入?yún)ⅲ琧ontext 應為 ohos.aafwk.ability.Ability 或 ohos.aafwk.ability.AbilitySlice 的實例或子類實例:
IDocRefine docRefine = VisionManager.getDocRefine(context);
1
實例化 VisionImage 對象 image,并傳入待校正圖片 pixelMap:
VisionImage image = VisionImage.fromPixelMap(pixelMap);
1
實例化 DocCoordinates 對象 docCoordinates:
DocCoordinates docCoordinates = new DocCoordinates();
1
(可選)定義 VisionCallback 回調(diào):
在異步模式下,該類的 onResult() 方法用于獲得檢測的結果 docCoordinates(內(nèi)含檢測到的文檔坐標);onError() 方法用于處理錯誤返回碼;onProcessing() 方法用于返回處理進度,目前沒有實現(xiàn)此接口的功能。
同步與異步模式區(qū)別在于 docDetect() 的最后一個參數(shù) visionCallback 是否為空。若非空則為異步模式,此時會忽略自定義的 DocCoordinates 輸入 docCoordinates,接口調(diào)用結果一律從回調(diào)函數(shù)visionCallback 獲得。
VisionCallback
1
2
3
4
5
6
7
8
9
10
11
12
13
14
實例化 ImageResult 對象 imageResult:
ImageResult imageResult = new ImageResult();
1
(可選)定義 VisionCallback 回調(diào):
在異步模式下,該類的 onResult() 方法用于獲得校正的結果 imageResult(內(nèi)含校正后的圖片);onError() 方法用于處理錯誤返回碼;onProcessing() 方法用于返回處理進度,目前沒有實現(xiàn)此接口的功能。
同步與異步模式區(qū)別在于 docRefine() 的最后一個參數(shù) visionCallback 是否為空。若非空則為異步模式。此時會忽略自定義的 ImageResult 輸入 imageResult,接口調(diào)用結果一律從回調(diào)類 visionCallback 獲得。
VisionCallback
1
2
3
4
5
6
7
8
9
10
11
12
13
14
通過 DocRefineConfiguration 配置校正參數(shù),可選擇進程調(diào)用模式等(推薦使用MODE_IN同進程模式),跨進程模式(MODE_OUT)下調(diào)用方與能力引擎處于不同進程;同進程模式(MODE_IN)下,能力引擎在調(diào)用方進程中實例化,調(diào)用方通過反射的方式調(diào)用引擎里的文檔校正能力。以同進程調(diào)用為例:
DocRefineConfiguration.Builder builder = new DocRefineConfiguration.Builder(); builder.setProcessMode(VisionConfiguration.MODE_IN); DocRefineConfiguration configuration = builder.build(); docRefine.setVisionConfiguration(configuration);
1
2
3
4
(可選)調(diào)用 IDocRefine的prepare() 方法:
result = docRefine.prepare();
1
調(diào)用 IDocRefine 的 docDetect() 方法:
同步模式調(diào)用完成時,該函數(shù)立即返回結果碼。
異步模式調(diào)用請求發(fā)送成功時,該函數(shù)返回結果碼700。如果返回其他的值,說明異步調(diào)用請求不成功,需要先處理錯誤,回調(diào)函數(shù)不會被調(diào)用。
如果異步模式調(diào)用請求發(fā)送成功,則檢測完成后,相應的回調(diào)函數(shù)會被自動調(diào)用。
如果 onResult() 回調(diào)被調(diào)用,說明檢測成功,相當于同步模式結果碼為0的情況。
如果 onError() 方法被調(diào)用,說明檢測發(fā)生了錯誤,具體的調(diào)用結果碼將由 onError() 的參數(shù)接收。
result = docRefine.docDetect(image, docCoordinates, null); // 同步 // 或者 result = docRefine.docDetect(image, null, callback); // 異步
1
2
3
調(diào)用 IDocRefine的docRefine() 方法:
同步模式調(diào)用完成時,該函數(shù)立即返回結果碼。
異步模式調(diào)用請求發(fā)送成功時,該函數(shù)返回結果碼700。如果返回其他的值,說明異步調(diào)用請求不成功,需要先處理錯誤,回調(diào)函數(shù)不會被調(diào)用。
如果異步模式調(diào)用請求發(fā)送成功,則校正完成后,相應的回調(diào)函數(shù)會被自動調(diào)用。
如果 onResult() 回調(diào)被調(diào)用,說明校正成功,相當于同步模式結果碼為0的情況。
如果 onError() 方法被調(diào)用,說明校正發(fā)生了錯誤,具體的調(diào)用結果碼將由 onError() 的參數(shù)接收。
result = docRefine.docRefine(image, docCoordinates, imageResult, null); // 同步 // 或者 result = docRefine.docRefine(image, docCoordinates, null, callback); // 異步
1
2
3
調(diào)用 IDocRefine的release() 方法,釋放資源,調(diào)用 pixelMap 的 release() 方法,釋放圖片內(nèi)存:
result = docRefine.release(); if (pixelMap != null) { pixelMap.release(); pixelMap = null; }
1
2
3
4
5
調(diào)用 VisionManager.destroy() 方法,斷開與能力引擎的連接:
VisionManager.destroy();
1
結果碼定義如下表:
AI 任務調(diào)度
版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。
版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。