日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于HALCON的喷码字符自训练与识别

發布時間:2023/12/31 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于HALCON的喷码字符自训练与识别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

最近視覺項目需求,建立10個及以上的字符模板庫,然后進行生產時,提取出噴碼區域與模板進行比對得到對應的分數,以分數的高低來判斷噴碼的好壞。
如圖:噴碼樣品

根據需求,可以借鑒Halcon中訓練字符的思路來解決此問題。
主要流程:摳圖–>訓練–>識別

第一步——訓練文件建立

首先用戶輸入檢測噴碼的字符,在對應位置會自動生成以噴碼為名字的文件夾,然后會對應生成單個字符的子文件夾(主要用于存放單個字符圖片)。
算法邏輯:


這里我們來看看具體的Halcon源碼(僅供參考)

Code:=['6','2'] //輸入需要識別的字符 filenum:=|Code| //計算字符個數 string:=[''] //初始化字符串用于將客戶輸入字符連接起來作為文件名 Color:=1 //0表示藍色1表示紅色gen_rectangle1 (Rectangle, 2817.87,562.239,7395.57, 4431.49) //繪制的噴碼區域ROI,可自己繪制修改 *開始摳圖 FilePath:='E:/OCR-test/10模板噴碼測試/9815B' //圖像路徑 list_files (FilePath, ['files','follow_links'], ImageFiles) tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles) parse_filename (ImageFiles, BaseName, Extension, Directory) *根據客戶輸入字符自動生成文件夾名字 for x := 0 to filenum-1 by 1string[0]:=string[0]+Code[x] //將客戶輸入字符連接起來作為文件名字 endfor Path:='E:/OCR-test/'+string+'/' //需要創建的字符文件夾路徑*判斷是否有主文件夾,沒有則創建主文件夾 file_exists ('E:/OCR-test/'+string, FileExists) //判斷是否存在文件夾,存在FileExists返回1否則返回0 if(FileExists) elsemake_dir ('E:/OCR-test/'+string) //在自定路徑創建文件夾 endif*判斷是否有字符子文件夾沒有就創建子文件夾 for j := 0 to filenum-1 by 1file_exists (Path+Code[j], FileNum)if (FileNum)elsemake_dir (Path+Code[j])endif endfor stop ()

這里是HALCON內部的實現,可以在手動輸入字符自動生成文件夾。

第二步——產品轉正

產品的圖片的校正,利用仿射變化來將圖像進行平移旋轉:
通常我們Halcon中計算出的是弧度,這里我們需要了解符號代表的意義**(順時針方向旋轉的是負號,逆時針方向旋轉的是正號)**
效果如下:
轉正前:

轉正后:

具體的代碼實現:

read_image (Image, ImageFiles[Index])rgb1_to_gray (Image, GrayImage)threshold (GrayImage, Region, 10, 170)connection (Region, RegionTemp)select_shape_std (RegionTemp, RegionTemp, 'max_area', 70)orientation_region (RegionTemp, Phi) //計算區域角度area_center (RegionTemp, Area, Row, Column) //計算區域中心坐標與面積/*保證產品僅有豎直與橫直兩種情況*/if(Phi<0)AimPhi:=rad(-90)elseAimPhi:=rad(90)endifvector_angle_to_rigid (Row, Column, Phi, Row, Column, AimPhi, HomMat2D) //創建變化矩陣affine_trans_image (Image, ImageAffineTrans, HomMat2D, 'constant', 'false') //進行仿射變化

vector_angle_to_rigid (Row, Column, Phi, Row1, Column1, AimPhi, HomMat2D)
**Row:**變化前原點列坐標(這里是產品的中點)
**Column:**變化前原點行坐標(這里是產品的中點)
**Phi:**變化前的原點角度
**Row1:**變化后原點列坐標
**Column1:**變化后原點行坐標
**AimPhi:**變化的原點角度
**HomMat2D:**生成的旋轉+平移矩陣

第三步——字符摳圖

現在需要將我們的噴碼字符利用圖像分割技術將其提取出來
首先將圖像通道分割下(這里是彩色圖片,黑白圖片可以直接進行提取)
此處以藍色噴碼為例:
使用通道相減突出藍色區域,然后做簡單的閾值分割

sub_image (R, G, ImageTemp, 1, 0) //彩色圖片由于是紅色噴碼進行通道相減增加對比度threshold (ImageTemp, RegionRoi, 14, 255) //初步選出感興趣區域opening_rectangle1 (RegionRoi, RegionOpen, 5, 5) //降低干擾reduce_domain (ImageTemp, RegionOpen, ImageReduced) //圖像裁剪留下噴碼區域crop_domain (ImageReduced, ImagePart1) //圖像填充在窗口中顯示

如果有的噴碼噴印傾斜,需要校正。(原因:因為需要利用形態學將噴碼連接為一個圖像對象,防止噴碼粘連)

*矯正傾斜噴碼text_line_slant (ImagePart1, ImagePart1,150,-rad(45),rad(45), SlantAngle) //自動計算圖像斜率 hom_mat2d_identity (HomMat2DIdentity) //建立單位矩陣hom_mat2d_slant (HomMat2DIdentity, -SlantAngle, 'x', 0, 0, HomMat2DSlant) //計算傾斜矯正矩陣affine_trans_image (ImagePart1, AffImagePart1, HomMat2DSlant, 'nearest_neighbor', 'true') //使用傾斜矯正矩陣將傾斜的噴碼變化為豎直

傾斜噴碼:

傾斜校正:

接著,將需要的噴碼提取出來進行***歸一化操作***(這步很重要!!!)就是將摳取出的噴碼圖片為一張二值圖像(只有黑和白)。

threshold (AffImagePart1, RegionRoi, 14, 255)opening_rectangle1 (RegionRoi, RegionOpen, 10, 5) dilation_rectangle1 (RegionOpen, RegionTemp, 1, 200) //豎直膨脹dilation_rectangle1 (RegionTemp, RegionTemp, 10, 1) //橫向膨脹connection (RegionTemp, RegionTemp)intersection (RegionTemp, RegionOpen, RegionInter)select_shape (RegionInter, RegionTemp, ['height','area','width'], \'and', [250,3000,90], [500,50000,300])count_obj (RegionTemp, Number)sort_region (RegionTemp, RegionTemp, 'character', 'true', 'row') //字符排序/*以下代碼表示將單個噴碼單獨截取保存進入對應的子文件夾*/for RedIndex := 1 to Number by 1 select_obj (RegionTemp, ObjectRegionTemp, RedIndex) //將排好順序的噴碼按照序號單個處理smallest_rectangle2 (ObjectRegionTemp, Row4, Column4, Phi2, Length11, Length21)gen_rectangle2 (Rectangle3, Row4, Column4, Phi2, Length11, Length21)reduce_domain (AffImagePart1, Rectangle3, ImageReduced1)crop_domain (ImageReduced1, ImagePart)binary_threshold (ImagePart, RegionCode, 'max_separability', 'light', UsedThreshold1) //單個字符提取opening_rectangle1 (RegionCode, RegionCode, 10, 5)get_image_size (ImagePart, Width, Height) //計算窗口圖片大小gen_image_const (ImageBk, 'byte', Width, Height) //創建一個與窗口大小一致的圖片overpaint_region (ImageBk, ImageBk, 255, 'fill') //將創建的圖片背景噴印為白色overpaint_region (ImageBk, RegionCode, 0, 'fill') //將噴碼制定為黑色噴印在背景上tuple_rand (1, Rand) //生成一個隨機數Index_rand:=int(Rand*1000) write_image (ImageBk, 'jpeg', 0, Path+Code[RedIndex-1]+'/'+Code[RedIndex-1]+'_'+Index_rand) //保存歸一化后的字符模板

第四步——字符訓練

字符的圖片現在有了,接下來就可以通過簡單的二值閾值分割得到字符區域:
字符摳圖結果:

算法邏輯:

首先我們需要建立一個“字符集文件”字符集文件的格式為“.trf”
創建一個Halcon中定義的一個錯誤處理來規避重復創建字符集文件,默認下一次的創建會復寫字符集。

TrainFile1:=string+'-0-9A-Z.trf' dev_set_check ('~give_error') //錯誤處理起始 delete_file (TrainFile1) //刪除舊版本字符集 dev_set_check ('give_error')

將字符寫入字符集:
此處兩個for循壞,是實現自動將字符寫入對應子文件

for FileIndex := 0 to filenum-1 by 1list_files (Path+Code[FileIndex], ['files','follow_links'], ImageFiles)tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)for Index := 0 to |ImageFiles| - 1 by 1read_image (Image, ImageFiles[Index])binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)opening_rectangle1 (Region, RegionOpen, 5, 5)append_ocr_trainf (RegionOpen, GrayImage,Code[FileIndex], TrainFile1) endfor endfor stop ()

字符集的創建完畢后我們開始自己訓練我們的分類器(MLP)文件格式為“.omc”
其中uniq(sort(Code)),表示分類的類別不能有重復的,這個是合并重復的標簽。
例如:標簽中a[‘0’,‘0’,‘0’,‘2’,‘1’]使用了后會變為a[‘0’,‘1’,‘2’]

read_ocr_trainf_names (TrainFile1, CharacterNames, CharacterCount) create_ocr_class_mlp (8, 10, 'constant', 'default', uniq(sort(Code)), 80, 'none', 10, 42, OCRHandle) trainf_ocr_class_mlp (OCRHandle, TrainFile1, 200, 1, 0.01, Error, ErrorLog) FontFile:='shanjin.omc' write_ocr_class_mlp(OCRHandle,FontFile) clear_ocr_class_mlp (OCRHandle) stop ()

第五步—— 字符檢測識別

