当前位置: 首页 > news >正文

[halcon案例2] 足球场的提取和射影变换

一、提要 

        值得注意的是,在自然环境中,提取对象的算法都不是普适的,是有条件的。针对某种特殊的属性设计算法算法。本例是对足球场进行提取,其对应的特殊条件是:足球场是矩形、足球场的草坪是绿的。而针对矩形物需要矩形匹配,着重找出四个边角,针对绿色,需要颜色匹配。

       

二、算法要点描述

        这是通过提取四个从体育场的斜视图看足球场的角落。四个角定义一个四边形,然后映射到一个矩形具有正确的纵横比。如果场的尺寸是已知度量,该程序可以扩展为执行度量在足球场和体育场跑道上进行测量。

2.1 绿颜色矩形区域的提取

1)加载彩色图像并显示

dev_update_off ()
read_image (Image, 'olympic_stadium')
dev_display (Image)

2)将RGB转化成HSV,其中H在(60,90)范围是绿色

decompose3 (Image, ImageR, ImageG, ImageB)
trans_from_rgb (ImageR, ImageG, ImageB, ImageH, ImageS, ImageV, 'hsv')
threshold (ImageH, GreenRegion, 60, 90)
connection (GreenRegion, ConnectedRegions)

此处RGB<-->HSV的知识,可以参考这个地址。 

3)从粗选区域中选出满足的区域

  • 80%近似矩形的,
  • 面积大于190像素的区域,
  • 并取出凸包含,
  • 取出边缘。
  • 边缘膨胀7个像素。 
select_shape_std (ConnectedRegions, RectangleRegions, 'rectangle2', 80)
select_shape_std (RectangleRegions, Field, 'max_area', 190)
shape_trans (Field, FieldConvex, 'convex')
boundary (FieldConvex, FieldBorder, 'inner')
dilation_rectangle1 (FieldBorder, FieldDilation, 7, 7)

4)精度边界提取出来,将原图贴回,提取亚像素边界。

reduce_domain (Image, FieldDilation, ImageReduced)
edges_color_sub_pix (ImageReduced, Edges, 'canny', 1.5, 20, 40)

算子解释: edges_color_sub_pix。

  • edges_color_sub_pix(Image : Edges : Filter, Alpha, Low, High : )

         edge_color_sub_pix 从输入图像Image中提取亚像素精确的颜色边缘。颜色边缘的定义在edges_color的描述中给出。可以选择与edges_color中相同的边缘过滤器:'canny'、'deriche1'、'deriche2'和' shen'。此外,可以使用'sobel_fast'选择快速Sobel过滤器。

        可以任意选择“过滤器宽度”(即平滑量)。有关此参数的详细说明,请参阅edges_color。过滤器='sobel_fast'时忽略此参数。

        提取的边缘在 Edges 中作为亚像素精确 XLD 轮廓返回。对于除“sobel_fast”之外的所有边缘算子,为每个边缘点定义以下属性(参见 get_contour_attrib_xld):

5)边界线回归

select_shape_xld (Edges, SelectedEdges, 'contlength', 'and', 15, 500)
segment_contours_xld (SelectedEdges, ContoursSplit, 'lines', 5, 4, 2)
regress_contours_xld (ContoursSplit, RegressContours, 'no', 1)

6)将矩形的圆角消除

* Weed out edges that are not straight enough.
select_contours_xld (RegressContours, SelectedContours, 'curvature', 0, 0.5, 0, 0)
* Select edges that are long enough to provide meaningful direction information.
select_shape_xld (SelectedContours, SelectedEdges, 'contlength', 'and', 15, 500)


select_contours_xld(Contours : SelectedContours : Feature, Min1, Max1, Min2, Max2 : )

select_shape_xld (SelectedContours, SelectedEdges, 'contlength', 'and', 15, 500)

union_collinear_contours_xld (SelectedEdges, UnionContours, 30, 1, 4, 0.1, 'attr_forget')

select_shape_xld (UnionContours, HorizontalEdges, 'phi', 'and', rad(-20), rad(20))
select_shape_xld (UnionContours, VerticalEdges, ['phi','phi'], 'or', [rad(-90),rad(60)], [rad(-60),rad(90)])


fit_line_contour_xld (HorizontalEdges, 'tukey', -1, 0, 10, 2, RowBegHor, ColBegHor, RowEndHor, ColEndHor, NrHor, NcHor, DistHor)
IndexHor := sort_index(RowBegHor)
fit_line_contour_xld (VerticalEdges, 'tukey', -1, 0, 10, 2, RowBegVer, ColBegVer, RowEndVer, ColEndVer, NrVer, NcVer, DistVer)
IndexVer := sort_index(ColBegVer)

intersection_lines (RowBegHor[IndexHor[0]], ColBegHor[IndexHor[0]], RowEndHor[IndexHor[0]], ColEndHor[IndexHor[0]], RowBegVer[IndexVer[0]], ColBegVer[IndexVer[0]], RowEndVer[IndexVer[0]], ColEndVer[IndexVer[0]], RowUL, ColUL, IsOverlapping)

gen_contour_polygon_xld (FieldBorder, [RowUL,RowUR,RowLR,RowLL,RowUL], [ColUL,ColUR,ColLR,ColLL,ColUL])


vector_to_proj_hom_mat2d ([RowUL,RowUR,RowLR,RowLL] + 0.5, [ColUL,ColUR,ColLR,ColLL] + 0.5, [160,160,340,340] + 0.5, [250,550,550,250] + 0.5, 'normalized_dlt', [], [], [], [], [], [], HomMat2D, Covariance)
projective_trans_image_size (Image, TransImage, HomMat2D, 'bilinear', 800, 500, 'false')
projective_trans_contour_xld (FieldBorder, FieldBorderTrans, HomMat2D)

代码实例

相关文章:

  • 第10章-Redis_主从复制
  • 猿创征文 |《深入浅出Vue.js》打卡Day1
  • web前端面试高频考点——Vue3.x(Composition API的逻辑复用、Proxy实现响应式)
  • go语言实现十大排序算法
  • 学习笔记(13)ES6新特性
  • vue2 项目中引入iconfont
  • 手把手教你深度学习和实战-----循环神经网络(RNN、LSTM)
  • 西宾猫耳下载工具(missevandown)
  • 【C++项目】boost搜索引擎
  • 9.5-9.9 小知识点
  • 【流行框架】SpringMVC
  • Linux命令之chage命令
  • java导出功能(多个sheet页数据导出)
  • 力扣系列题,回溯专场
  • 在windows桌面上部署网站
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • JAVA并发编程--1.基础概念
  • JS笔记四:作用域、变量(函数)提升
  • Map集合、散列表、红黑树介绍
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Python连接Oracle
  • SpringCloud集成分布式事务LCN (一)
  • Spring框架之我见(三)——IOC、AOP
  • tensorflow学习笔记3——MNIST应用篇
  • 大数据与云计算学习:数据分析(二)
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 给初学者:JavaScript 中数组操作注意点
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 简单数学运算程序(不定期更新)
  • 什么是Javascript函数节流?
  • 消息队列系列二(IOT中消息队列的应用)
  • 小试R空间处理新库sf
  • 因为阿里,他们成了“杭漂”
  • ​2021半年盘点,不想你错过的重磅新书
  • ​虚拟化系列介绍(十)
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #{}和${}的区别是什么 -- java面试
  • (1)bark-ml
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (2)STL算法之元素计数
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (SpringBoot)第七章:SpringBoot日志文件
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二十四)Flask之flask-session组件
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)ABI是什么