说到字符检测.,我们想到的首先就是提取字符,然后创建模版,利用定位仿射变换到新的字符上,做差值运算,得到的插值区域就是我们的异常区域.
那么具体步骤怎么实现,halcon算子又该如何运用呢?
①图像 的预处理.
a.一般选择自动阈值或绝对阈值.得到感兴趣区域.
自动阈值算法,请查阅之前写的算法:
https://editor.csdn.net/md/?articleId=135462632
b.固定阈值,直接调用threshold.
c.对感兴趣区域筛选,得到需要 的字符区域.
connection
select_shape
d.对字符排序,组合生成图像.
sort_region
dilation_rectangle1
union1
reduce_domain
创建模版之前检测模版参数
inspect_shape_model
我们需要对图像进行处理,亮度等信息记录,检测模版参数等,获取金字塔等级,接下来创建模版.
get_image_pointer1获取图像数据,用于计算灰度或亮度值.
亮度值=每个像素的值/总像素
创建模版,定位字符
create_shape_model
创建变异模型
create_variation_model
训练变异模型
train_variation_model
准备变异模型
prepare_variation_model
到此训练完成,当然如果需要保存模版的,可以通过序列化参数,保存模版到二进制文件中,支持多模版保存.
// Local control variables
HTuple hv_ModelCount, hv_FileHandle, hv_i, hv_ModelIDs;
HTuple hv_SerializedItemHandle, hv_SerializedItemHandle1;
HTuple hv_ModelID;
hv_ModelCount = 3;
OpenFile(“d:/1.dat”, “append_binary”, &hv_FileHandle);
{
HTuple end_val2 = hv_ModelCount-1;
HTuple step_val2 = 1;
for (hv_i=0; hv_i.Continue(end_val2, step_val2); hv_i += step_val2)
{
SerializeShapeModel(hv_ModelIDs, &hv_SerializedItemHandle);
FwriteSerializedItem(hv_FileHandle, hv_SerializedItemHandle);
}
}
CloseFile(hv_FileHandle);
hv_ModelIDs = HTuple();
OpenFile(“d:/1.dat”, “input_binary”, &hv_FileHandle);
{
HTuple end_val13 = hv_ModelCount-1;
HTuple step_val13 = 1;
for (hv_i=0; hv_i.Continue(end_val13, step_val13); hv_i += step_val13)
{
FreadSerializedItem(hv_FileHandle, &hv_SerializedItemHandle1);
DeserializeShapeModel(hv_SerializedItemHandle1, &hv_ModelID);
hv_ModelIDs = hv_ModelIDs.TupleConcat(hv_ModelID);
}
}
CloseFile(hv_FileHandle);
比较变异模型,检测时候用.
compare_variation_model