【Halcon 】Halcon 裁剪尺寸的像素陷阱全解析:为什么要 -0.5,为什么要 -1,而圆却不用?
Halcon 裁剪尺寸的像素陷阱全解析:为什么要 -0.5,为什么要 -1,而圆却不用?
在使用 Halcon 进行 ROI 裁剪时,很多开发者都会踩到一个经典的坑:
明明定义了 512x512
的矩形,结果却得到了 513x513
的图像!更奇怪的是,使用 HDrawingObject.RECTANGLE1
又要减 1
,但 gen_circle
生成圆时却不用做任何修正。
本文将从 Halcon 坐标体系 → 区域落格规则 → 三种典型情况(矩形、RECTANGLE1、圆) 出发,带你彻底弄清这个差异的根源。
1. Halcon 坐标体系与像素规则
-
像素坐标定义
Halcon 中(0,0)
不是像素的左上角,而是 像素的中心点。 -
像素格子范围
一个像素(Row, Col)大致覆盖:(Row - 0.5, Col - 0.5) ~ (Row + 0.5, Col + 0.5)
-
区域落格规则
Halcon 的 Region 是几何对象。生成 Region 后,会将其与像素格对齐:
👉 只要像素中心落在区域内,该像素就会被包含。
2. gen_rectangle2
:为什么要 -0.5?
gen_rectangle2
定义方式:
gen_rectangle2 (Rectangle, Row, Col, Phi, Length1, Length2)
Length1
和Length2
表示 中心到边界的几何距离。- 假设
Length1 = 256
,矩形范围就是Row±256
。
问题来了:
- 这个范围会包含从
Row-256
到Row+256
,总共有 513 个像素。 - 因为两端都正好压在像素中心上,Halcon 会把两端的像素都算进来。
解决办法
👉 将长度减去 0.5
:
gen_rectangle2 (Rectangle, Row, Col, 0, 255.5, 255.5)
这样矩形边界落在像素格的边缘上,正好覆盖 512
个像素。
结论
gen_rectangle2
是几何定义,需 -0.5 来对齐像素格。
3. HDrawingObject.RECTANGLE1
:为什么要 -1?
HDrawingObject.RECTANGLE1
定义方式:
HDrawingObject rectObj = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1,row1, col1, row2, col2);
这里 (row1, col1)
和 (row2, col2)
是对角点,表示像素索引范围。
理论上:
[row1, row2]
应该包含row2 - row1 + 1
个像素。- 例如
(0,0) ~ (511,511)
→512x512
。
但在实际转换为 Region 时,Halcon 内部会多包一格,导致变成 513x513
。
👉 实测表明,必须把右下角坐标减 1:
row2 = row2 - 1;
col2 = col2 - 1;
结论
RECTANGLE1
定义的是像素索引,但 HDrawingObject
→ Region 转换时有偏移。
需 -1.0 来抵消。
4. gen_circle
:为什么不用修正?
gen_circle
定义方式:
gen_circle (Circle, Row, Col, Radius)
半径表示几何意义的距离:
- 所有 到中心点距离 ≤ Radius 的点都在区域内。
- 边界是连续曲线,不会整齐对齐到像素格。
落格时,Halcon 直接按照“像素中心是否落在圆内”来判断。
由于边界不会卡在像素格线上,所以不会出现“多一整行/列”的情况。
结论
圆形天然避免了矩形的“整齐对齐”问题 → 不需要修正。
5. 总结对比
ROI 类型 | 定义方式 | 默认结果 | 修正方法 |
---|---|---|---|
gen_rectangle2 | 几何中心+长宽 | 多 1 像素 (513x513 ) | Length - 0.5 |
RECTANGLE1 (HDrawingObject ) | 两个角点索引 | 多 1 像素 (513x513 ) | row2-1, col2-1 |
gen_circle | 中心点+半径 | 无偏差 | 无需修正 |
6. 一句话记忆
- 几何矩形 (
gen_rectangle2
):边界压格子 → 减 0.5 - 像素矩形 (
RECTANGLE1
):多包一格 → 减 1 - 圆 (
gen_circle
):边界不对齐,不存在偏差 → 不用减
7. 结语
Halcon 的 ROI 裁剪看似简单,但几何定义和像素索引的差异,常常让开发者掉坑。
理解 坐标系、落格规则和三种典型 ROI 的区别,就能避免莫名其妙的 513x513
尴尬。
下次再遇到 ROI 偏差,只要记住这句话:
👉 矩形减 0.5,RECTANGLE1 减 1,圆不用减!