OpenCv高階(八)——攝像頭調用、攝像頭OCR

文章目錄

  • 前言
  • 一、攝像頭調用通用方法
      • 1、導入必要的庫
      • 2、創建攝像頭接口
  • 二、攝像頭OCR
    • 1.引入庫
    • 2、定義函數
      • (1)定義顯示opencv顯示函數
      • (2)保持寬高比的縮放函數
      • (3)坐標點排序函數
      • (4) 四點透視變換實現
    • 3、讀取攝像頭顯示攝像頭畫面并做灰度處理
    • 4、做中值濾波并使用canny邊緣檢測
    • 5、輪廓檢測
    • 6、遍歷輪廓
    • 7、透視變換
    • 完整代碼展示
  • 總結
      • 應用
        • 文檔處理
        • 車牌識別
        • 身份證識別
        • 場景文字識別


前言

攝像頭 OCR 是指利用攝像頭采集圖像信息,然后通過光學字符識別(OCR)技術對圖像中的文字進行識別和處理的一種技術手段。

一、攝像頭調用通用方法

1、導入必要的庫

import cv2
import numpy as np

2、創建攝像頭接口

讀取本地的視頻文件或者攝像頭,接收的參數為視頻文件的地址,或者攝像頭的名稱(一般0指的是電腦自身的攝像頭,1則是外接的攝像頭)

video_capture=cv2.VideoCapture('../data/test.avi')#判斷視頻文件或者攝像頭是否正常讀取,如果讀取失敗則返回提示信息
if not  video_capture.isOpened():print("視頻打開失敗")exit()

視頻以及攝像頭文件我們都可以把它理解成老式的電影,一段視頻以及攝像頭讀取的畫面都可以看成是一張圖片一張圖片的播放,只是視頻和攝像頭的播放速度很快,導致我們視覺上認為動作是連貫的,幀率也就是一秒播放多少張圖片。

在這里插入圖片描述
因此,在使用opencv讀取攝像頭和視頻文件時我們采用循環的方法來不斷獲取攝像頭讀取的畫面。
當我們要使用opencv來做視覺方向的問題時,我們就可以調用攝像頭,對對讀取到的每一幀畫面做視覺方面的處理,來達到與攝像頭結合的動態效果。

while True:ret,frame=video_capture.read()#ret是一個標志,檢測攝像頭是否讀取成功,frame則是接收到的畫面,是一張一張的圖片if not ret:break#設置這個if判斷,是為了手動控制跳出循環,當我們按下ESC鍵時跳出循環停止讀取畫面。if cv2.waitKey(100)==27:break#釋放攝像頭資源
video_capture.release()
cv2.destroyAllWindows()

二、攝像頭OCR

簡單處理文字,將不正的文檔扶正并使文檔的字跡更清晰。

1.引入庫

import numpy as np
import cv2

2、定義函數

(1)定義顯示opencv顯示函數

def cv_show(name,value):cv2.imshow(name,value)cv2.waitKey(50)

(2)保持寬高比的縮放函數

def resize(image, width=None, height=None, inter=cv2.INTER_AREA):dim=None(h, w) = image.shape[:2]  # 獲取原始高度和寬度(兼容灰度/彩色圖)# 尺寸計算邏輯if width is None and height is None:return image  # 無縮放直接返回if width is None:r = height / float(h)  # 計算高度縮放比例dim = (int(w * r), height)  # 新尺寸元組(寬度, 高度)else:r = width / float(w)    # 計算寬度縮放比例dim = (width, int(h * r))# 執行縮放操作resized = cv2.resize(image, dim, interpolation=inter)return resized

(3)坐標點排序函數

