一、实际需求:
在产品的固定区域内判断有没有缺失结构,黑色物体就是结构
二、解决思路:
1、先读取一张图片作为标准图像,再对整个产品进行定位(获取中心坐标Row1, Column1,Phi1);
2、然后在标准图像的产品的固定区域内绘制矩形区域(gen_rectangle1())。
3、最后 读取一张测试图片,再对整个产品进行定位(获取中心坐标Row3, Column3,Phi3);
4、将步骤1、3得到的坐标进行仿射变换:
vector_angle_to_rigid (Row1, Column1, Phi1, Row3, Column3, Phi3, HomMat2D2)
再将得到的句柄HomMat2D2用于仿射步骤2绘制的矩形区域:
affine_trans_region (TMP_Region0, RegionAffineTrans, HomMat2D2, ‘nearest_neighbor’)
三、代码实现:
1、代码实现步骤1,2
dev_set_draw ('margin')
read_image (B70, './标准图像_缺结构.jpg')
dev_get_window (WindowHandle)
rgb1_to_gray (B70, GrayImage)
*** 1、定位产品位置
threshold (GrayImage, Region, 50, 255)
connection (Region, ConnectedRegions)
closing_rectangle1 (ConnectedRegions, RegionClosing, 10, 10)
fill_up (RegionClosing, RegionFillUp)
opening_rectangle1 (RegionFillUp, RegionOpening, 100, 100)
select_shape (RegionOpening, SelectedRegions, 'height', 'and', 9000, 99999)
area_center (SelectedRegions, Area, Row, Column)
orientation_region (SelectedRegions, PhiRef)
gen_cross_contour_xld (Cross, Row, Column, 66, 0.785398)
* 仿射变换,矫正产品位置
vector_angle_to_rigid (Column, Row, PhiRef, Column, Row, rad(90), HomMat2D)
affine_trans_image (GrayImage, ImageAffineTrans, HomMat2D, 'constant', 'false')
stop ()
*** 2、获取区域位置的相对矩阵
* 绘制标准固定区域
gen_rectangle1 (TMP_Region0, 6965.41, 3539.2, 8192.68, 5675.49)
gen_rectangle1 (TMP_Region1, 8965.41, 3675.56, 10738.1, 4402.81)
* 获取校正后的产品区域
threshold (ImageAffineTrans, Region1, 50, 255)
connection (Region1, ConnectedRegions1)
closing_rectangle1 (ConnectedRegions1, RegionClosing1, 10, 10)
fill_up (RegionClosing1, RegionFillUp1)
opening_rectangle1 (RegionFillUp1, RegionOpening1, 100, 100)
select_shape (RegionOpening1, SelectedRegions1, 'height', 'and', 9000, 99999)
area_center (SelectedRegions1, Area1, Row1, Column1)
orientation_region (SelectedRegions1, Phi1)
***得到了标准图像的产品的坐标:Row1, Column1, Phi1
***得到了标准固定区域:TMP_Region0, TMP_Region1
stop ()
2、代码实现步骤3,4
***
*** 3、读取新的测试图片 ***
***
read_image (B71, './测试图片_缺结构.jpg')
rgb1_to_gray (B71, GrayImage1)
* 获取整个产品的位置
threshold (GrayImage1, Region2, 50, 255)
connection (Region2, ConnectedRegions2)
closing_rectangle1 (ConnectedRegions2, RegionClosing2, 10, 10)
fill_up (RegionClosing2, RegionFillUp2)
opening_rectangle1 (RegionFillUp2, RegionOpening2, 100, 100)
select_shape (RegionOpening2, SelectedRegions2, 'height', 'and', 9000, 99999)
area_center (SelectedRegions2, Area3, Row3, Column3)
orientation_region (SelectedRegions2, Phi3)
* 仿射变换标准目标区域到测试图像
vector_angle_to_rigid (Row1, Column1, Phi1, Row3, Column3, Phi3, HomMat2D2)
affine_trans_region (TMP_Region0, RegionAffineTrans, HomMat2D2, 'nearest_neighbor')
affine_trans_region (TMP_Region1, RegionAffineTrans1, HomMat2D2, 'nearest_neighbor')
*** 4、缺陷检测
reduce_domain (GrayImage1, RegionAffineTrans, ImageReduced)
reduce_domain (GrayImage1, RegionAffineTrans1, ImageReduced1)
dev_display (GrayImage1)
* 获取平均灰度值,平均灰度值mean大于60就是缺结构
get_domain (ImageReduced, Domain)
area_center (Domain, Area2, Row2, Column2)
gen_circle (Circle, Row2-60, Column2, 200)
intensity (Circle, ImageReduced, Mean1, Deviation)
get_domain (ImageReduced1, Domain1)
area_center (Domain1, Area4, Row4, Column4)
gen_circle (Circle1, Row4, Column4, 200)
intensity (Circle1, ImageReduced1, Mean2, Deviation1)
四、参考说明
本文参考了该篇文章的思想,并根据自己的实际需求进行实现
halcon 仿射变换和区域跟随