情報詳細Q: 標準のHALCONとHALCON XLで、union2_closed_contours_xld を実行した際の結果(結合後の形状)が異なります。特にサイズが小さいXLDや、複雑な形状の場合に現象が発生するようです。原因と回避策を教えてください。 A: HALCON XLにおける演算精度の影響により、標準版と結果が異なる場合があります。 ■ 原因 HALCON XLは、標準版よりも巨大な画像サイズ(座標)を扱えるよう拡張されています。そのため、内部で使用されるデータ型や演算処理において、標準版とは異なる小数点以下の丸め込み処理が行われます。XLD(Subpixel精度)のように微細な座標を扱うデータにおいて、このわずかな近似誤差が影響し、交点や探索点の判定が変わることで、結合結果に差異が生じることがあります。特に、対象のサイズが非常に小さい場合や、形状が複雑(短冊状やひねりがある等)な場合に発生しやすい傾向があります。 ■ 対処法 以下のいずれかの方法で回避できるかご検討ください。 1. XLDをポリゴン近似してから結合する XLDを gen_polygons_xld を使用してポリゴンに変換(近似)することで、微小な誤差の影響を吸収し、安定性が向上します。 実装例: select_obj (Contours, ObjectSelectedXld, 1) * ポリゴン近似を行う(ramer法、許容誤差0.001など) gen_polygons_xld (ObjectSelectedXld, Temp1, 'ramer', 0.001) for Idx:=1 to Count-1 by 1 select_obj (Contours, ObjectSelectedXld, Idx+1) union2_closed_contours_xld (Temp, ObjectSelectedXld, Temp) * 結合対象も同様にポリゴン化する gen_polygons_xld (ObjectSelectedXld, Polygons, 'ramer', 0.05) union2_closed_polygons_xld (Temp1, Polygons, Temp1) endfor 2. 処理対象を拡大してから結合する 対象サイズが小さすぎることが原因の場合、一時的に affine_trans_contour_xld などで座標を拡大(例:2倍)してから結合処理を行い、処理後に元のサイズに戻すことで回避できる場合があります。 3. 処理順序を変更する ループ処理の順序を逆にする(最後から最初へ向かって処理する)ことで、演算順序が変わり、意図した結果が得られる場合があります。ただし、これはデータの並び順に依存するため、根本的な解決策とならない場合があります。 対象製品・バージョン: HALCON 全般(特に HALCON 11 ~ 24.11 等で確認)HALCON XL ランタイム添付ファイルタイトルHALCON XL環境における union2_closed_contours_xld の挙動差異と対処法URL 名000012061公開状況公開済み検証状況未検証