转战Halcon日记【3】-- 图片转正+抠图
转战Halcon日记【1】-- 图片读取 - gammalog - 博客园 (cnblogs.com)
转战Halcon日记【2】-- 灰度化和二值化 - gammalog - 博客园 (cnblogs.com)
经过日记【1】和日记【2】的修练,来实现一个实际的例子
我们的目的是要把这个钉子抠出来,得到抠出来的图和自动旋转成水平方向的图
输入图:
目标结果:
*读图片就不在过多赘述
read_image (Image, 'C:/Users/59436/Desktop/halcon_test_iamges/017.png')
*二值化 前面也讲过
threshold (Image, Region, 60, 120)
*将区域分开来的一个算子(估计会经常用到的一个算子)
*第一个参数是二值化之后的图像
*第二个参数是分开后的区域的集合
connection (Region, ConnectedRegions)
*筛选区域的一个算子,很好理解,就是通过某种条件去筛选想要的区域
*第一个参数是区域的一个集合,第二参数是筛选后的区域保存在这个变量种
*第三个参数表示以什么条件筛选,我这里是以面积进行筛选的,这个条件halcon给了很多,只能慢慢摸索学习了
*第五个和第六个参数分别代表了面积的最大值和最小值,通俗来说筛选出面积在这个范围的区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 80000, 85000)
*smallest_rectanle2类似于opencv中finder_counter之后用cv2.minarearect()
*第一个参数就是我们筛选出来的那个区域
*第二个参数到最后的参数分别代表计算出来的区域的中心的行数、区域中心的列数、角度、区域长边的数值的一半、区域短边的数值的一半
*ps:值得注意的是
*Lenghts1始终大于Lenghts2,所以在确定宽和高的时候要特别注意
*phi是弧度,在之后旋转的时候要转成角度 1弧度 = 180/Π 且是长的那条边与X轴的夹角
*长边与X轴负方向的夹角为-,长边与X轴正方向的夹角为+,弧度值为-Π/2+到Π/2之间
smallest_rectangle2 (SelectedRegions, Row, Column, Phi, Lenghts1, Lenghts2)
*smallest_rectanle1相当于opencv中finder_counter之后用的cv2.boundingrect()
*第一个参数是筛选出来的区域
*第二个参数到最后的参数分别表示左上顶点的行,左上顶点的列,右下顶点的行,右下顶点的列
smallest_rectangle1(SelectedRegions, Row1, Column1, Row2, Column2)
*弧度转角度,初中知识,百度可查
ratio := 180/3.1415
*旋转图片
*第一个参数是需要旋转的图片,第二个参数是选之后的图片
*第三个参数是旋转的角度,第四个参数是插值的方式,默认就这个
*旋转中心是图片的中心,旋转方向是逆时针(特别注意旋转的方向!!!!)
*旋转成水平方向
rotate_image(Image, ImageRotate, -ratio*Phi, 'constant')
*旋转成竖直方向
if (Phi>0)
rotate_image(Image, ImageRotate1, 90-ratio*Phi, 'constant')
else
rotate_image(Image, ImageRotate1, 90+ratio*Phi, 'constant')
endif
*抠图
*第一个参数是需要抠图的图片,第二个参数抠图后的图片
*第三个到最后的参数分别是抠图的起始点行数、抠图的起始点列数,抠图的宽,抠图的高
crop_part(ImageRotate, ImagePart, Row-Lenghts2, Column-Lenghts1, 2*Lenghts1, 2*Lenghts2)
crop_part(Image, ImagePart1, Row1, Column1,Column2-Column1,Row2-Row1)
*保存图片
*第一个参数需要保存的图片,第二个参数是保存图片的后缀名,第三个参数默认为0,第四个参数是保存的路径
write_image(ImagePart, 'png', 0, 'demo_rotate')
write_image(ImagePart1, 'png', 0, 'demo')
然后我们来看一看整个流程得到的图片是整么样的
截图界面