OPENCV數字識別(非手寫數字/采用模板匹配)

這篇文章的重點在于 模板匹配 的使用。模板匹配是計算機視覺中的一項基本技術,它通過比對輸入圖像與模板圖像的相似度,來進行目標識別。對于數字識別,特別是標準數字的識別,模板匹配非常有效。

請看效果:
飛騰派桌面

文章結構

  1. 模板匹配的概念
  2. 如何裁剪圖像以提高匹配精度
  3. 代碼實現:數字識別
  4. 代碼解析
  5. 總結與建議

模板匹配的概念

模板匹配是一種在圖像中查找特定模板區域的方法。通過計算輸入圖像與多個模板的相似度,找到最匹配的區域。在數字識別中,這項技術通過將待識別的數字與一組模板數字進行比對,識別出最接近的數字。

如何裁剪圖像以提高匹配精度

在使用模板匹配時,圖像的預處理是至關重要的。裁剪掉不需要的部分,尤其是圖像中可能干擾匹配的區域,可以大大提高匹配的精度。確保圖像中只包含目標數字區域,從而提高識別準確率。


代碼實現:數字識別

接下來,我會分享一段我用OpenCV實現的數字識別代碼。這段代碼利用了模板匹配的方式來識別標準數字。

import cv2
import numpy as np
import os# 數字模板匹配
def img_match(input_img, template_dict):"""返回 (最佳匹配數字, 最大相似度)"""resized_img = cv2.resize(input_img, (32, 48), interpolation=cv2.INTER_LINEAR)max_val = 0.0best_num = -1for i in range(10):template = template_dict[i]result = cv2.matchTemplate(resized_img, template, cv2.TM_CCOEFF_NORMED)_, current_max, _, _ = cv2.minMaxLoc(result)if current_max > max_val:max_val = current_maxbest_num = ireturn best_num, max_val# 加載數字模板
def load_templates(template_dir):template_dict = {}for i in range(10):template_path = os.path.join(template_dir, f"{i}.png")template = cv2.imread(template_path, cv2.IMREAD_GRAYSCALE)if template is not None:_, binary_template = cv2.threshold(template, 100, 255, cv2.THRESH_BINARY_INV)resized_template = cv2.resize(binary_template, (32, 48), interpolation=cv2.INTER_LINEAR)template_dict[i] = resized_templatereturn template_dict# 主函數
def main():# 加載數字模板template_dir = "G:/pycharm/projects/opencv/num/"  # 修改為你的模板路徑template_dict = load_templates(template_dir)# 打開攝像頭cap = cv2.VideoCapture(1)if not cap.isOpened():print("無法打開攝像頭")returnwhile True:ret, frame = cap.read()if not ret:breakimgContour = frame.copy()imgGray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 1)_, imgThresh = cv2.threshold(imgBlur, 95, 255, cv2.THRESH_BINARY_INV)edges = cv2.Canny(imgBlur, 30, 150)imgCanny = cv2.bitwise_or(edges, imgThresh)kernel = np.ones((3, 3), np.uint8)imgCanny = cv2.morphologyEx(imgCanny, cv2.MORPH_CLOSE, kernel)contours, hierarchy = cv2.findContours(imgCanny, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)for cnt in contours:area = cv2.contourArea(cnt)if area < 4500:  # 像素面積小,可認為是數字x, y, w, h = cv2.boundingRect(cnt)roi = imgCanny[y:y + h, x:x + w]if roi.size == 0:continuenum, score = img_match(roi, template_dict)if score > 0.6:cv2.putText(imgContour, f"{num}", (x, y - 10),cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)cv2.imshow("Processed", imgContour)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()if __name__ == "__main__":main()

代碼解析

1. 數字模板匹配

img_match 函數負責執行模板匹配操作。它將輸入的圖像與預先加載的數字模板進行比對,計算出匹配度,并返回最佳匹配的數字和相似度。

2. 加載模板

load_templates 函數從指定路徑加載數字模板,模板圖像會經過二值化處理并調整到統一的尺寸,確保模板能夠適應各種輸入圖像。

3. 圖像預處理

在主函數中,我們首先通過攝像頭讀取圖像,并進行一些常見的圖像預處理操作,包括灰度化、模糊化和邊緣檢測。然后,我們使用 cv2.findContours 函數提取圖像中的數字區域。

4. 匹配與識別

通過 img_match 函數對每一個數字區域進行模板匹配,若匹配的相似度大于設定的閾值(例如0.6),則將識別的數字顯示在圖像上。


