【Python】【OpenCV】定位條形碼(二)

来源:https://www.cnblogs.com/vangoghpeng/archive/2023/12/21/17920289.html
-Advertisement-
Play Games

根據上一篇博客可知,單純的通過求取最大面積而進行定位的局限性,因此我們接下來將通過cv2.moments()和cv2.HuMoments()這兩個方法來在更複雜的環境中去找到我們的目標區域。 cv2.moments(): 參數: array:表示輸入圖像的單通道數組。通常是灰度圖像,可以是8位或浮點 ...


  根據上一篇博客可知,單純的通過求取最大面積而進行定位的局限性,因此我們接下來將通過cv2.moments()和cv2.HuMoments()這兩個方法來在更複雜的環境中去找到我們的目標區域。

 

cv2.moments():

參數:

  • array:表示輸入圖像的單通道數組。通常是灰度圖像,可以是8位或浮點型。
  • binaryImage:一個可選參數,如果設置為 True,則將 array 視為二進位圖像。預設為 False。

返回值:

  • moments:一個包含圖像矩特征信息的字典對象。這些矩包括圖像的原始矩、中心矩以及一些其他相關的信息。您可以使用這些矩特征來描述圖像的幾何形狀和分佈情況。

cv2.HuMoments():

參數:

  • moments:一個字典對象,包含通過 cv2.moments() 函數計算得到的圖像矩特征。

返回值:

  • huMoments:一個包含7個不變矩特征值的一維數組。這些特征值對圖像的形狀、輪廓和幾何特征進行了描述。通常用於圖像識別和匹配。

 

  簡易的介紹一下moments(矩)這個東西,它是用來描述一個形狀的特性,比如說正方形,我們能分辨出來是因為知道其四個邊是相等的,這便是在我們的認知中所知的正方形的輪廓特性,

而在電腦中呈現的就是一組數據,通過和這組數據進行比對,我們就可以較為準確的去尋找我們的目標區域。

  但是相較於上一篇博客的直接在輸入圖像中查找,使用矩我們需要事先獲取目標的完整輪廓,並保存其矩特性數據。

 

圖像準備,一張沒有完整的只有barcode的圖像

 

 

Code:

 1 import cv2
 2 import numpy
 3 
 4 img = cv2.imread('../images/barcode.jpg')
 5 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
 6 kernel_x = numpy.array(
 7     [
 8         [-1, 0, 1],
 9         [-2, 0, 2],
10         [-1, 0, 1]
11     ]
12 )
13 sobel_x = cv2.filter2D(gray, -1, kernel_x)
14 _, thresh = cv2.threshold(sobel_x, 127, 255, cv2.THRESH_BINARY)
15 kernel_ed = numpy.ones((3, 3), dtype=numpy.uint8)
16 img_d = cv2.dilate(thresh, kernel_ed, iterations=6)
17 contours, hir = cv2.findContours(img_d, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
18 print(cv2.HuMoments(cv2.moments(contours[0])))
19 cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
20 cv2.imshow('', img)
21 cv2.waitKey()
22 cv2.destroyAllWindows()

Result:

 

 

我就直接和上一篇博客的barcode的輪廓矩特性進行對比:

    只有barcode圖       包含其他圖形的barcode圖

 

 通過對比數據我們可以發現,在第1不變矩中,數據是最接近的,這個時候就可以利用這個特性數據來進行輪廓特征比對尋找目標區域。

當然因為OpenCV提供了一個方法為我們減免了比較的操作cv2.matchShapes()方法。

 

cv2.matchShapes()

參數:

  • contour1:第一個輪廓,通常是一個包含點集的 NumPy 數組。
  • contour2:第二個輪廓,也是一個包含點集的 NumPy 數組。
  • method:表示相似性度量方法的整數值。可以是 1、2 或 3,分別代表不同的計算方法。

返回值:

  • match:一個表示兩個輪廓之間相似性的浮點數值。該值越小表示兩個輪廓形狀越相似。

 

至此,當我們所得到的圖像源包含了其他複雜的圖形時,我們則可以使用矩特性來進一步提高我們的檢測能力,但是還有其他更為複雜的場景,所以還需要優化我們的解決思路。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 成功路上並不擁擠,因為堅持的人並不多。只有堅持了,我們才知道,這一路上有多少事情需要實幹,有多少東西需要學習。 1. 環境變數的理解 環境變數一般是指在操作系統中用來指定操作系統運行環境的一些參數,如臨時文件夾位置、系統文件夾位置以及某些應用軟體文件的路徑等等。環境變數相當於給系統或用戶應用程式設置 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 unplugin-generate-component-name 一款用於以文件夾名或者setup標簽寫入名字來自動生成Vue組件名的插件。 項目地址 功能 💚 支持 Vue 3 開箱即用。 ⚡️ 支持 Vite、Webpack、Rsp ...
  • 大家好,我是歸思君 起因是最近瞭解JS執行上下文的時候,發現很多書籍和資料,包括《JavaScript高級程式設計》、《JavaScript權威指南》和網上的一些博客專欄,都是從 ES3 角度來談執行上下文,用ES6規範解讀的比較少,所以想從ES6的角度看一下執行上下文。 下麵我嘗試用ECMAScr ...
  • 本文將介紹如何用JS實現簡單的屏幕錄像機。 一、錄製準備 創建一個按鈕 <button id="recording-toggle">Start recording</button> 書寫JavaScript var RECORDING_ONGOING = false; var recordingTo ...
  • 記得更改完配置後,要重啟編輯器(如:VSCode)!!! 記得更改完配置後,要重啟編輯器(如:VSCode)!!! 記得更改完配置後,要重啟編輯器(如:VSCode)!!! 這個錯誤通常發生在你嘗試在一個不支持 ES6 模塊語法的環境中使用 import 關鍵字。 ESLint 預設使用的是 ES5 ...
  • 1. 可演進的API 1.1. 隨著需求的變化,你需要改變你的API,即代碼之間的共用介面 1.2. 改變API很容易,但很難做到正確 1.3. 保持API小巧 1.3.1. 小巧的API更易於理解和演進 1.3.2. 只添加即刻需要的API方法或欄位 1.3.3. 帶有許多欄位的API方法應該有合 ...
  • 今天給大家推薦2個視頻翻譯工具​,分別是: TransDuck YouTube中文配音 這兩款工具的核心功能非常類似,核心提供一個視頻語言翻譯的能力。比如:你要看一個英文視頻,它可以幫助你將這個英文視頻變為中文視頻,日文視頻或者韓文視頻等其他語言的視頻。這裡所說的語言翻譯可不只是字幕哦,而是音頻也都 ...
  • 說明: access_token: 服務端與客戶端通信,有時服務端需要知道客戶端的身份,就會用到access_token來用於驗證身份。 refresh_token: 但為了保證安全token會設置過期時間,如果直接過期,相當於用戶或調用端正在使用產品,突然間就退出登錄了,這種產品體驗很差,於是有了 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...