定位流程
- blob分析
- 模板匹配 (仿射变换成标准的形状)
- 识别
例子一
打开这个关于仿射变换的例子
在窗口中画一个图形,左键画,右键确认
draw_region (Region, WindowID)
获得单位矩阵
hom_mat2d_identity (HomMat2DIdentity)
获得旋转矩阵
hom_mat2d_rotate (HomMat2DIdentity, -0.3, 256, 256, HomMat2DRotate)
可以看到-0.3 是旋转角,如果是正的话,就是逆时针旋转的。负的话就是顺时针旋转,
两个256分别是x,y的坐标点(旋转中心)。
通过旋转角和旋转中心可以得到旋转矩阵
图像缩放
x,y都放大1.5倍,
256,256是固定点
点(Px,Py)是变换的固定点,即当使用HomMat2DScale变换时,该点保持不变。为了获得这种行为,首先向输入变换矩阵添加平移,将固定点移动到全局坐标系的原点。然后,添加缩放,最后是将固定点移回其原始位置的平移。
hom_mat2d_scale (HomMat2DRotate, 1.5, 1.5, 256, 256, HomMat2DScale)
进行放射变换
affine_trans_region (Region, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')
最后可以看到变换后的结果
dev_clear_window () dev_set_draw ('margin') dev_set_color ('red') dev_display (Region) dev_set_color ('green') dev_display (RegionAffineTrans)
完整代码
dev_close_window () dev_open_window (0, 0, 512, 512, 'white', WindowID) dev_set_color ('black') * Draw with the mouse an arbitrary region into the window draw_region (Region, WindowID) hom_mat2d_identity (HomMat2DIdentity) hom_mat2d_rotate (HomMat2DIdentity, -0.3, 256, 256, HomMat2DRotate) hom_mat2d_scale (HomMat2DRotate, 1.5, 1.5, 256, 256, HomMat2DScale) affine_trans_region (Region, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor') dev_clear_window () dev_set_draw ('margin') dev_set_color ('red') dev_display (Region) dev_set_color ('green') dev_display (RegionAffineTrans)
补充
最终要的就是 旋转 、平移、缩放
平移 hom_mat2d_translate
旋转 hom_mat2d_rotate
缩放 hom_mat2d_scale
例子二(药片的定位)
打开示例,药片的定位
思路就是 先blob分析,然后计算区域的角度,然后仿射成标准的位置
首先是读取图片,打开窗口,设置字体,和draw方式,线宽等
dev_close_window () dev_update_off () read_image (ImageOrig, 'blister/blister_reference') dev_open_window_fit_image (ImageOrig, 0, 0, -1, -1, WindowHandle) set_display_font (WindowHandle, 14, 'mono', 'true', 'false') dev_set_draw ('margin') dev_set_line_width (3)
获取BGR中的第一个通道,就是B对应的单通道图像
(halcon中的三通道图像是默认BGR的)
access_channel (ImageOrig, Image1, 1)
接下来是二值化和获取轮廓(凸性)
threshold (Image1, Region, 90, 255) shape_trans (Region, Blister, 'convex')
获得该区域的角度(与水平的夹角)
该运算符基于椭圆轴,将区域看成一个椭圆,椭圆的长轴与极轴的夹角就是这个角度Phi
orientation_region (Blister, Phi)
可以看到是负的
获得区域的中心坐标
area_center (Blister, Area1, Row, Column)
利用 起始中心点坐标和角度 到 目标中心点坐标和角度 生成 仿射矩阵
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
进行仿射变换
affine_trans_image (ImageOrig, Image2, HomMat2D, 'constant', 'false')
例子三(充电宝定位)
由于图片不是正的,导致测量比较麻烦
所以我们可以通过仿射变换,使得图像变正,就可以使用统一的直线测量线段了
dev_close_window () read_image (Image, 'C:/Users/xuheding/Desktop/图片/2.png') dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) dev_display (Image) rgb1_to_gray (Image, GrayImage) threshold (GrayImage, Regions, 185, 247) opening_rectangle1 (Regions, RegionOpening, 15, 15) fill_up (RegionOpening, RegionFillUp) * 最小外接矩形 shape_trans (RegionFillUp, RegionTrans, 'rectangle2') * 获得角度 orientation_region (RegionTrans, Phi) * 获得区域中心坐标 area_center (RegionTrans, Area, Row, Column) * 获得仿射矩阵 vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(180), HomMat2D) * 仿射变换 affine_trans_image (GrayImage, ImageAffineTrans, HomMat2D, 'constant', 'false')
最后选择,助手->测量助手
绘制直线
设置参数后
点击代码生成
例子四(车牌定位)
将图像转为灰度图后,可以点击助手->OCR
1.先画ROI 2.输入希望读取的文本 3.点击字符是暗背景上的亮字符(因为这张图的缘故) 4.点击应用快速设置即可
1.首先读取图片,转为灰度图,然后阈值分割,开操作(去噪),计算连通域,选择特征形状
2.要排序 区域,因为后序要识别
3.载入ocr分类器(0到9,A到Z),进行预测(由于该分类器的原因,要输入黑字白底的,但是车牌是白字黑底的,所以要翻转一下,传入分类器中)
read_image (Image, 'C:/Users/xuheding/Desktop/图片/3.png') rgb1_to_gray (Image, GrayImage) dev_display (GrayImage) threshold (Image, Regions, 100, 211) opening_rectangle1 (Regions, RegionOpening, 3, 3) connection (RegionOpening, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, ['width','height','rectangularity','column'], 'and', [0,35.78,0.20092,254.13], [63.3,71.01,0.59358,725.69]) sort_region (SelectedRegions, SortedRegions, 'character', 'true', 'row') read_ocr_class_mlp ('DotPrint_0-9A-Z_NoRej.omc', OCRHandle) invert_image (GrayImage, ImageInvert) do_ocr_multi_class_mlp (SortedRegions, ImageInvert, OCRHandle, Class, Confidence)
可以看到 都识别到了
其他
测量助手使用
点击
可以通过绘制线段,检测直线
变换设置postive,选择黑到白的变化
设置negative则是,白到黑
设置all则是,都要
可以点击显示轮廓线,来显示轮廓