def order_points(pts):rect = np.zeros((4, 2), dtype="float32")  # 初始化4x2矩陣#按順序找到對應的坐標0123,分別是左上右上右下、左下# 計算坐標點x+y的和s = pts.sum(axis=1)  # 形狀:(4,) ,對矩陣的每一行進行求和操作rect[0] = pts[np.argmin(s)]  # 左上角:x+y最小rect[2] = pts[np.argmax(s)]  # 右下角:x+y最大# 計算坐標點x-y的差diff = np.diff(pts, axis=1)  # 形狀:(4,1)rect[1] = pts[np.argmin(diff)]  # 右上角:x-y最小(即y相對較大)rect[3] = pts[np.argmax(diff)]  # 左下角:x-y最大(即y相對較小)return rect  # 返回有序坐標:[左上, 右上, 右下, 左下]

(4) 四點透視變換實現

def four_point_transform(image, pts):# 坐標排序(關鍵步驟!)rect = order_points(pts)(tl, tr, br, bl) = rect  # 解構賦值四個頂點# 計算輸出圖像的寬度(取兩組對邊最大值)widthA = np.sqrt(((br[0] - bl[0]) ** 2) + (br[1] - bl[1]) ** 2)widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + (tr[1] - tl[1]) ** 2)maxWidth = max(int(widthA), int(widthB))# 計算輸出圖像的高度(同理)heightA = np.sqrt(((tr[0] - br[0]) ** 2) + (tr[1] - br[1]) ** 2)heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + (tl[1] - bl[1]) ** 2)maxHeight = max(int(heightA), int(heightB))# 定義目標點坐標(規范坐標系)dst = np.array([[0, 0],[maxWidth - 1, 0],          # 寬度方向預留1像素邊界[maxWidth - 1, maxHeight - 1],[0, maxHeight - 1]], dtype="float32")# 計算透視變換矩陣(核心數學操作)M = cv2.getPerspectiveTransform(rect, dst)# 執行透視變換warped = cv2.warpPerspective(image, M, (maxWidth, maxHeight))return warped

3、讀取攝像頭顯示攝像頭畫面并做灰度處理

#讀取輸入
cap=cv2.VideoCapture(0)
if not cap.isOpened():print("攝像頭打開失敗")exit()while True:flag=0  #是否檢測到文檔的標志ret,frame=cap.read()orig=frame.copy()if not ret: #讀取失敗則退出循環print("不能讀取攝像頭")breakcv_show('iamge',frame)gray=cv2.cvtColor(frame,cv2.COLOR_BGRA2GRAY)

4、做中值濾波并使用canny邊緣檢測

gray=cv2.medianBlur(gray,3)
edged=cv2.Canny(gray,75,200)
cv_show('i',edged)

中值濾波核大小 3 適用于720p分辨率

Canny閾值可改為自適應算法(如基于圖像亮度百分比)

5、輪廓檢測

#輪廓檢測cnts=cv2.findContours(edged,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2]cnts=sorted(cnts,key=cv2.contourArea,reverse=True)[:3]# 取面積前三的輪廓image_contours=cv2.drawContours(orig,cnts,-1,(0,255,0),2) # 多邊形近似cv_show('image_contours',image_contours)

RETR_EXTERNAL 只檢測最外層輪廓(假設文檔無嵌套)

面積閾值 20000 需根據攝像頭分辨率調整(例如:1280x720下約為2%畫面占比)

6、遍歷輪廓

 #遍歷輪廓做透視變換for c in cnts:peri=cv2.arcLength(c,True)#做輪廓近似approx=cv2.approxPolyDP(c,0.01*peri,True)area=cv2.contourArea(approx)#做透視變換要求輪廓近似滿足是4個點,挑選出符合要求的結果if area>20000 and len(approx)==4:screenCnt=approxflag=1  #標識找到了文檔print(peri,area)print('檢測到文檔')break

7、透視變換

if flag==1:image_contours=cv2.drawContours(frame,[screenCnt],0,(0,255,0),2)cv_show('image',image_contours)#左四點轉換,扶正后的坐標warped=four_point_transform(orig,screenCnt.reshape(4,2))cv_show('warped',warped)cap.release()
cv2.destroyAllWindows()

完整代碼展示

