Halcon 算子 一維碼檢測識別、項目案例

首先我們要明白碼的識別思路

  • 把窗口全部關閉
  • 讀取新的圖片
  • 圖像預處理
  • 創建條碼模型
  • 設置模型參數
  • 搜索模型
  • 獲取條碼結果
  • 顯示條碼結果

圖像預處理和條碼增強

  1. 對比度太低: scale_image(或使用外部程序scale_image_range),增強圖像的對比度
  2. 圖像模糊:emphasize銳化圖像,使條碼看起來清晰
  3. 深背景上讀取淺色條碼:invert_image 反轉圖像?

?基本算子:

create_bar_code_model? 創建條碼模型

create_bar_code_model(GenParamNames,GenParamValues,BarCodeHandle)

  • GenParamNames:參數名
  • GenParamValues:參數值
  • BarCodeHandle:條碼句柄

?set_bar_code_param? 設置條碼參數

set_bar_code_param(BarCodeHandle,GenParamName,GenParamValue)

  • BarCodeHandle:條碼句柄
  • GenParamNames:參數名
  • GenParamValue:條碼參數
'element_size_min'條碼的最小尺寸,指條碼寬度和間距,大碼應設大一點,減少處理時間
'element_size_max'條碼的最大尺寸,不能過小,也不能過大
'check_char'是否驗證校驗位,'absent'不檢查校驗和'present'檢查校驗
'persistence'設置位1,則保留中間結果,評估條碼印刷質量時會用到
'num_scanlines'解碼時所用掃碼線的最大數目,設置為0表示自動確定,一般設置為2~30
'start_stop_tolerance'容許誤差值,可設置為'low'或者'high',設置為'high'可能造成誤判
'orientation'、'orientation_tol'分別指條碼的方向和方向容差,設置準確可大大提高解碼效率
'elemnet_height_min'條碼的最小高度,默認設置-1白哦是子哦對那個推測條碼高度,該參數對速度影響大
'stop_after_result_num'設置要解碼的個數,0表示全部找出,設置為2表示找到2個就不找了

?find_bar_code 查找條碼

find_bar_code(Image,SymbolRegions,BarCodeHandle,CodeType,DecodedDataStrings)

  • Image:輸入圖像
  • SymbolRegions:檢測到的條形碼區域
  • BarCodeHandle:條形碼區域
  • CodeType:條形碼類型
  • DecodedDataStrings:識別結果

get_bar_code_result? 顯示條碼結果

?get_bar_code_result(BarCodeHandle,CandidateHandle,ResultName,BarCodeResults)

  • BarCodeHandle:條碼模型處理(條碼句柄)
  • CandidateHandle:候選句柄
  • ResultName:結果名
  • BarCodeResults:條形碼的結果

?一維碼示例

1.檢測單個條形碼

dev_close_window ()
dev_update_off ()
dev_set_draw ('margin')
dev_set_line_width (3)
read_image (Image, 'F:/Halcon/?Image/1一維碼barcor/barcode_1.bmp')
* 創建條碼模型
create_bar_code_model ([], [], BarCodeHandle)
* 設置條碼參數
set_bar_code_param (BarCodeHandle, 'barcode_width_min', 280)
set_bar_code_param (BarCodeHandle, 'barcode_height_min', 80)
* 檢測讀取一維碼
find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)
* 獲取條碼結果
get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', BarCodeResults)
*顯示
dev_get_window (WindowHandle)
msg:=BarCodeResults+'條碼編號'+DecodedDataStrings
area_center (SymbolRegions, Area, Row, Column)
dev_display (Image)
dev_display (SymbolRegions)
disp_message (WindowHandle, msg, 'image', Row, Column, 'black', 'true')

?


2.檢測多個條形碼

dev_update_off ()
dev_close_window ()
dev_get_window (WindowHandle)
query_font (WindowHandle, Font)
tuple_find (Font, '楷體', Indices)
if(Indices!=-1)set_display_font (WindowHandle, 16, '楷體', 'true', 'false')
elseset_display_font (WindowHandle, 16, 'mono', 'true', 'false')
endif
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_color ('green')
create_bar_code_model ([], [], BarCodeHandle)
minWidth:=280
minHeight:=60
set_bar_code_param (BarCodeHandle, 'barcode_height_min', minHeight)
set_bar_code_param (BarCodeHandle, 'barcode_width_min', minWidth)
list_files ('F:/Halcon/?Image/1一維碼barcor', 'files', Files)
tuple_regexp_select (Files, '.bmp', Selection)
num:=|Selection|-1
for i:=0 to num by 1read_image (Image,Selection[i])find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', BarCodeResults)dev_display (Image)dev_display (SymbolRegions)msg:=BarCodeHandle+'\\='+DecodedDataStringsdisp_message (WindowHandle, msg, BarCodeResults, 12, 12, 'black', 'true')stop ()
endfor

