1. 程式人生 > >Qt QLCDNumber Class 與 halcon ORC識別

Qt QLCDNumber Class 與 halcon ORC識別

突然看到 QLCDNumber 控制元件,腦子一熱,ORC識別有素材了,用QLCD Number 生成  一串16進位制的字元。然後用halcon來做識別。 1、控制元件截圖操作 QPixmap::grabWindow(winId).save(qstring,"bmp"); 2、隨機數生成操作
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)