import numpy as np
import cv2def cv_show(name,value):cv2.imshow(name,value)cv2.waitKey(50)def resize(image,width=None,height=None,inter=cv2.INTER_AREA):dim=None(h,w)=image.shape[:2]if width is None and height is None:return imageif width is None:r=height/float(h)dim=(int(w*r),height)else:r=width/float(w)dim=(width,int(h*r))resized=cv2.resize(image,dim,interpolation=inter)return resizeddef order_points(pts):#一共四個坐標點rect=np.zeros((4,2),dtype='float32')#按順序找到對應的坐標0123,分別是左上右上右下、左下s=pts.sum(axis=1)   #對矩陣的每一行進行求和操作rect[0]=pts[np.argmin(s)]rect[2]=pts[np.argmax(s)]diff=np.diff(pts,axis=1)rect[1]=pts[np.argmin(diff)]rect[3]=pts[np.argmax(diff)]return rectdef four_point_transform(image,pts):#獲取輸入的坐標點rect=order_points(pts)(tl,tr,br,bl)=rect#計算輸入的w和h值widthA=np.sqrt(((br[0]-bl[0])**2) +( br[1] - bl[1])**2)widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + (tr[1] - tl[1]) ** 2)maxwidth=max(int(widthA),int(widthB))heightA=np.sqrt(((tr[0]-br[0])**2) +( tr[1] - br[1])**2)heightB=np.sqrt(((tl[0]-bl[0])**2) +( tl[1] - bl[1])**2)maxheight=max(int(heightA),int(heightB))dst=np.array([[0,0],[maxwidth,0],[maxwidth,maxheight],[0,maxheight]],dtype='float32')M=cv2.getPerspectiveTransform(rect,dst)warped=cv2.warpPerspective(image,M,(maxwidth,maxheight))return warped#讀取輸入
cap=cv2.VideoCapture(0)
if not cap.isOpened():print("攝像頭打開失敗")exit()while True:flag=0  #是否檢測到文檔的標志ret,frame=cap.read()orig=frame.copy()if not ret: #讀取失敗則退出循環print("不能讀取攝像頭")breakcv_show('iamge',frame)gray=cv2.cvtColor(frame,cv2.COLOR_BGRA2GRAY)gray=cv2.medianBlur(gray,3)edged=cv2.Canny(gray,75,200)cv_show('i',edged)#輪廓檢測cnts=cv2.findContours(edged,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2]cnts=sorted(cnts,key=cv2.contourArea,reverse=True)[:3]image_contours=cv2.drawContours(orig,cnts,-1,(0,255,0),2)cv_show('image_contours',image_contours)#遍歷輪廓做透視變換for c in cnts:peri=cv2.arcLength(c,True)#做輪廓近似approx=cv2.approxPolyDP(c,0.01*peri,True)area=cv2.contourArea(approx)#做透視變換要求輪廓近似滿足是4個點,挑選出符合要求的結果if area>20000 and len(approx)==4:screenCnt=approxflag=1  #標識找到了文檔print(peri,area)print('檢測到文檔')breakif flag==1:image_contours=cv2.drawContours(frame,[screenCnt],0,(0,255,0),2)cv_show('image',image_contours)#左四點轉換,扶正后的坐標warped=four_point_transform(orig,screenCnt.reshape(4,2))cv_show('warped',warped)cap.release()
cv2.destroyAllWindows()

總結

應用

文檔處理

快速將紙質文檔中的文字轉換為電子文本,方便編輯、存儲和檢索,提高文字處理效率。

車牌識別

在智能交通系統中,通過攝像頭拍攝車牌圖像,利用 OCR 技術自動識別車牌號碼,實現車輛的自動管理和收費等功能。

身份證識別

在一些需要身份驗證的場合,如銀行開戶、酒店入住等,通過攝像頭 OCR 快速識別身份證上的文字信息,提高信息錄入效率和準確性。

場景文字識別

在圖像和視頻內容分析中,識別場景中的文字,如街道標志、廣告招牌等,為圖像理解和信息檢索提供支持。

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

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

