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

来源: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:一個表示兩個輪廓之間相似性的浮點數值。該值越小表示兩個輪廓形狀越相似。

 

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

 

使用cv2.matchShapes()方法找尋目標區域Code:(在上一篇博客的代碼基礎上修改)

  紅框是添加和修改區域,綠框是註釋掉了一些代碼,值得註意的是,matchShapes方法中的第四個參數會要求傳入值,但是通過查找OpenCV官方文檔顯示該參數沒有對應方法,所以查找了其他相關信息後,填入0

或者0.0都是可以的,至於修改膨脹次數是因為需要減少多餘輪廓的干擾,否則可能有些小輪廓出現返回值是0.0的情況。。

結果圖:

 

通過拍攝不同角度的圖片,得到的效果都是比較讓人滿意的

 

 通過上述圖片可以看到,針對不同程度的深度,都可以較為精準的繪製出目標區域,不過這個方法還是有兩個問題點:

1、barcode線段需要儘量垂直於水平方向,否則就需要去修改sobel的捲積核。

2、需要有準備工作,要提前準備好待識別目標區域的Hu矩數據。

 

上述問題將再下一篇博客中進行改進。


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

-Advertisement-
Play Games
更多相關文章
  • 一款好用又強大的開源社區,採用主流的互聯網技術架構、全新的UI設計、支持一鍵源碼部署,擁有完整的文章&教程發佈/搜索/評論/統計流程等,代碼完全開源,沒有任何二次封裝,是一個非常適合二次開發/實戰的現代化社區項目。 ...
  • Python 介紹 Python 是一種 高級 的、解釋型 的、通用 的編程語言。其設計哲學強調代碼的可讀性,使用顯著的縮進。Python 是 動態類型 和 垃圾收集 的。 基本語法 設置 Python 環境並開始基礎知識。 文章鏈接:Python 安裝與快速入門 變數 變數用於存儲在電腦程式中引 ...
  • 平時習慣了./和../作為訪問目錄的路徑,但今天使用golang中fs.ReadDir這個函數的時候發現這個習慣是不正確的。 但是常用的命令並沒有分很清楚.和./ 在這幾個命令中使用.或./都可以到達目錄下 ls cd 錯誤示範 package main import ( "fmt" "io/fs" ...
  • 數據的預處理是數據分析,或者機器學習訓練前的重要步驟。通過數據預處理,可以 提高數據質量,處理數據的缺失值、異常值和重覆值等問題,增加數據的準確性和可靠性 整合不同數據,數據的來源和結構可能多種多樣,分析和訓練前要整合成一個數據集 提高數據性能,對數據的值進行變換,規約等(比如無量綱化),讓演算法更加 ...
  • 在實際的業務開發中,我們經常會碰到VO、BO、PO、DTO等對象屬性之間的賦值,當屬性較多的時候我們使用get,set的方式進行賦值的工作量相對較大,因此很多人會選擇使用spring提供的拷貝工具BeanUtils的copyProperties方法完成對象之間屬性的拷貝。通過這種方式可以很大程度上降... ...
  • 馬哥原創:小紅書詳情採集軟體,自動爬取xhs筆記的詳情數據,欄位含:筆記id,筆記鏈接,筆記標題,筆記內容,筆記類型,發佈時間,修改時間,IP屬地,點贊數,收藏數,評論數,轉發數,用戶昵稱,用戶id,用戶主頁鏈接。 ...
  • 內網代理可以實現不想暴露太多信息給外部,但是又能提供內部的完整信息支持,相當於建立了一條可用的HTTP通道。可以在有這方面需求的人優化網路結構。 ...
  • Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹`StandardItemModel`數據模型組件的常用方法及靈活運用。`QStandardItemModel` ... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...