?3.檢測多個,和檢測不到的

dev_update_off ()
dev_close_window ()
dev_get_window (WindowHandle)
query_font (WindowHandle, Font)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_color ('green')
dev_set_line_width (3)
create_bar_code_model ([], [], BarCodeHandle)
gen_empty_obj (EmptyObject)
list_files ('F:/Halcon/?Image/2一維碼', 'files', Files)
tuple_regexp_select (Files, '.bmp', Selection)
num:=|Selection|-1
for i:=0 to num by 1read_image (Image, Selection[i])find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)test_equal_obj (EmptyObject, SymbolRegions, IsEqual)if(IsEqual!=0)disp_message (WindowHandle, '沒有識別到一維碼', 'image', 12, 12, 'black', 'true')endifget_bar_code_result (BarCodeHandle, 'all', 'decoded_types', BarCodeResults)dev_display (Image)dev_display (EmptyObject)mesg:=BarCodeResults+'\\='+DecodedDataStringsdisp_message (WindowHandle, mesg, 'image', 12, 12, 'black', 'true')stop ()
endfor

4. 查詢多個不同種類

create_bar_code_model (['stop_after_result_num'], [1], BarCodeHandle)
dev_clear_window ()
dev_update_off ()
dev_get_window (WindowHandle)
query_font (WindowHandle, Font)
set_display_font (WindowHandle, 16, Font[0], 'true', 'false')
dev_set_draw ('margin')
dev_set_color ('green')
dev_set_line_width (3)
list_files ('F:/Halcon/?Image/N維碼/Ean13 一維碼讀取/ean13', 'files', Files)
tuple_regexp_select (Files, '(ean13)[0-9]{1,7}\\.(png)', Selection)
count:=|Selection|-1
for i:=0 to count by 1read_image (Image, Selection[i])find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)get_bar_code_result (BarCodeHandle, 'all', 'decoded_types', BarCodeResults)dev_display (Image)dev_display (SymbolRegions)msg:=BarCodeResults+'\\'+DecodedDataStringsarea_center (SymbolRegions, Area, Row, Column)disp_message (WindowHandle, msg, 'image', Row, Column, 'black', 'true')if(i<count)disp_continue_message (WindowHandle, 'black', 'true')endifstop ()
endfor
dev_disp_text ('已經是最后一張了', 'window', 'bottom', 'right', 'red', [], [])
clear_bar_code_model (BarCodeHandle)

5.旋轉查詢

方法1:?

read_image (Image, 'barcode/ean13/ean1305')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
dev_set_color ('green')
dev_set_draw ('margin')
dev_set_line_width (3)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
create_bar_code_model ('element_size_min', 1.5, BarCodeHandle)
for i:=0 to 360 by 30* 旋轉圖像rotate_image (Image, ImageRotate, i, 'constant')dev_display (ImageRotate)get_image_size (ImageRotate, Width, Height)*改變當前激活窗口的大小和位置dev_set_window_extents (0, 0, Width, Height)find_bar_code (ImageRotate, SymbolRegions, BarCodeHandle, 'EAN-13', DecodedDataStrings)get_bar_code_result (BarCodeHandle, 'all', 'orientation', Orientation)area_center (SymbolRegions, Area, Row, Col)* 創建一個十字箭頭的輪廓gen_arrow_contour_xld (Arrow, Row + sin(rad(Orientation)) * 70, Col - cos(rad(Orientation)) * 70, Row - sin(rad(Orientation)) * 70, Col + cos(rad(Orientation)) * 70, 25, 25)dev_display (ImageRotate)dev_display (SymbolRegions)dev_set_color ('green')dev_display (Arrow)disp_message (WindowHandle, DecodedDataStrings, 'window', 12, 12, 'black', 'true')stop ()
endfor
clear_bar_code_model (BarCodeHandle)

方法2:

?

**** 主要內容:如何獲取圖像與平行線的夾角
**** 基于夾角 生成帶有方向的箭頭
dev_update_off ()
read_image (Image, 'barcode/ean13/ean1305')
dev_set_draw ('margin')
dev_set_color ('green')
dev_set_line_width (3)create_bar_code_model (['element_size_min'], [1.5], BarCodeHandle)
for rot :=0 to 360 by 30find_bar_code (Image, SymbolRegions, BarCodeHandle, 'auto', DecodedDataStrings)get_bar_code_result (BarCodeHandle, 'all', 'orientation', angle)area_center (SymbolRegions, Area, cehnterRow, centerCol)gen_arrow_contour_xld (Arrow1, cehnterRow, centerCol, cehnterRow, centerCol, 10, 1)* 難題:怎么基于 區域的中線點,與 圖像與水平面的弧度,求xld的起點和終點* 以區域中心坐標為基準點,該點是,箭頭上的點* 以為該點位置,將箭頭分為2個部分:假設第一部分,長度為100 第二部長度為80* 已:匹配模板與水平面的夾角  rad(angle)* 求:起點 行列坐標 與 終點行列坐標 、 下面就是計算公式。startRow:= cehnterRow +sin(rad(angle)) * 100 startCol := centerCol - cos(rad(angle)) * 100 endRow := cehnterRow - sin(rad(angle)) * 80endCol := centerCol + cos(rad(angle)) * 80gen_arrow_contour_xld (Arrow, startRow, startCol, endRow, endCol, 20, 20)* 顯示結果dev_display (Image)dev_display (SymbolRegions)dev_display (Arrow)rotate_image (Image, Image, rot, 'constant')stop()endfor

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

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

