ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

halcon 基础总结(一)裁切图片并旋转图像

2022-06-28 15:05:49  阅读:304  来源: 互联网

标签:旋转 裁切 Column image halcon 图像 Lenghts2 Lenghts1 Row


 

  • 第一步当然是读取图像了:read_image (Image, 'C:/Users/HJ/Desktop/test_image/b.jpg')        

  • 第二步:二值化。二值化。因为我这里的物体是黑色的,所以用binary_threshold来二值化的时候参数选择的‘dark’,如果特征是白色的话可以把dark改为light,效果如下:

  • 第三步:将区域打散,然后根据过滤条件来进行赛选,我这里是通过面积来进行筛选 。过滤条件在这里只用了一个,也可以使用多个过滤条件来进行过滤。

        connection (Region, ConnectedRegions)

        select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 400000, 9900000)

​编辑​编辑 

  •  第四步:筛选完之后就只剩下想要的区域了,然后寻找区域的最小外接矩形。

           smallest_rectangle2 (SelectedRegions, Row, Column, Phi, Lenghts1, Lenghts2)
           返回的Row,Column是区域特征的中心点坐标,Lenghts1是物体区域的长边的一半,Lenghts2是物体区域的短边的一半,Lenghts1>Lenghts2恒成立。Phi是x轴(水平)与长边的夹角的弧度,

           它的值在(-π/2, π/2), 要将phi换成角度的话只用angle := -180/π  * phi就好了

  • 第五步:因为在实际场景中,拍出来的图片位置会有些许差异,所以我们需要得到一个统一的输出,也就是输出的图片中物体的位置差异不大。所以就需要经过旋转和裁切来进行处理。

        rotate_image(Image, ImageRotate, angle, 'constant')

        在halcon中rotate_image是按逆时针方向进行旋转,而且旋转后的图片大小不变,但内容可能会有缺失。并且物体的中心在原图的位置和在旋转之后图片上的位置还会有差异。

 

​编辑

 为了解决使用rotate_image进行旋转产生的问题,可以所以建议使用旋转矩阵来进行旋转。具体参数解释在代码里

hom_mat2d_identity(HomMat2DIdentity)
hom_mat2d_rotate(HomMat2DIdentity, rad(angle), Row, Column, HomMat2DRotate)
affine_trans_image(Image, ImageAffineTrans, HomMat2DRotate, 'constant', 'false')

​编辑

  • 第六步:裁剪出想要的区域

crop_part(ImageAffineTrans, ImagePart, Row-Lenghts2, Column-Lenghts1, 2*Lenghts1, 2*Lenghts2)

​编辑

 

注意事项:

  1. 在旋转的时候我们的角度是angle:=180/π  * phi,旋转之后物体的长边与X轴平行(也就是本子平着)。如果想要本子竖起来就需要令angle := -(ratio*Phi+90)这样子旋转之后本子就竖起来
  2. 在使用crop_part这个函数对图像进行裁切时,如果长边与X轴平行则Row-Length2,Column-Length1。保存的图像的长宽分别为2*Lenghts1, 2*Lenghts2
  3. 如果短边与X轴平行则Row-Length1,Column-Length2。保存的图像的长宽分别为2*Lenghts2, 2*Lenghts1
  4. 使用旋转矩阵旋转之后物体的中心其实是发生了变化的,并且length1可能会大于row和column,所以在crop_part的时候需要注意输入左上角的坐标
  5. 其实由于旋转之后物体中心发生了变化,我更倾向于对旋转之后的图片再重新二值化寻找轮廓,这样子物体中心就是正常的了。然后再进行裁切图片

 

总体代码:

 

read_image (Image, 'C:/Users/HJ/Desktop/save_image/angle_60.png')

*自适应二值化,当寻找的物体为偏黑时使用dark, 偏白时使用light
binary_threshold(Image, Region, 'max_separability', 'light', UsedThreshold)
*将区域打散
connection (Region, ConnectedRegions)
*通过面积来筛选区域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 400000, 9900000)
*寻找区域的最小外接矩形,返回的Phi是弧度,在(-π/2,π/2)之间
*Row,Column是中心点的坐标,length1是物体的长边的一半, length2是物体短边的一半
smallest_rectangle2 (SelectedRegions, Row, Column, Phi, Lenghts1, Lenghts2)

*角度换算,将弧度换算成角度
ratio := 90.045/1.5708
angle := ratio*Phi
*创建vertical来控制旋转是垂直还是水平, 1表示长边与x轴平行, 0表示短边与x轴平行
vertical := 0
*创建旋转矩阵
hom_mat2d_identity(HomMat2DIdentity)
if (vertical == 1)
  *旋转使用的是弧度,所以需要用rad将角度换成弧度, row, column是旋转中心
  hom_mat2d_rotate(HomMat2DIdentity, rad(90-angle), Row, Column, HomMat2DRotate)
  *旋转图片,false的时候图像大小不发生改变,true的时候图像大小会变化,使用旋转矩阵旋转之后物体的中心其实是发生了变化的,
  *所以在截取物体的时候其实还要在重新寻找一些物体在旋转之后的图片上的中心位置
  affine_trans_image(Image, ImageAffineTrans, HomMat2DRotate, 'constant', 'true')
  *裁切图片,当长边与x轴平行时,Row-Lenghts2, Column-Lenghts2, 2*Lenghts1, 2*Lenghts2
  *当短边与x轴平行时,Row-Lenghts1, Column-Lenghts2, 2*Lenghts2, 2*Lenghts1

  *Row-Lenghts1, Column-Lenghts2是左上角的坐标,2*Lenghts2, 2*Lenghts1是截取的场合宽
  crop_part(ImageAffineTrans, ImagePart, Row-Lenghts1, Column-Lenghts2, 2*Lenghts2, 2*Lenghts1)
else
  hom_mat2d_rotate(HomMat2DIdentity, rad(-angle), Row, Column, HomMat2DRotate)
  affine_trans_image(Image, ImageAffineTrans, HomMat2DRotate, 'constant', 'true')
  crop_part(ImageAffineTrans, ImagePart, Row-Lenghts2, Column-Lenghts1, 2*Lenghts1, 2*Lenghts2)
endif

 

 

 



标签:旋转,裁切,Column,image,halcon,图像,Lenghts2,Lenghts1,Row
来源: https://www.cnblogs.com/mr2504/p/16419433.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有