最后進行我們字符的識別,同樣的將字符提取出來,讀取我們自己的分類器(MLP)進行OCR識別
算法邏輯:

這里我們來看看具體的源碼(僅供參考)

list_files (FilePath, ['files','follow_links'], ImageFiles) tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles) for Index := 0 to |ImageFiles| - 1 by 1read_image (Image, ImageFiles[Index])rgb1_to_gray (Image, GrayImage)Locate (Image, ImageTemp, ProductRegion, []) //圖像定位與轉正CodeDiff:=31Params:=[Color,CodeDiff]ExtracteRegionOCV (ImageTemp, Rectangle, ProductRegion, RegionResult, Params, NumberDots, NumberAllDots) //噴碼的提取stop ()fill_up_shape (RegionResult, RegionFillUp, 'area', 1, 100)sort_region (RegionFillUp, SortedRegions, 'character', 'true', 'row')union1 (SortedRegions, RegionUnion)difference (ImageTemp, RegionUnion, RegionDifference)paint_region (RegionDifference, GrayImage, ImageOcrRaw, 255, 'fill')paint_region (RegionUnion, ImageOcrRaw, ImageOcr, 0, 'fill')read_ocr_class_mlp (FontFile, OCRHandle)do_ocr_multi_class_mlp (SortedRegions, ImageOcr, OCRHandle, Class, Confidence)stop () endfor

最終結果:

寫在最后

在我們訓練完畢MLP后我們想要測試他的能力怎么辦呢?我們可以使用助手的功能:
在調試自己訓練的分類器是否正確的時候可以打開Halcon自帶的OCR助手來查看自己的分類器能力。

在其中加載自己的字符集和分類器

這里我們還可以點擊編輯菜單中選擇"生成變化"這里可以我們的字符集變得更豐富:

然后用分類器(MLP)測試下識別的能力:

總結

以上是生活随笔為你收集整理的基于HALCON的喷码字符自训练与识别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www国产com | 精产国品一二三产品蜜桃 | 精品国产18久久久久久二百 | 色桃网 | 亚洲日本色 | 精品国产中文字幕 | 日本成人免费网站 | 日韩av综合网站 | 亚洲日本国产 | 天天干天天插天天操 | 欧美视频免费看欧美视频 | 亚洲精品久久视频 | 午夜快播| 国产同性人妖ts口直男 | 麻豆网页 | 免费成人美女女 | 国产一区二区视频在线免费观看 | 国色天香网站 | 国产视频一区在线观看 | 动漫美女无遮挡免费 | 婷婷亚洲五月 | 97人妻人人澡人人爽人人精品 | 视色网站| 欧美视频1区 | 第一章激情艳妇 | 欧美成人一级 | 亚洲国产精品无码久久久久高潮 | 狠狠躁 | 九九久久久久 | 三级欧美日韩 | 男人天堂色 | 国产毛片精品国产一区二区三区 | 伊人色播| 免费福利视频在线观看 | 亚洲中文字幕无码一区 | 天堂男人av | 人人草人人射 | 在线播放av片 | 涩涩的视频在线观看 | 国产精品人人妻人人爽人人牛 | 少妇呻吟视频 | 久久免费看少妇高潮 | 欧美三级一区二区 | 黄色资源网站 | 日韩三级电影网址 | 亚洲 欧美 日韩 在线 | 天堂视频一区 | 在线一区二区三区视频 | 亚洲一区中文字幕永久在线 | 国产美女www爽爽爽 www.国产毛片 | 国产一区二区三区播放 | 欧美视频一二三区 | 国产视频一区二区三区四区五区 | 在线亚洲不卡 | 黄色私人影院 | 91黄色小视频 | 久久精品视频在线播放 | 欧美久久久久久又粗又大 | 久久精品一二三区 | 中文字幕一区二区三区四区免费看 | www.久久综合 | 国产精品久久久无码一区 | 国产亚洲精久久久久久无码77777 | 青青草社区视频 | 国产亚洲欧美在线精品 | 好吊妞一区二区三区 | 性生活一级大片 | 91黄色免费 | 国产伦精品一区二区三区视频女 | 色综合91 | 国产丝袜美腿一区二区三区 | 污污网站在线看 | 欧美日韩五月天 | 草莓视频一区二区三区 | 天天干天天舔 | 真实乱视频国产免费观看 | 开心激情亚洲 | 亚洲精品美女久久久 | 国产免费一区二区三区免费视频 | 日韩欧美色 | 狠狠操夜夜 | 成人91在线观看 | 窝窝视频在线 | 看日本毛片 | www.日韩在线 | 91视频区| 成年人小视频 | 樱花草涩涩www在线播放 | 亚洲日本国产 | 色图社区 | 成人三级影院 | 一边吃奶一边摸做爽视频 | 亚洲一区天堂 | 男欢女爱久石 | 电影寂寞少女免费观看 | 亚洲免费视频一区 | 精品亚洲成人 | 在线观看国产精品视频 | 黄色三级三级三级 |