總結與建議

通過模板匹配,我們能夠快速、準確地識別標準數字,適用于數字識別的基礎場景。對于更復雜的場景,如手寫數字或不同字體的數字,可能需要更先進的算法,如深度學習模型。

希望這篇文章能夠幫助你理解OpenCV中模板匹配的使用方法。如果你有任何問題或改進建議,歡迎在評論區留言討論。

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

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

相關文章

在 Kubernetes 中部署 Trivy 漏洞掃描服務

創建專用 Namespace # trivy-ns.yaml apiVersion: v1 kind: Namespace metadata: name: trivy-system配置持久化存儲&#xff08;緩存數據庫&#xff09; apiVersion: v1 kind: PersistentVolumeClaim metadata: name: trivy-db-cache namespace: trivy-system spec: acc…

Cursor安裝注冊+基礎配置+入門實操

一、安裝注冊 官網地址&#xff1a;https://www.cursor.com/ 下載按鈕會根據電腦系統來匹配&#xff0c;點擊對應「Download」按鈕進行下載。完成后&#xff0c;按步驟安裝即可。 安裝完成后&#xff0c;即可點擊圖標打開軟件。 基礎設置完成后&#xff0c;就需要選擇注冊賬號…

秒殺業務優化之從分布式鎖到基于消息隊列的異步秒殺

一、業務場景介紹 優惠券、門票等限時搶購常常出現在各類應用中&#xff0c;這樣的業務一般為了引流宣傳而降低利潤&#xff0c;所以一旦出現問題將造成較大損失&#xff0c;那么在業務中就要求我們對這類型商品嚴格限時、限量、每位用戶限一次、準確無誤的創建訂單&#xff0c…

MiniMax GenAI 可觀測性分析:基于阿里云 SelectDB 構建 PB 級別日志系統

“阿里云SelectDB作為MiniMax日志存儲服務的核心支撐&#xff0c;為在線和離線業務提供了高效、穩定的查詢與聚合分析能力。其支持實時物化視圖、租戶資源隔離、冷熱分離等企業級特性&#xff0c;不僅有效解決了日志場景下PB級別數據查詢的性能瓶頸&#xff0c;還通過智能化的資…

【YOLO V3】目標檢測 Darknet 訓練自定義模型

【YOLO V3】目標檢測 Darknet 訓練自定義模型 前言整體思路環境檢查與依賴配置克隆 YOLOv3 Darknet 并編譯Clone Darknet 項目文件修改 Makefile 文件修改模型保存頻率項目編譯 準備數據集配置訓練文件數據集&#xff1a;datasets &#xff08;自制&#xff09;權重文件 yolov3…

Kafka分區分配策略詳解

Kafka分區分配策略詳解 Kafka作為當前最流行的分布式消息隊列系統&#xff0c;其分區分配策略直接影響著系統的性能、可靠性和可擴展性。合理的分區分配不僅能夠提高數據處理的效率&#xff0c;還能確保系統負載的均衡。 Kafka提供了多種內置的分區分配策略&#xff0c;包括R…

C#中 String類API(函數)

字符串屬性 string str "打工人";Console.WriteLine(str);char s str[0];Console.WriteLine(s); 字符串內置API(函數) 1. Concat 拼接字符串 string s1 "打";string s2 "工";string s3 "人";string sthstring.Concat(s1, s2, s…

JavaScript性能優化實戰手冊:從V8引擎到React的毫秒級性能革命

目錄 一、性能優化的本質挑戰1.1 瀏覽器渲染管線的性能瓶頸2.1 內存管理優化2.2 執行效率優化2.3 網絡傳輸優化 三、React框架深度調優3.1 渲染性能優化3.2 性能監控體系 四、企業級優化案例4.1 電商平臺首頁優化4.2 數據可視化大屏優化 五、新一代性能優化技術5.1 WASM性能突破…

【PostgreSQL】pg各版本選用取舍邏輯與docker安裝postgres:15

企業常用 PostgreSQL 版本推薦 1. PostgreSQL 14&#xff08;最常見&#xff0c;穩定&#xff09; 目前許多企業仍在使用 PostgreSQL 14&#xff0c;因為它在性能、并發處理、JSON 支持等方面做了較多優化&#xff0c;同時又非常穩定。官方支持時間&#xff1a;2026 年 11 月…

DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)之添加導出數據功能

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏+關注哦 ?? 目錄 DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)之添加導出數據功能??頁面效果??指令輸入?…

