例子中用到的图像:
接着是正文具体代码:
*参考例子:
*投射变换和二维码识别:2d_data_codes_rectify_symbol.hdev
*轮廓转线及调整直线:measure_metal_extended.hdev(例子中还有调整弧线,本例没有用到)
dev_set_draw ('margin')//设置填充模式
read_image (Image, 'code2d')//获取图片
threshold (Image, Region, 10, 90)//通过阈值分割,获取二维码的区域
shape_trans (Region, RegionTrans, 'convex')//把区域的边缘连接起来
gen_contour_region_xld (RegionTrans, Contours, 'border')//区域转轮廓
segment_contours_xld (Contours, ContoursSplit, 'lines', 5, 10, 1)//把轮廓断开成线
XCoordCorners := []//保存四边形的顶点X坐标
YCoordCorners := []//保存四边形的顶点Y坐标
*对轮廓进行排序,不排序会影响投射变换操作
sort_contours_xld (ContoursSplit, SortedRegions, 'lower_left', 'true', 'row')
count_obj (SortedRegions, Number)//获取区域数量
for Index := 1 to Number by 1
select_obj (SortedRegions, ObjectSelected, Index)//遍历区域
*把弯线变直
fit_line_contour_xld (ObjectSelected, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
gen_contour_polygon_xld (Contour, [RowBegin,RowEnd], [ColBegin,ColEnd])//画线看效果
tuple_concat (XCoordCorners, RowBegin, XCoordCorners)//保存X轴数据
tuple_concat (YCoordCorners, ColBegin, YCoordCorners)//保存y轴数据
endfor
*标记出记录的点
gen_cross_contour_xld (Crosses, XCoordCorners, YCoordCorners, 6, 0.785398)
*获取投射变换参数HomMat2D
hom_vector_to_proj_hom_mat2d (XCoordCorners, YCoordCorners, [1,1,1,1], [70,270,270,70], [100,100,300,300], [1,1,1,1], 'normalized_dlt', HomMat2D)
*对图像进行投射变换
projective_trans_image (Image, Image_rectified, HomMat2D, 'bilinear', 'false', 'false')
*以下为对二维码的识别
create_data_code_2d_model ('Data Matrix ECC 200', [], [], DataCodeHandle)
find_data_code_2d (Image_rectified, SymbolXLDs, DataCodeHandle, [], [], ResultHandles, DecodedDataStrings)
clear_data_code_2d_model (DataCodeHandle)
area_center_xld (SymbolXLDs, Area, Row, Column, PointOrder)
*显示二维码解析到的数据
disp_message (3600, DecodedDataStrings, 'window', Row+160, Column-100, 'black', 'true')