HImage image("barcode/ean13/ean1301");
HTuple paramName, paramValue;
HBarCode barcode(paramName, paramValue);
HRegionArray code_region;
HTuple result;
code_region = barcode.FindBarCode(image, "EAN-13", &result);
code_region = image.FindBarCode(barcode, "EAN-13", &result);
面向过程的方式
Hobject image;
HTuple barcode;
Hobject code_region;
HTuple result;
read_image(&image, "barcode/ean13/ean1301");
create_bar_code_model(HTuple(), HTuple(), &barcode);
find_bar_code(image, &code_region, barcode, "EAN-13", &result);
3.halcon/c++所有的 对象 可以在C:\Program Files\MVTec\HALCON-10.0\include\cpp 中找到 (以halcon安装在C盘为例)
#include "stdafx.h"
#include "HalconCpp.h"
#include <iostream>
#pragma comment(lib,"halconcpp.lib")
using namespace std;
using namespace Halcon;
//~~ 提取字符
int main()
{
HImageArray images;
HRegionArray regions;
HTuple thresholds;
HWindow w;
for (int i = 1; i <=2;++i)
{
//HTuple("alpha") +i 的解释
//HTuple 中有对 operater + 的重载
//HTuple("alpha") +i ~~~ alpha1 alpha2.....
images[i-1] = HImage::ReadImage(HTuple("alpha") +i);
}
//这一句相当于对 images中所有的对象进行了 charthreshold操作
regions = images.CharThreshold(images[0].GetDomain(),2,95,&thresholds);
for (int i = 0 ; i<regions.Num();++i)
{
images[i].Display(w);
w.Click();
regions[i].Display(w);
w.Click();
cout<<"threshold : "<<thresholds[i].L()<<endl;
}
w.Click();
return 0;
}
5. 关于参数转换
• Converting Hobject into iconic parameter classes
Hobject p_image;
read_image(&p_image, "barcode/ean13/ean1301");
HImage o_image(p_image);
Iconic parameters can be converted from Hobject to, e.g., HImage simply by calling the construc-
tor with the procedural variable as a parameter.
• Converting handles into handle classes
HTuple p_barcode;
create_bar_code_model(HTuple(), HTuple(), &p_barcode);
HBarCode o_barcode;
o_barcode.SetHandle(p_barcode[0]);
o_code_region = o_barcode.FindBarCode(o_image, "EAN-13", &result);
Handles cannot be converted directly via a constructor; instead, you call the method SetHandle()
with the procedural handle as a parameter.
• Converting handle classes into handles
p_barcode = o_barcode.GetHandle();
Similarly, a handle can be extracted from the corresponding class via the method GetHandle().
You can even omit the method, as the handle classes provide cast operators which convert them
automatically into handles.
p_barcode = o_barcode;
•Converting iconic parameter classes into Hobject
Hobject p_code_region = o_code_region.Id();
Iconic parameters can be converted from classes like HRegion back into Hobject via the method
Id(). In contrast to the handle classes no cast operator is provided.
• Converting HWindow into a window handle
long p_window;
open_window(0, 0, width/2, height/2, 0, "visible", "", &p_window);
HWindow o_window(0, 0, 100, 100, 0, "visible", "");
p_window = o_window.WindowHandle();
disp_obj(p_code_region, p_window);
In contrast to other handles, procedural window handles cannot be converted into instances of the
class HWindow! However, you can extract the handle from an instance of HWindow via the method
WindowHandle().
6 . The halcon Parameter classes
6.1 Iconic Objects
基类为Hobject
HImage ,HRegion,HXLD 基类为Hobject
6.1.1 Reions
region 是图像平面的一组坐标点 , 它可能不是连接的,可能含有洞,它可以比图像还大。
通过一个例子来了解HRegion
#include "stdafx.h"
#include "HalconCpp.h"
#include <iostream>
#pragma comment(lib,"halconcpp.lib")
using namespace std;
using namespace Halcon;
/*
例子介绍了region的用法 ,更详细的介绍在 progarma_guide chapter6.1.1
*/
int main()
{
HImage image("mreut");
HRegion region;
HWindow w;
region = image >=190;
w.SetColor("red");
region.Display(w);
w.Click();
//region.Fillup() 调用方法
HRegion filled = region.FillUp();
filled.Display(w);
w.Click();
//运算符重载 开运算 >> 腐蚀 <<膨胀 , 半径4.5
HRegion open = (filled >>4.5)<<4.5;
w.SetColor("green");
open.Display(w);
w.Click();
w.ClearWindow();
//平移
HDPoint2D trans(-100 , -150);
HRegion moved = open + trans;
HRegion zoomed = moved * 2.0;
zoomed.Display(w);
w.Click();
return 0;
}
#include "stdafx.h"
#include "HalconCpp.h"
#include <iostream>
#pragma comment(lib,"halconcpp.lib")
using namespace std;
using namespace Halcon;
/*
例子介绍了regionArry的用法
*/
int main()
{
HImage image("fabrik");
// 1 1 row col 越小越精细
// 4 容差 种子和被检测像素值差
// 100 最小region size
HRegionArray regs = image.Regiongrowing(1,1,4,100);
HWindow w;
w.SetColored(12);
image.Display(w);
w.Click();
regs.Display(w);
w.Click();
HRegionArray rect;
for (int i = 0 ; i < regs.Num() ; ++ i )
{
// compactness ~~ 在图像处理中经常叫做圆形度 而这里用作 region的紧密度
//C = L^2 / (4 F pi)) L = 周长 F = 面积
//C = 1 是 为圆 ,region 较长是 或者region 有洞洞时 C >1
//这里就是得出了 比较方正的 没小洞洞的 region
if ( (regs[i].Area() > 1000) && ( regs[i].Compactness() < 1.5) )
rect.Append(regs[i]); //RegionArry 添加元素哦
}
image.Display(w);
rect.Display(w);
w.Click();
return 0;
}
6.1.2 Images
#include "stdafx.h"
#include "HalconCpp.h"
#include <iostream>
#pragma comment(lib,"halconcpp.lib")
using namespace std;
using namespace Halcon;
/*
drawregion 画感兴趣区域
meanimage 做个中值滤波
和中值滤波前图像比较
*/
int main()
{
HImage image("mreut");
HWindow w;
image.Display(w);
cout<< " width = " << image.Width()<<endl;
cout << " height = " << image.Height() <<endl;
HRegion mask= w.DrawRegion();
// & 重载 取感兴趣区域的图像
HImage reduced = image & mask;
w.ClearWindow();
reduced.Display(w);
w.Click() ;
HImage mean = reduced.MeanImage(61,61);
mean.Display(w);
HRegion reg = reduced.DynThreshold(mean,3,"light");
reg.Display(w);
w.Click();
return 0;
}
6.1.2.2 像素值
操纵像素的两种方法
int main()
{
HByteImage in("mreut");
HByteImage out = in ;
HWindow w;
in.Display(w);
w.Click() ;
int nwidht = in.Width();
int nheight = in.Height();
long end = nwidht * nheight;
for (int k = 0 ; k < end ; k++)
{
//方法1
//int pix = in.GetPixVal(k);
//out.SetPixVal(k,255 - pix);
//方法2
out[k]= 255 - in[k];
}
out.Display(w);
w.Click();
return 0;
}
6.1.3 XLD Objects
XLD is the abbreviation for eXtended Line Description. This is a data structure used for describing areas
(e.g., arbitrarily sized regions or polygons) or any closed or open contour, i.e., also lines. In contrast to
regions, which represent all areas at pixel precision, XLD objects provide subpixel precision. There are
two basic XLD structures: contours and polygons.
Similarly to images, HALCON/C++ provides both a base class HXLD and a set of specialized classes
derived from HXLD, e.g., HXLDCont for contours or HXLDPoly for polygons. For all classes there exists
a corresponding container class, e.g., HXLDArray.
In contrast to the classes described in the previous sections, the XLD classes provide only member
functions corresponding to HALCON operators (see also section 5.2.2 on page 35).
6.1.4 Low - level iconic objects 底层iconic 对象
In fact, the class Hobject is HALCON’s basic class for accessing the internal data management
Furthermore, Hobject serves as the basis for the class HObject and the derived classes, e.g., HImage.
As noted above, an instance of Hobject can also contain a tuple (array) of iconic objects. Unfortunately,
Hobject provides no special member functions to add objects or select them; instead, you must use the