《Python實戰進階》第31集:特征工程:特征選擇與降維技術

第31集&#xff1a;特征工程&#xff1a;特征選擇與降維技術 摘要 特征工程是機器學習和數據科學中不可或缺的一環&#xff0c;其核心目標是通過選擇重要特征和降低維度來提升模型性能并減少計算復雜度。本集聚焦于特征選擇與降維技術&#xff0c;涵蓋過濾法、包裹法、嵌入法等…

避雷 :C語言中 scanf() 函數的錯誤?使用!!!

1. 返回值說明 scanf函數會返回成功匹配并賦值的輸入項個數&#xff0c;而不是返回輸入的數據。 可以通過檢查返回值數量來確認輸入是否成功。若返回值與預期不符&#xff0c;就表明輸入存在問題。 #include <stdio.h>int main() {int num;if (scanf("%d", …

Excel第41套全國人口普查

2. 導入網頁中的表格&#xff1a;數據-現有鏈接-考生文件夾&#xff1a;網頁-找到表格-點擊→變為√-導入刪除外部鏈接關系&#xff1a;數據-點擊鏈接-選中連接-刪除-確定&#xff08;套用表格格式-也會是刪除外部鏈接&#xff09;數值縮小10000倍&#xff08;除以10000即可&am…

WPS宏開發手冊——使用、工程、模塊介紹

目錄 系列文章前言1、開始1.1、宏編輯器使用步驟1.2、工程1.3、工程 系列文章 使用、工程、模塊介紹 JSA語法 第三篇練習練習題&#xff0c;持續更新中… 前言 如果你是開發人員&#xff0c;那么wps宏開發對你來說手拿把切。反之還挺吃力&#xff0c;需要嘻嘻&#xf…

EtherCAT轉CANopen配置CANopen側的PDO映射

EtherCAT轉CANopen配置CANopen側的PDO映射 在工業自動化領域&#xff0c;EtherCAT和CANopen是兩種廣泛應用的通信協議。它們各自具有獨特的優勢&#xff0c;但在某些應用場景下&#xff0c;需要將這兩種協議進行轉換以實現設備間的高效數據交換。本文將詳細介紹如何在使用Ethe…

【QT】Qt creator快捷鍵

Qt creator可以通過以下步驟快捷鍵査看調用關系&#xff1a; 1.打開代碼文件。 2.將光標放在你想要查看調用關系的函數名上。 3.按下鍵盤快捷鍵 CtrlshiftU。 4.彈出菜單中選擇“調用路徑”或“被調用路徑” 5.在彈出的窗口中可以查看函數的調用關系 折疊或展開代碼快捷鍵&…

【RHCE】LVS-NAT模式負載均衡實驗

目錄 題目 IP規劃 配置IP RS1 RS2 RS3 LVS client 配置RS 配置LVS 安裝lvs軟件 啟動ipvsadm服務 lvs規則匹配 ipvsadm部分選項 客戶端測試 總結 題目 使用LVS的 NAT 模式實現 3 臺RS的輪詢訪問&#xff0c;IP地址和主機自己規劃。 IP規劃 主機IP地址RS1-nat模…

排序算法(插入,希爾,選擇,冒泡,堆,快排,歸并)

1.插入排序 插入排序的主要思想是額外申請一個空間cur&#xff0c;讓cur一開始等于數組的第1號位置,設置i1&#xff0c;讓i-1的元素與其比較&#xff0c;如果arr[i-1]>arr[i]&#xff0c;就讓arr[i1] arr[i]&#xff0c;當進行到最后一次對比結束&#xff0c;i-1,再讓arr[…

Java——Random庫

一、作用 Random庫——生成隨機數 二、實現步驟 1.導包&#xff1a;import java.util.Random; #快捷鍵&#xff1a;“Random”回車鍵 2.取得隨機數&#xff1a;Random 變量1 new Random(); 3.調用隨機數&#xff1a;類型 變量2 變量1.nextInt(n); &#xff08;代表變量…

解線性方程組的直接方法:高斯消元法與其程序實現

解線性方程組的直接方法&#xff1a;高斯消元法與其程序實現 1.順序高斯消元法 設線性方程組 A x b \boldsymbol{Ax}\boldsymbol{b} Axb 如果 a k k ( k ) ≠ 0 a_{kk}^{\left( k \right)}\ne 0 akk(k)??0 可以通過高斯消元法轉化為等價的三角形線性方程組&#xff1a; …