HALCON C++ 以 HObject 為基底類別,派生出三大核心圖像變數類:
HRegion r; // 空區域 (面積 0) HRegion r2(r); // 複製建構 r = r2; // 指派 bool empty = r.IsEmpty(); // 面積是否為 0 long area = r.Area(); // 像素數 double cx = r.X(), cy = r.Y(); // 重心座標 double phi = r.Phi(); // 等效橢圓角度 double ra = r.Ra(), rb = r.Rb(); // 長/短半軸
HRegion scaled = r * 2.0; // 縮放 (中心 0,0) HRegion moved = r + HDPoint2D(10,20); // 平移 r += HDPoint2D(5,5); // 就地平移
HRegion eroded = r >> 3.5; // 圓形侵蝕 半徑 3.5 HRegion dilated = r << 3.5; // 圓形膨脹 半徑 3.5 ++r; // 十字膨脹 (5 點) --r; // 十字侵蝕 HRegion minkAdd = r1 + r2; // Minkowski 加 HRegion minkSub = r1 - r2; // Minkowski 減
bool inside = r.In(HDPoint2D(100,100)); // 點是否在區域內 HRectangle1 bbox = r.SmallestRectangle1(); // 最小外接矩形 (平行軸) r.Display(window); // 顯示於 HWindow
HRegionArray regs = image.RegionGrowing(1,1,4,100); // 分割得多區域 long n = regs.Num(); for (long i=0; i1000 && regs[i].Compactness() < 1.5) selected.Append(regs[i]); } selected.Display(window);

HImage img; // 空影像
HImage img("part.png"); // 讀檔
HImage img(512,512,"byte"); // 建立指定大小型別
HImage img(ptr, w, h, "byte"); // 從記憶體指標建立 (拷貝)
string type = img.PixType(); // "byte", "uint2", "real"...
int w = img.Width(), h = img.Height();
HPixVal val = img.GetPixel(x,y); // 取像素 (支援多通道)
img.SetPixel(x,y, val); // 設像素
HImage reduced = img & region; // 裁剪域 (reduce_domain) HImage add = img1 + img2; // 像素相加 HImage sub = img1 - img2; // 相減 HImage mul = img1 * img2; // 相乘 HImage inv = -img; // 反相 HImage scaled = img * 2.5; // 標量乘法 HImage thresh = img >= 128; // 閾值化 → 產生 HRegion HRegion dynThresh = img >= meanImg; // 動態閾值 (與另一影像比較)
HImage img("mreut.png");
HWindow win;
img.Display(win);
HRegion mask = win.DrawRegion(); // 互動繪製 ROI
HImage roi = img & mask; // 裁剪
HImage mean = roi.MeanImage(61,61); // 61x61 平均濾波
HRegion dark = roi <= (mean - 3); // 低於均值-3 的暗區
dark.Display(win);

統一處理不同像素型別 (byte, int2, real, complex...),支援隱式轉換:
HPixVal v = img.GetPixel(x,y); int gray = v; // operator int() double real = v; // operator double() HByte byteVal = v; // operator HByte() (0-255 飽和) img.SetPixel(x,y, 255 - gray); // 隱式 int→HPixVal
繼承 HImage,提供 operator[]/operator() 直接存取 HByte,無需 HPixVal 包裝:
HByteImage img("mreut.png");
HByteImage out = img;
long n = img.Width() * img.Height();
// 線性存取
for (long k=0; k> 1;
HByteImage notImg = ~img;
關鍵差異:HRegion 為像素精度 (整數座標),HXLD 為亞像素精度 (浮點座標),適合高精度測量、邊緣提取、形狀模型。
面向過程 API 的統一參數型別,可容納影像、區域、XLD、陣列。主要成員:
HObject(); // 空物件 HObject(const HObject&); // 複製 (增加參考計數) ~HObject(); // 解構 (遞減參考計數) void Reset(); // 釋放資源,重設鍵值
陣列操作需用 Tuple 模式函數:GenEmptyObj, ConcatObj, SelectObj, CountObj。
#include "HalconCpp.h"
using namespace Halcon;
int main() {
try {
HImage img("printer_chip.png");
HWindow win(0,0,512,512); win.Open();
// 預處理
HImage smoothed = img.MeanImage(7,7);
// 邊緣提取 → XLD 輪廓
HXLDCont edges = smoothed.EdgesSubPix("canny", 1, 20, 40);
// 輪廓擬合圓
HTuple row, col, radius;
edges.FitCircleContourXld(&row, &col, &radius, 0, 0, 0, 0, -1, 2);
// 顯示結果
img.Display(win);
win.SetColor("green");
edges.Display(win);
win.SetColor("red");
for (int i=0; i
關鍵提醒
- 參考計數管理:
HObject 衍生類別複製/指派增加參考計數,非深拷貝。若需獨立副本用 CopyObj / CopyImage。
- 定義域 (Domain):每個影像內建
HRegion 域,運算子預設僅在域內計算。img & region 可暫時縮小域。
- 例外處理:HALCON C++ 拋出
HException,務必 try-catch 包裹主流程。
- 編譯鏈結:需連結
halconcpp.lib、halcon.lib,包含 HalconCpp.h,設定包含/庫路徑。