ocr-不動產權識別

目錄

一、在阿里云申請ocr識別服務

二、創建springboot項目

三、后續

一、在阿里云申請ocr識別服務

在線體驗:房產證圖片上傳

[阿里官方]不動產權證OCR文字識別_API專區_云市場-阿里云 (aliyun.com)

可以選擇一毛500次這個

?當然也可以白嫖100

下面有個在線調試,類似于apifox/postman,在線的發送http請的網站,這里你可以看到post請求的url是,httpbody部分需要一個json格式的字符串

二、創建springboot項目

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.3</version> <!-- 使用最新版本 --></dependency>

?okhttp主要是模擬對阿里云接口發送http請求

需要對圖片進行base64轉碼

@RestController
@RequestMapping("/ocr")
public class OcrController {@Autowiredprivate OwnershipService ownershipService;@RequestMapping("/ownership")public String ownershipCertificate(@RequestParam("file") MultipartFile file) throws IOException {System.out.println(file.getOriginalFilename());return ownershipService.getData(file.getBytes());}
}

base64圖片轉碼

?這里重寫兩種轉碼方式

public class ImageToBase64 {public static String imageToBase64(String imagePath) throws IOException {File file = new File(imagePath);byte[] bytes = new byte[(int) file.length()];try (FileInputStream fis = new FileInputStream(file)) {fis.read(bytes);}return Base64.getEncoder().encodeToString(bytes);}public static String imageToBase64(byte[] bytes) throws IOException {return Base64.getEncoder().encodeToString(bytes);}
}

service層

?

@Service
public class OwnershipService {@Autowiredprivate OkHttpClient okHttpClient;@Autowiredprivate ObjectMapper objectMapper;private String appcode = "自己申請的";public String getData(byte[] imageBody) {String ret = "";try {// 1. 準備請求體ImageBody body = new ImageBody();body.setImg(ImageToBase64.imageToBase64(imageBody));// 2. 確保APPCODE正確// 3. 創建請求MediaType JSON = MediaType.get("application/json; charset=utf-8");String jsonBody = objectMapper.writeValueAsString(body);Request request = new Request.Builder().url("https://bdcqz.market.alicloudapi.com/ocrservice/estateCert").post(RequestBody.create(jsonBody, JSON)).addHeader("Authorization", "APPCODE " + appcode).addHeader("Content-Type", "application/json; charset=UTF-8").build();// 4. 執行請求并處理響應try (Response response = okHttpClient.newCall(request).execute()) {if (!response.isSuccessful()) {String errorBody = response.body().string();throw new IOException("API請求失敗:\n" +"狀態碼: " + response.code() + "\n" +"錯誤信息: " + response.message() + "\n" +"響應體: " + errorBody);}ret = response.body().string();System.out.println("識別結果: " + ret);}} catch (Exception e) {System.err.println("發生錯誤: " + e.getMessage());e.printStackTrace();}return ret;}
}

?okhttp記得交給spring來管理

@Configuration
public class OkHttpConfig {@Beanpublic OkHttpClient okHttpClient() {OkHttpClient okHttpClient = new OkHttpClient();return okHttpClient;}
}

?index,html

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>房產證圖片上傳</title><style>body {font-family: 'Microsoft YaHei', Arial, sans-serif;background-color: #f5f5f5;margin: 0;padding: 20px;color: #333;}.container {max-width: 800px;margin: 0 auto;background-color: #fff;padding: 30px;border-radius: 8px;box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);}h1 {color: #2c3e50;text-align: center;margin-bottom: 30px;}.upload-area {border: 2px dashed #3498db;border-radius: 5px;padding: 30px;text-align: center;margin-bottom: 20px;cursor: pointer;transition: all 0.3s;}.upload-area:hover {background-color: #f0f8ff;border-color: #2980b9;}.upload-icon {font-size: 48px;color: #3498db;margin-bottom: 15px;}.upload-text {font-size: 16px;margin-bottom: 10px;}.file-input {display: none;}.preview-container {display: none;margin-top: 20px;text-align: center;}.preview-image {max-width: 100%;max-height: 400px;border-radius: 5px;box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);}.btn {background-color: #3498db;color: white;border: none;padding: 12px 24px;font-size: 16px;border-radius: 5px;cursor: pointer;transition: background-color 0.3s;display: block;margin: 20px auto 0;}.btn:hover {background-color: #2980b9;}.requirements {margin-top: 30px;padding: 15px;background-color: #f8f9fa;border-radius: 5px;font-size: 14px;}.requirements h3 {margin-top: 0;color: #2c3e50;}.error-message {color: #e74c3c;text-align: center;margin-top: 10px;display: none;}</style><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
</head>
<body>
<div class="container"><h1>OCR-房產證圖片上傳</h1><div class="requirements"><h3>上傳要求:</h3><ul><li>請上傳清晰、完整的房產證圖片</li><li>圖片需包含房產證全部內容,無遮擋</li><li>確保圖片光線充足,文字清晰可辨</li><li>支持 JPG、PNG 格式,大小不超過 5MB</li><li>請勿上傳與房產證無關的圖片</li></ul></div><div class="upload-area" id="uploadArea"><div class="upload-icon">📁</div><div class="upload-text">點擊或拖拽房產證圖片到此處</div><div class="upload-subtext">支持 JPG、PNG 格式,大小不超過 5MB</div><input type="file" id="fileInput" class="file-input" accept="image/jpeg, image/png"></div><div class="error-message" id="errorMessage"></div><div class="preview-container" id="previewContainer"><img id="previewImage" class="preview-image" src="#" alt="房產證預覽"><button class="btn" id="uploadBtn">確認上傳</button></div><div class="result"></div></div><script>const uploadArea = document.getElementById('uploadArea');const fileInput = document.getElementById('fileInput');const previewContainer = document.getElementById('previewContainer');const previewImage = document.getElementById('previewImage');const uploadBtn = document.getElementById('uploadBtn');const errorMessage = document.getElementById('errorMessage');let selectedFile = null;// 點擊上傳區域觸發文件選擇uploadArea.addEventListener('click', () => {fileInput.click();});// 拖放功能uploadArea.addEventListener('dragover', (e) => {e.preventDefault();uploadArea.style.backgroundColor = '#f0f8ff';uploadArea.style.borderColor = '#2980b9';});uploadArea.addEventListener('dragleave', () => {uploadArea.style.backgroundColor = '';uploadArea.style.borderColor = '#3498db';});uploadArea.addEventListener('drop', (e) => {e.preventDefault();uploadArea.style.backgroundColor = '';uploadArea.style.borderColor = '#3498db';if (e.dataTransfer.files.length) {handleFile(e.dataTransfer.files[0]);}});// 文件選擇處理fileInput.addEventListener('change', () => {if (fileInput.files.length) {handleFile(fileInput.files[0]);}});// 處理選擇的文件function handleFile(file) {// 驗證文件類型const validTypes = ['image/jpeg', 'image/png'];if (!validTypes.includes(file.type)) {showError('請上傳 JPG 或 PNG 格式的圖片');return;}// 驗證文件大小 (5MB)if (file.size > 5 * 1024 * 1024) {showError('圖片大小不能超過 5MB');return;}selectedFile = file;// 預覽圖片const reader = new FileReader();reader.onload = (e) => {previewImage.src = e.target.result;previewContainer.style.display = 'block';errorMessage.style.display = 'none';};reader.readAsDataURL(file);}// 顯示錯誤信息function showError(message) {errorMessage.textContent = message;errorMessage.style.display = 'block';previewContainer.style.display = 'none';}// 上傳按鈕點擊事件uploadBtn.addEventListener('click', () => {// 這里添加實際上傳邏輯alert('房產證圖片已上傳,正在識別中');const formData = new FormData();formData.append('file', selectedFile);$.ajax({url: '/ocr/ownership',type: 'POST',data: formData,processData: false,contentType: false,success: function (data) {let jsonData = JSON.parse(data);console.log(jsonData)let resultDiv = document.querySelector('.result');let str = '<h1>' + 'OCR-房產證-識別結果';for (let val of jsonData.prism_keyValueInfo) {if (val.value != null && val.value.length > 0){str += '<h2>' + val.key + ': ' + val.value + '</h2>'}}resultDiv.innerHTML = str;}});});
</script>
</body>
</html>

三、后續

  • 增加其他ocr識別服務
  • 增加統一結果返回
  • 統一處理全局異常
  • 增加在pom文件處統一管理appcode

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75911.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75911.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75911.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode算法題(Go語言實現)_47

題目 給你一個 m x n 的迷宮矩陣 maze &#xff08;下標從 0 開始&#xff09;&#xff0c;矩陣中有空格子&#xff08;用 ‘.’ 表示&#xff09;和墻&#xff08;用 ‘’ 表示&#xff09;。同時給你迷宮的入口 entrance &#xff0c;用 entrance [entrancerow, entrancecol…

The Strict Teacher (Hard Version) 去除無效的干擾!巧妙轉化

文章目錄 The Strict Teacher (Hard Version) 思考問題&#xff01;那么多個人抓一個人&#xff0c;是否是每一個人都是對于最優策略的答案是有貢獻的&#xff1f;答案是否定的&#xff0c;其實問題可以簡化為三種情況&#xff1a; 所有的老師都在大衛的右邊&#xff0c;…

《 Reinforcement Learning for Education: Opportunities and Challenges》全文閱讀

Reinforcement Learning for Education: Opportunities and Challenges 面向教育的強化學習&#xff1a;機遇與挑戰 摘要 本綜述文章源自作者在 Educational Data Mining (EDM) 2021 會議期間組織的 RL4ED 研討會。我們組織了這一研討會&#xff0c;作為一項社區建設工作的組…

idea的快捷鍵使用以及相關設置

文章目錄 快捷鍵常用設置 快捷鍵 快捷鍵作用ctrlshift/注釋選中內容Ctrl /注釋一行/** Enter文檔注釋ALT SHIFT ↑, ALT SHIFT ↓上下移動當前代碼Ctrl ALT L格式化代碼Ctrl X刪除所在行并復制該行Ctrl D復制當前行數據到下一行main/psvm快速生成入口程序soutSystem.o…

代碼隨想錄算法訓練營Day30

力扣452.用最少數量的箭引爆氣球【medium】 力扣435.無重疊區間【medium】 力扣763.劃分字母區間【medium】 力扣56.合并區間【medium】 一、力扣452.用最少數量的箭引爆氣球【medium】 題目鏈接&#xff1a;力扣452.用最少數量的箭引爆氣球 視頻鏈接&#xff1a;代碼隨想錄 題…

Swift —— delegate 設計模式

一、什么是 delegate 模式 所謂 delegate 就是代理模式。簡單來說&#xff0c;delegate 模式就是在類的函數里運行完一段代碼后&#xff0c;你可以通過一個符合某個代理協議的屬性來調代理的方法。其中&#xff0c;代理方法就是回調函數。 二、delegate 模式與閉包比的優勢 …

linux-vi和文件操作

在 Linux 系統的世界里&#xff0c;有一個核心思想貫穿始終&#xff0c;那就是 “萬物都是文件”。這一理念極大地簡化了系統資源的管理和操作&#xff0c;為用戶和開發者提供了統一且高效的交互方式。本文將深入探討這一理念在 Linux 文件系統中的具體體現&#xff0c;從硬盤分…

Endnote 21顯示字段設置與修改詳細解析(附Endnote Click)

目錄 前言字段設置與詳細解釋Endnote Click1. 安裝 Endnote Click2. 一鍵獲取Edge插件3. 安裝完成啟動插件4. 檢索期刊文獻案例5. 在 Endnote Click 我的locker中導入文獻 前言 在學術研究的漫漫征途中&#xff0c;高效管理參考文獻是每位學者、學生都繞不開的關鍵環節。Endno…

java使用 ?Stream 流對自定義對象數組去重的

在 Java 中&#xff0c;使用 Stream 流對自定義對象數組去重的核心是確保對象能正確判斷“重復”的邏輯。以下是具體實現方法及場景分析&#xff1a; 方法 1&#xff1a;直接使用 distinct()&#xff08;需重寫 equals 和 hashCode&#xff09; 若自定義對象已正確重寫 equals…

C++ (類的設計,對象的創建,this指針,構造函數)

類的設計 C對結構體是有增強的 可以包含函數作為結構體成員 可以直接定義變量 在結構體成員函數里面可以直接訪問結構體成員變量 struct student{string name;int age;float score;void play_game(const string &name);}void student::play_game(const string game){}…

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS》全文閱讀

《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS: THE IMPACT OF PROBLEM-SOLVING DATA, DATA SYNTHESIS METHODS, AND TRAINING STAGES》全文閱讀 提升語言模型中的數學推理能力&#xff1a;問題求解數據、數據合成方法及訓練階段的影響 \begin{abstract} 數學推…

網絡測試工具:涵蓋網絡測速、密碼查看、故障判斷與網絡監測

在網絡管理與維護的廣闊領域中&#xff0c;網絡測試工具扮演著至關重要的角色。它們不僅簡化了復雜的網絡診斷流程&#xff0c;還提升了工作效率。今天推薦一款包含功能全面的網絡測試工具&#xff1a;InetTest&#xff0c;是一款免費且開源的網絡測試工具&#xff0c;適用于Wi…

小剛說C語言刷題——1005 - 已知一個圓的半徑,求解該圓的面積和周長

1.題目描述 已知一個圓的半徑&#xff0c;求解該圓的面積和周長。 輸入 輸入只有一行&#xff0c;只有 1個整數。 輸出 輸出只有兩行&#xff0c;一行面積&#xff0c;一行周長。&#xff08;保留兩位小數&#xff09;。 令 pi3.1415926。 樣例 輸入 1 輸出 3.14 6.…

【算法】快速排序

算法系列六&#xff1a;快速排序 一、快速排序的遞歸探尋 1.思路 2.書寫 3.搭建 3.1設計過掉不符情況&#xff08;在最底層時&#xff09; 3.2查驗能實現基礎結果&#xff08;在最底層往上點時&#xff09; 3.3跳轉結果繼續往上回搭 4.實質 二、快速排序里的基準排序 …

SoapUI 4.6.4(32位)下載安裝教程 - 兼容老舊Windows系統

SoapUI 4.6.4&#xff08;32位版&#xff09; 是個老版本的測試工具&#xff0c;專門給 32位 Windows 電腦 用的。現在最新版都是 64 位的了&#xff0c;但如果你還在用老系統&#xff0c;可能還得找這個舊版。 SoapUI 4.6.4工具下載:https://pan.quark.cn/s/c07381db8102 這…

【AI量化第24篇】KhQuant 策略框架深度解析:讓策略開發回歸本質——基于miniQMT的量化交易回測系統開發實記

我是Mr.看海&#xff0c;我在嘗試用信號處理的知識積累和思考方式做量化交易&#xff0c;應用深度學習和AI實現股票自動交易&#xff0c;目的是實現財務自由~ 目前我正在開發基于miniQMT的量化交易系統——看海量化交易系統。 本篇要講到量化的核心了——策略。說白了每個投資者…

Java面試黃金寶典48

1. C++ 的拷貝構造函數,深拷貝和淺拷貝 定義 拷貝構造函數:在 C++ 里,拷貝構造函數屬于特殊的構造函數,其功能是使用一個已存在的對象來初始化一個新對象。當對象以值傳遞的方式作為參數傳給函數、函數返回對象、用一個對象初始化另一個對象時,拷貝構造函數會被調用。淺拷…

OpenCV學習之獲取圖像所有點的坐標位置(二)

1.功能介紹 (1)使用openCV解析了.jpeg、.jpg、.png格式的圖像文件,輸出了圖像的寬、高、通道數; (2)創建txt格式文件,保存圖像中各像素點的rgba值。 2.環境介紹 操作系統:window10 開發語言:visual studio 2015 c++ 3.功能實現過程 3.1環境設置 (1)打開Vs2015…

B2B2C多用戶商城平臺 的兩種創新玩法

以前隨便搞個淘寶京東那樣的商城就能躺著賺錢的日子早過去了&#xff01;現在市面上各種電商玩法花樣百出&#xff1a;小紅書那種刷著刷著就下單的"種草"電商&#xff0c;拼多多那種"幫我砍一刀"的社交電商&#xff0c;還有抖音快手那種看著視頻突然就想買…

【Bluedroid】A2DP Sink播放流程源碼分析(二)

接上一篇繼續分析&#xff1a;【Bluedroid】A2DP Sink播放流程源碼分析(一)_安卓a2dp sink播放流程-CSDN博客 AVDTP接收端&#xff08;Sink&#xff09;流事件處理 bta_av_sink_data_cback 是 Bluedroid 中 A2DP Sink 角色的 AVDTP 數據回調函數&#xff0c;負責處理接收端的…