首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

HALCON/C++ 介面基礎:HObject、HImage、HRegion、HXLD 圖像變數類完整指南

     編輯:關於C++

HALCON C++ 物件階層

HALCON C++ 以 HObject 為基底類別,派生出三大核心圖像變數類:

  • HImage:灰度/彩色/多通道影像
  • HRegion:區域 (ROI),行程編碼 (Run-Length Encoding)
  • HXLD:亞像素精度輪廓 (XLD = eXtended Line Description)

HRegion:區域操作核心

建構與基本屬性

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:區域陣列

HRegionArray regs = image.RegionGrowing(1,1,4,100); // 分割得多區域
long n = regs.Num();
for (long i=0; i 1000 && regs[i].Compactness() < 1.5)
        selected.Append(regs[i]);
}
selected.Display(window);

原始影像 區域成長分割結果

HImage:影像操作核心

建構與資訊

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);

平均濾波與暗區提取結果

HPixVal:像素值通用存取

統一處理不同像素型別 (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

HByteImage:Byte 影像特化 (高效像素存取)

繼承 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;

HXLD:亞像素輪廓與多邊形

  • HXLDCont:輪廓 (開放/封閉),亞像素座標點序列
  • HXLDPoly:多邊形 (封閉區域)
  • HXLDArray:輪廓/多邊形陣列

關鍵差異:HRegion 為像素精度 (整數座標),HXLD 為亞像素精度 (浮點座標),適合高精度測量、邊緣提取、形狀模型。

HObject:底層通用控制代碼

面向過程 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

關鍵提醒

  1. 參考計數管理:HObject 衍生類別複製/指派增加參考計數,非深拷貝。若需獨立副本用 CopyObj / CopyImage。
  2. 定義域 (Domain):每個影像內建 HRegion 域,運算子預設僅在域內計算。img & region 可暫時縮小域。
  3. 例外處理:HALCON C++ 拋出 HException,務必 try-catch 包裹主流程。
  4. 編譯鏈結:需連結 halconcpp.lib、halcon.lib,包含 HalconCpp.h,設定包含/庫路徑。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved