突然看到 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)