相關文章

vue-cli3+vue2+elementUI+avue升級到vite+vue3+elementPlus+avue總結

上一個新公司接手了一個vue-cli3vue2vue-router3.0elementUI2.15avue2.6的后臺管理項目&#xff0c;因為vue2在2023年底已經不更新維護了&#xff0c;elementUI也只支持到vue2&#xff0c;然后總結了一下vue3的優勢&#xff0c;最后批準升級成為了vitevue3vue-router4.5element…

SpringBoot實戰(三十五)微服務集成OAuth2.0(UAA)

目錄 一、知識回顧1.1 什么是 OAuth2 協議&#xff1f;1.2 OAuth2 的4個角色1.3 OAuth2 的3種令牌1.4 OAuth2 的5種認證方式1.5 OAuth2 內置接口地址 二、UAA介紹2.1 概述2.2 UAA的主要功能2.3 UAA 的應用場景 三、微服務集成3.1 集成示例介紹3.2 集成測試 一、知識回顧 在進行…

紅果短劇安卓+IOS雙端源碼,專業短劇開發公司

給大家拆解一下紅果短劇/河馬短劇&#xff0c;這種看光解鎖視頻&#xff0c;可以掙金幣的短劇APP。給大家分享一個相似的短劇APP源碼&#xff0c;這個系統已接入穿山甲廣告、百度廣告、快手廣告、騰訊廣告等&#xff0c;類似紅果短劇的玩法&#xff0c;可以看劇賺錢&#xff0c…

從0開始的操作系統手搓教程23:構建輸入子系統——實現鍵盤驅動1——熱身驅動

目錄 所以&#xff0c;鍵盤是如何工作的 說一說我們的8042 輸出緩沖區寄存器 狀態寄存器 控制寄存器 動手&#xff01; 注冊中斷 簡單整個鍵盤驅動 Reference ScanCode Table 我們下一步就是準備進一步完善我們系統的交互性。基于這個&#xff0c;我們想到的第一個可以…

百度SEO關鍵詞布局從堆砌到場景化的轉型指南

百度SEO關鍵詞布局&#xff1a;從“堆砌”到“場景化”的轉型指南 引言 在搜索引擎優化&#xff08;SEO&#xff09;領域&#xff0c;關鍵詞布局一直是核心策略之一。然而&#xff0c;隨著搜索引擎算法的不斷升級和用戶需求的多樣化&#xff0c;傳統的“關鍵詞堆砌”策略已經…

Python ? Unix時間戳轉日期或日期轉時間戳工具分享

設計一款Unix時間戳和日期轉換工具&#xff0c;其代碼如下&#xff1a; from datetime import datetimeclass Change_Date_Time(object):def __init__(self, date_strNone, date_numNone):self.date_str date_strself.date_num date_num# 轉時間戳def datetime2timestamp(s…

【目標檢測】【NeuralPS 2023】Gold-YOLO:通過收集與分發機制實現的高效目標檢測器

Gold-YOLO&#xff1a; Efficient Object Detector via Gather-and-Distribute Mechanism Gold-YOLO&#xff1a;通過收集與分發機制實現的高效目標檢測器 0.論文摘要 在過去的幾年中&#xff0c;YOLO系列模型已成為實時目標檢測領域的領先方法。許多研究通過修改架構、增強數…

π0源碼解析——一個模型控制7種機械臂:對開源VLA sota之π0源碼的全面分析,含我司的部分落地實踐

前言 ChatGPT出來后的兩年多&#xff0c;也是我瘋狂寫博的兩年多(年初deepseek更引爆了下)&#xff0c;比如從創業起步時的15年到后來22年之間 每年2-6篇的&#xff0c;干到了23年30篇、24年65篇、25年前兩月18篇&#xff0c;成了我在大模型和具身的原始技術積累 如今一轉眼…

K8s 1.27.1 實戰系列(六)Pod

一、Pod介紹 1、Pod 的定義與核心設計 Pod 是 Kubernetes 的最小調度單元,由一個或多個容器組成,這些容器共享網絡、存儲、進程命名空間等資源,形成緊密協作的應用單元。Pod 的設計靈感來源于“豌豆莢”模型,容器如同豆子,共享同一環境但保持隔離性。其核心設計目標包括…

