天天看點

Halcon C++擷取圖像像素的兩種方法示範與比較

    在圖像進行中有時候難免需要擷取圖像指定位置(x,y)的像素值,這裡沒有直接講擷取灰階值,是因為如果是彩色圖,那麼擷取的可能是彩色資訊值,比如:RGB,HSV等;如果是單通道圖像,擷取的可能是灰階值或者一些浮點類型數值可能代表距離高度等資訊。

    Halcon在HDevelop中給我們提供的擷取指定位置像素值的算子是get_grayval(),比如擷取(0,0)位置的像素值:

get_grayval (GrayImage, 0, 0, Grayval)      

get_grayval()算子執行效率較低,算子介紹中也建議在C++中擷取像素值采用指針方式的算子get_image_pointer1(),它可以擷取單個通道的指針,對應的get_image_pointer3()可以擷取三個通道的指針。

Halcon C++擷取圖像像素的兩種方法示範與比較

    (1) get_grayval()方法:

for (int i = 0; i < hv_Height.I(); i++)
  {
    for (int j = 0; j < hv_Width.I(); j++)
    {
      GetGrayval(ho_GrayImage, i, j, &hv_Grayval);
      //cout << hv_Grayval.I() << endl;
    }
  }      

    (2) get_image_pointer1()方法:

HImage hImg(ho_GrayImage);
  Hlong wid = 0;
  Hlong hgt = 0;
  HString cType;
  void *ptr = hImg.GetImagePointer1(&cType, &wid, &hgt);//GetImagePointer1(Hobj, &ptr, &cType, &wid, &hgt);
  uchar *pdata = static_cast<uchar *>(ptr);
  int height;
  for (int i = 0; i < hv_Height.I(); i++)
  {
    for (int j = 0; j < hv_Width.I(); j++)
    {
      height = *(pdata + j + i * hv_Width.I());
      //cout << height << endl;
    }
  }      

    (3) 周遊512 x 512大小的lena的灰階圖像比對耗時情況:

Halcon C++擷取圖像像素的兩種方法示範與比較

    get_grayval()方法耗時:150ms左右

Halcon C++擷取圖像像素的兩種方法示範與比較

    get_image_pointer1()指針方法耗時:35.5ms左右

Halcon C++擷取圖像像素的兩種方法示範與比較