Qt QLCDNumber Class 與 halcon ORC識別
阿新 • • 發佈:2019-01-02
突然看到 QLCDNumber 控制元件,腦子一熱,ORC識別有素材了,用QLCD Number 生成 一串16進位制的字元。然後用halcon來做識別。
1、控制元件截圖操作
QPixmap::grabWindow(winId).save(qstring,"bmp");
2、隨機數生成操作
以下關於halcon 1、字元訓練
QString LCDNumbers::generateUniqueRandomNumber(QList<int> *qlist) { QString qstring,tmp; if(!(qlist->isEmpty())) qlist->clear(); for(int i=0;i<16;i++) { qlist->append(qrand()%16); } for(int i=0; i<qlist->size();i++) { tmp = QString::number(qlist->at(i), 16).toUpper(); qstring += tmp; } return qstring; }
以下關於halcon 1、字元訓練
read_image (Image, 'E:/Halcon Projects/字元/A0123456789ABCDEF.bmp')
get_image_size (Image, Width, Height)
dev_clear_window()
dev_open_window (0, 0, 2 * Width, 2 * Height, 'black', WindowID)
set_display_font (WindowID, 27, 'mono', 'true', 'false')
rgb1_to_gray (Image, GrayImage)
//以下主要是把字元扣出來 gen_rectangle1 (Rectangle, 5, 5, Height-5, Width-5) reduce_domain (GrayImage, Rectangle, ImageReduced) threshold (ImageReduced, Region, 0, 200) dilation_circle (Region, RegionDilation, 2) connection (RegionDilation, ConnectedRegions)
//要注意排序問題 和 TrainingNames 要對應 sort_region (ConnectedRegions, FinalNumbers, 'first_point', 'true', 'column') dev_display (GrayImage) dev_set_color ('green') dev_set_shape ('rectangle1') dev_set_draw ('margin') dev_display(FinalNumbers) FontName := 'myNumbers' TrainingNames := ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'] TrainingFileName := FontName + '.trf' shape_trans (FinalNumbers, RegionTrans, 'rectangle1') area_center(RegionTrans, Area, Row, Column) MeanRow := mean(Row) dev_set_check ('~give_error') delete_file (TrainingFileName) dev_set_check ('give_error')
//字元區域與名字一一對應
for I := 0 to |TrainingNames| - 1 by 1
select_obj (FinalNumbers, CharaterRegions, I + 1)
append_ocr_trainf (CharaterRegions, GrayImage, TrainingNames[I], TrainingFileName)
disp_message (WindowID, TrainingNames[I], 'image', MeanRow - 75, Column[I] - 6, 'black', 'false')
endfor
*
CharNames := uniq(sort(TrainingNames))
create_ocr_class_mlp (5, 10, 'constant', 'default', CharNames, 80, 'principal_components', 10, 42, OCRHandle)
trainf_ocr_class_mlp (OCRHandle, TrainingFileName, 2000, 0.1, 0.01, Error, ErrorLog)
write_ocr_class_mlp (OCRHandle, FontName)
clear_ocr_class_mlp (OCRHandle)
用上面的分類器來識別
FontName := 'myNumbers'
dev_update_window ('off')
read_image (LCDNumbers, 'E:/Halcon Projects/字元/字1D1EDC6226D04FA7.bmp')
rgb1_to_gray (LCDNumbers, GrayImage)
*為什麼下面做了一個mean處理,為了模糊把0的區域能聯通在一起;
*如果不做此處理,識別不了0,發現其原因是0的區域被它分割成兩個區域
*所以找不到0,也充分的看出來,分割出正確的區域是識別的前提。
mean_image (GrayImage, ImageMean, 2, 2)
get_image_size (LCDNumbers, Width, Height)
dev_close_window ()
dev_open_window (0, 0, 2 * Width, 2 * Height, 'black', WindowID)
set_display_font (WindowID, 16, 'mono', 'true', 'false')
dev_display (LCDNumbers)
disp_continue_message (WindowID, 'black', 'true')
stop ()
* 下面的引數也要根據具體情況來設定,本例中的最小字高,
*如果不設定,字元分割也會出錯,從而識別不正確
create_text_model_reader ('auto', FontName, TextModel)
set_text_model_param (TextModel, 'min_char_height', 100)
set_text_model_param (TextModel, 'min_contrast', 10)
find_text (ImageMean, TextModel, TextResultID)
get_text_object (Characters, TextResultID, 'all_lines')
dev_display (LCDNumbers)
dev_display (Characters)
stop ()
* Display the reading results
get_text_result (TextResultID, 'class', Classes)
area_center (Characters, Area, Row, Column)
disp_message (WindowID, Classes, 'image', 5, Column - 3, 'black', 'false')
*
* Free memory
clear_text_result (TextResultID)
clear_text_model (TextModel)