企業日常工作中常用的 Linux 操作系統命令整理

Linux 操作系統命令整理 在企業級運維、開發和日常工作中&#xff0c;Linux 命令是繞不開的核心技能。不論是日志排查、進程管理&#xff0c;還是高效運維優化&#xff0c;掌握這些命令都能讓你事半功倍&#xff01;本篇文章整理了自己在日常工作中積累最常用的 Linux 命令&am…

實現NTLM relay攻擊工具的Python代碼示例

以下是一個實現NTLM relay攻擊工具的Python代碼示例&#xff0c;該工具可以完成自動掃描IP、配置相關協議、獲取hash、自動化設置和執行攻擊步驟等功能。 代碼思路 IP掃描&#xff1a;使用scapy庫進行IP掃描&#xff0c;找出活躍的IP地址。Responder配置&#xff1a;自動配置…

Kotlin和Java區別

哈哈哈&#xff0c;前段時間&#xff0c;面試的時候&#xff0c;突然問到我Kotlin和Java的區別&#xff0c;一下子把我問懵逼了&#xff0c;確實沒遇到問這個的&#xff0c;想了下&#xff0c;說了下Kotlin的編譯時空檢查機制&#xff0c;代碼更簡潔&#xff0c;很多封裝好的AP…

【大模型】大模型分類

大模型&#xff08;Large Models&#xff09;通常指參數量巨大、計算能力強大的機器學習模型&#xff0c;尤其在自然語言處理&#xff08;NLP&#xff09;、計算機視覺&#xff08;CV&#xff09;等領域表現突出。以下是大模型的常見分類方式&#xff1a; 1. 按應用領域分類 …

centos中使用svn整理

centos中使用svn整理 1. 安裝 SVN 客戶端2. 常見 SVN 用法及示例2.1 創建 SVN 倉庫2.2 檢出&#xff08;Checkout&#xff09;項目2.3 添加文件到版本控制2.4 提交&#xff08;Commit&#xff09;更改2.5 更新&#xff08;Update&#xff09;本地工作副本2.6 查看文件狀態2.7 查…

游戲元宇宙崛起:AI代理IP驅動虛擬世界“無限可能”?

在科技飛速發展的當下&#xff0c;游戲元宇宙正以一種前所未有的姿態崛起&#xff0c;它猶如一顆璀璨的新星&#xff0c;吸引著無數人的目光。而AI代理IP&#xff0c;正成為驅動這個虛擬世界展現“無限可能”的關鍵力量。 「快代理&#xff5c;11年專注企業級代理IP云服務 —…

基于Servlet + JSP 的物業管理系統

Javaweb物業管理系統&#xff5c;Java&#xff5c;Servlet | JavaWeb&#xff5c;web網站&#xff5c; 分管理員登錄&#xff0c;用戶登錄。 一、內容 項目源碼 配套文檔 環境部署教程 項目運行教程 二、技術介紹 技術應用&#xff1a; Servlet JavaBean CSS JSP 開發環…

Billing的patient balance的2個例子

Billing的patient balance的2個例子 第一個例子 下面是 0852醫院的00005641的計算&#xff1a; 主保險 Allowable: 78.81 Applied:61.79 CoInsurance:17.02 第二保險 Allowable: 15.76 Applied:15.76 我們在計算時是用主保險的Allowable: 78.81&#xff…

哪些培訓課程適合學習PostgreSQL中級認證知識?

PostgreSQL 中級工程師 PGCP 認證培訓&#xff1a;由重慶思 莊經驗豐富的講師鄭全老師授課。課程內容系統全面&#xff0c;涵蓋了 PostgreSQL 數據庫從基礎到高級的知識&#xff0c;包括數據庫的安裝、建庫、用戶與角色管理等基礎內容&#xff0c;也有性能調優、索引原理與應用…

計算機二級MS之PPT

聲明&#xff1a;跟著大貓和小黑學習隨便記下一些筆記供大家參考&#xff0c;二級考試之前將持續更新&#xff0c;希望大家二級都能輕輕松松過啦&#xff0c;過了二級的大神也可以在評論區留言給點建議&#xff0c;感謝大家&#xff01;&#xff01; 文章目錄 考題難點1cm25px…

第5章 使用OSSEC進行監控(網絡安全防御實戰--藍軍武器庫)

網絡安全防御實戰--藍軍武器庫是2020年出版的&#xff0c;已經過去3年時間了&#xff0c;最近利用閑暇時間&#xff0c;抓緊吸收&#xff0c;總的來說&#xff0c;第5章開始進入主機安全&#xff08;HIDS&#xff09;領域了&#xff0c;2022年的時候有幸做過終端安全一段時間&a…