相關文章

特斯拉虛擬電廠:能源互聯網時代的分布式革命

在雙碳目標與能源轉型的雙重驅動下,特斯拉虛擬電廠(Virtual Power Plant, VPP)通過數字孿生技術與能源系統的深度融合,重構了傳統電力系統的運行范式。本文從系統架構、工程實踐、技術挑戰三個維度,深度解析這一顛覆性…

【漫話機器學習系列】258.拐點(Inflection Point)

拐點(Inflection Point)詳解:定義、原理與應用 在數學分析與數據建模中,“拐點(Inflection Point)”是一個非常重要的概念。今天這篇文章,我們將結合圖示,深入理解拐點的定義、數學…

語音識別——聲紋識別

通過將說話人的聲音與數據庫中的記錄聲音進行比對,判斷說話人是否為數據庫白名單中的同一人,從而完成語音驗證。目前,3D-Speaker 聲紋驗證的效果較為出色。 3D-Speaker 是一個開源工具包,可用于單模態和多模態的說話人驗證、說話…

DeepSeek 賦能軍事:重塑現代戰爭形態的科技密碼

目錄 一、引言:AI 浪潮下的軍事變革與 DeepSeek 崛起二、DeepSeek 技術原理與特性剖析2.1 核心技術架構2.2 獨特優勢 三、DeepSeek 在軍事偵察中的應用3.1 海量數據快速處理3.2 精準目標識別追蹤3.3 預測潛在威脅 四、DeepSeek 在軍事指揮決策中的應用4.1 戰場態勢實…

uWSGI是什么?

uWSGI 是一個功能強大的應用服務器,專為部署高性能 Web 應用設計,尤其適合 Python 生態系統。以下是對其核心介紹及適用場景的總結: uWSGI 是什么? uWSGI 是一個實現了 WSGI(Web Server Gateway Interface&#xff09…

Digi XBee XR 系列介紹

Digi 延續了 20 多年來亞 GHz 射頻模塊的傳統,推出了 Digi XBee XR 系列遠距離模塊,包括 Digi XBee XR 900 - 已通過多個地區的預先認證 - 以及 Digi XBee XR 868 - 已通過歐洲地區應用的預先認證。 這些先進的射頻模塊專為遠距離抗干擾無線通信而設計。…

RabbitMq C++客戶端的使用

介紹 RabbitMQ 是一個開源的消息代理和隊列服務器,用于在分布式系統之間傳遞消息。它實現了高級消息隊列協議(AMQP),同時也支持其他協議如 STOMP、MQTT 等。 核心概念 Producer(生產者): 發送消息的應用程序 Consumer(消費者): 接收消息的應用程序 Q…

HTML 中的 input 標簽詳解

HTML 中的 input 標簽詳解 一、基礎概念 1. 定義與作用 HTML 中的 <input> 標簽是表單元素的核心組件&#xff0c;用于創建各種用戶輸入字段。作為一個空標簽&#xff08;沒有閉合標簽&#xff09;&#xff0c;它通過 type 屬性來決定呈現何種輸入控件&#xff0c;是實…

基于Piecewise Jerk Speed Optimizer的速度規劃算法(附ROS C++/Python仿真)

目錄 1 時空解耦運動規劃2 PJSO速度規劃原理2.1 優化變量2.2 代價函數2.3 約束條件2.4 二次規劃形式 3 算法仿真3.1 ROS C仿真3.2 Python仿真 1 時空解耦運動規劃 在自主移動系統的運動規劃體系中&#xff0c;時空解耦的遞進式架構因其高效性與工程可實現性被廣泛采用。這一架…

2025云上人工智能安全發展研究

隨著人工智能&#xff08;AI&#xff09;技術與云計算的深度融合&#xff0c;云上AI應用場景不斷擴展&#xff0c;但安全挑戰也日益復雜。結合2025年的技術演進與行業實踐&#xff0c;云上AI安全發展呈現以下關鍵趨勢與應對策略&#xff1a; 一、云上AI安全的主要挑戰 數據泄露…

MCU裸機程序如何移植到RTOS?

目錄 1、裸機編程 2、實時操作系統 3、移植裸機程序到RTOS的步驟 步驟1&#xff1a;分析裸機代碼 步驟2&#xff1a;選擇并設置RTOS環境 步驟3&#xff1a;設計任務架構 步驟4&#xff1a;實現任務間通信 步驟5&#xff1a;處理硬件交互 步驟6&#xff1a;測試和調試 …

LangPDF: Empowering Your PDFs with Intelligent Language Processing

LangPDF: Empowering Your PDFs with Intelligent Language Processing Unlock Global Communication: AI-Powered PDF Translation and Beyond In an interconnected world, seamless multilingual document management is not just an advantage—it’s a necessity. LangP…

什么是dom?作用是什么

DOM 的定義 DOM&#xff08;Document Object Model&#xff0c;文檔對象模型&#xff09;是 HTML 和 XML 文檔的編程接口。它將文檔解析為一個由節點和對象組成的樹狀結構&#xff0c;允許開發者通過編程方式動態訪問和操作文檔的內容、結構和樣式。 DOM 的作用 DOM 的主要作…

當AI自我糾錯:一個簡單的“Wait“提示如何讓模型思考更深、推理更強

原論文&#xff1a;s1: Simple test-time scaling 作者&#xff1a;Niklas Muennighoff, Zitong Yang, Weijia Shi等&#xff08;斯坦福大學、華盛頓大學、Allen AI研究所、Contextual AI&#xff09; 論文鏈接&#xff1a;arXiv:2501.19393 代碼倉庫&#xff1a;GitHub - simp…

MYSQL之基本查詢(CURD)

表的增刪改查 表的增加 語法: INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ... value_list: value, [, value] ...全列插入和指定列插入 //創建一張學生表 CREATE TABLE students (id INT UNSIGNED PRIMARY KEY AUTO_INCREM…

STM32簡易計算機設計

運用 A0上拉按鈕和 A1 A2下拉按鈕設計按鍵功能 加上獨特的算法檢測設計&#xff0c;先計算&#xff08;&#xff09;內在計算乘除在計算加減的值在計算乘除優先級最后計算加減優先級 #include "stm32f10x.h" #include <stdio.h> #include <stdlib.h>…

sparkSQL讀入csv文件寫入mysql

思路 示例 &#xff08;年齡>18改成>20) mysql的字符集問題 把user改成person “讓字符集認識中文”

計算機視覺與深度學習 | Python 實現SO-CNN-BiLSTM多輸入單輸出回歸預測(完整源碼和源碼詳解)

SO-CNN-BiLSTM **一、代碼實現****1. 環境準備****2. 數據生成(示例數據)****3. 數據預處理****4. 模型構建****5. 模型訓練****6. 預測與評估****二、代碼詳解****1. 數據生成****2. 數據預處理****3. 模型架構****4. 訓練配置****5. 結果可視化****三、關鍵參數說明****四、…

Windows軟件插件-音視頻捕獲

下載本插件 音視頻捕獲就是獲取電腦外接的話筒&#xff0c;攝像頭&#xff0c;或線路輸入的音頻和視頻。 本插件捕獲電腦外接的音頻和視頻。最多可以同時獲取4個視頻源和4個音頻源。插件可以在win32和MFC程序中使用。 使用方法 首先&#xff0c;加載本“捕獲”DLL&#xff0c…

ios打包ipa獲取證書和打包創建經驗分享

在云打包或本地打包ios應用&#xff0c;打包成ipa格式的app文件的過程中&#xff0c;私鑰證書和profile文件是必須的。 其實打包的過程并不難&#xff0c;因為像hbuilderx這些打包工具&#xff0c;只要你輸入的是正確的證書&#xff0c;打包就肯定會成功。因此&#xff0c;證書…