python调用Halcon库(halcon库打包供python调用)

131 篇文章 21 订阅
22 篇文章 61 订阅

最近在做影像项目,发现在C++端调试halcon每次编译挺耗时间,同时使用不够方便,于是打包python库。系统必须是window10 64系统,python3(我的系统是这样,也可打包其他系统版本)。采用pybind11封装。此包是免费版(最新halcon已经支持python编程.)特点是灵活。

通常把部分常用函数方法做了中文注释,一部分采用默认参数,解决记不住参数的尴尬,在python输入函数鼠标移到函数后面能够看到重载的函数及中文注释。

另外有很多参数我们是无法记住的,在python端可将常用的参数封装好将来使用比较便捷,不用美美去查手册。

包含内容说明:

core 主要包含几个基础影像操作的类如HTuple,HImage,HObject,HSystem,HXLD,HWindow

dev 主要是函数操作,有2000多个函数及显示类HDevWindowStack

cpuls提供一个Mat图像和numpy图像相互转换操作有类及函数封装;另外封装一个void*指针,用于pythonz中直接操作C++中的指针

欢迎各位朋友交流提供建议。仅仅供学习使用!

1.安装:

将包解压拷贝到python安装目录C:\ProgramData\Anaconda3\Lib\site-packages

 2.Hdevelop编程:

测试:
get_system('image_dir',image_dir)
set_system('image_dir',image_dir+';C:/Users/Administrator/Desktop')
set_system('use_window_thread','true')

read_image (image,'/data/text')
get_image_size(image,width,height)
scale_image_max(image,image_max)

dev_open_window(0,0,width,height,'black',winhnd1)
dev_open_window(0,0,width,height,'black',winhnd2)
dev_set_part (450, 300, 750, 600)

dev_set_window(winhnd1)
dev_display(image)

dev_set_window(winhnd2)
dev_display (image_max)
* dev_close_window()

 3.C++端测试:

//c++导出程序:
void action()
{

  // Local iconic variables
  HObject  ho_image, ho_image_max;

  // Local control variables
  HTuple  hv_image_dir, hv_width, hv_height, hv_winhnd1;
  HTuple  hv_winhnd2;



  GetSystem("image_dir", &hv_image_dir);
  SetSystem("image_dir", hv_image_dir+";C:/Users/Administrator/Desktop");
  SetSystem("use_window_thread", "true");

  ReadImage(&ho_image, "/data/text");
  GetImageSize(ho_image, &hv_width, &hv_height);
  ScaleImageMax(ho_image, &ho_image_max);

  SetWindowAttr("background_color","black");
  OpenWindow(0,0,hv_width,hv_height,0,"visible","",&hv_winhnd1);
  HDevWindowStack::Push(hv_winhnd1);
  SetWindowAttr("background_color","black");
  OpenWindow(0,0,hv_width,hv_height,0,"visible","",&hv_winhnd2);
  HDevWindowStack::Push(hv_winhnd2);
  if (HDevWindowStack::IsOpen())
    SetPart(HDevWindowStack::GetActive(),450, 300, 750, 600);

  HDevWindowStack::SetActive(hv_winhnd1);
  if (HDevWindowStack::IsOpen())
    DispObj(ho_image, HDevWindowStack::GetActive());

  HDevWindowStack::SetActive(hv_winhnd2);
  if (HDevWindowStack::IsOpen())
    DispObj(ho_image_max, HDevWindowStack::GetActive());
  //dev_close_window ()
}

4.python端测试:面向过程 (代码数量多,且不够方便建议采用面向对象)

python测试1:

import ha_module as m

HTuple=m.core.HTuple
HObject=m.core.HObject
HWindow=m.core.HWindow
HSystem=m.core.HSystem

#方法1

image_path=HTuple()

m.dev.sys.GetSystem(HTuple('image_dir'),image_path)

image_path.str()
# '"C:\\Users\\Public\\Documents\\MVTec\\HALCON-18.11-Progress\\examples\\images;."'

image_path+=";C:/Users/Administrator/Desktop"
image_path.str()
#'"C:\\Users\\Public\\Documents\\MVTec\\HALCON-18.11-Progress\\examples\\images;.;C:/Users/Administrator/Desktop"'

m.dev.sys.SetSystem(HTuple('image_dir'),image_path)
m.dev.sys.SetSystem(HTuple('use_window_thread'),HTuple('true'))

obj1=HObject()
obj1.size()# 0

m.dev.img.ReadImage(obj1,HTuple('/data/text'))
obj1.size()#1

width=HTuple()
height=HTuple()

m.dev.img.GetImageSize(obj1,width,height)
width.str(),height.str()#('384', '196')

obj_max=HObject()
m.dev.img.ScaleImageMax(obj1,obj_max)
obj_max.str()#'HObjectclass HalconCpp::HObject'
obj_max.size()# 1

m.dev.win.SetWindowAttr(HTuple('background_color'),HTuple('black'))

winhnd1=HTuple()
winhnd2=HTuple()

m.dev.win.OpenWindow(HTuple(0),HTuple(0),width,height,HTuple(0),HTuple('visible'),HTuple(''),winhnd1)
m.dev.win.OpenWindow(HTuple(0),HTuple(0),width,height,HTuple(0),HTuple('visible'),HTuple(''),winhnd2)

m.dev.HDevWindowStack.Push(winhnd1)
m.dev.obj.DispObj(obj1,winhnd1)
m.dev.obj.DispObj(obj_max,winhnd2)

 5.python端测试:面向对象 建议采用

#python测试:方法2
win=m.core.HWindow(0,0,384,196)
img=m.core.HImage('/data/text')
img.size()# 1
win.disp_obj(img)
win.click()

win1=m.core.HWindow(0,0,384,196)
#img_max=m.core.HImage()
img_max=img.ScaleImageMax()
win1.disp_obj(img_max)
win1.click()

6.模块内容及帮助文档: 

包帮助文件:
help(m)
Help on module ha_module:

NAME
    ha_module - pybind11 python opencv halcon the math function test.the class mat and convert.the class htuple

SUBMODULES
    core
    cpuls
    dev

FILE
    c:\programdata\anaconda3\lib\site-packages\ha_module.pyd

包帮助文件:

m.core.__dict__
Out[55]: 
{'__name__': 'ha_module.core',
 '__doc__': None,
 '__package__': None,
 '__loader__': None,
 '__spec__': None,
 '__HHandleBase': ha_module.core.__HHandleBase,
 'HHandle': ha_module.core.HHandle,
 'HNULL': H0,
 'HString': ha_module.core.HString,
 'HTupleElementType': ha_module.core.HTupleElementType,
 'HTupleElement': ha_module.core.HTupleElement,
 'HTupleType': ha_module.core.HTupleType,
 'HTuple': ha_module.core.HTuple,
 '__HObjectBase': ha_module.core.__HObjectBase,
 'HObject': ha_module.core.HObject,
 'HSystem': ha_module.core.HSystem,
 'HWindow': ha_module.core.HWindow,
 'HImage': ha_module.core.HImage,
 'HRegion': ha_module.core.HRegion,
 'HXLD': ha_module.core.HXLD,
 'HXLDCont': ha_module.core.HXLDCont,
 'HXLDPoly': ha_module.core.HXLDPoly}

包帮助文件:

m.dev.__dict__
Out[56]: 
{'__name__': 'ha_module.dev',
 '__doc__': None,
 '__package__': None,
 '__loader__': None,
 '__spec__': None,
 'HDevWindowStack': ha_module.dev.HDevWindowStack,
 'cam': <module 'ha_module.dev.cam'>,
 'data': <module 'ha_module.dev.data'>,
 'file': <module 'ha_module.dev.file'>,
 'handle': <module 'ha_module.dev.handle'>,
 'tuple_': <module 'ha_module.dev.tuple_'>,
 'dict_': <module 'ha_module.dev.dict_'>,
 'win': <module 'ha_module.dev.win'>,
 'obj': <module 'ha_module.dev.obj'>,
 'img': <module 'ha_module.dev.img'>,
 'reg': <module 'ha_module.dev.reg'>,
 'xld': <module 'ha_module.dev.xld'>,
 'sys': <module 'ha_module.dev.sys'>,
 'img3d': <module 'ha_module.dev.img3d'>,
 'tool': <module 'ha_module.dev.tool'>,
 'use': <module 'ha_module.dev.use'>}

7.Halcon 封装的python包测试:

7.1.halcon官方python包安装:

pip install mvtec-halcon==20111

7.2.测试:

import halcon as ha 

Image = ha.read_image('pcb')
Width, Height = ha.get_image_size(Image)
print(Width[0], Height[0])
WindowHandle = ha.open_window(0, 0, Width[0]/2, Height[0]/2, 
                            father_window=0,mode='visible',machine='')

gray = ha.rgb1_to_gray(Image)
thres = ha.threshold(gray, 100, 200)

ha.disp_obj(Image, WindowHandle)
ha.wait_seconds(2)
ha.clear_window(WindowHandle)
ha.disp_obj(thres, WindowHandle)
ha.wait_seconds(5)

8.模块下载地址:

hapackage-windows10-64-v1.2.zip

halcon C++ 类及函数封装供python调用

HalconCpp python库

v1.1版本发布,增加图像几何学操作工具 dev.morphology,函数如下(在python端添加中文注释)

//腐蚀
HRegion erosion(const HRegion& region, Hlong mask_w, Hlong mask_h, Hlong iter = 1); //*奇数圆心坐标int,real 
HRegion erosion(const HRegion& region, double mask_r, Hlong iter = 1); //*奇数圆心坐标int,real 
HRegion erosion(const HRegion& region, const HRegion& SE, Hlong iter = 1);
HImage erosion(const HImage& grays, Hlong mask_w, Hlong mask_h, Hlong iter = 1);//maskWidth,maskHeight=11,11
HImage erosion(const HImage& grays, Hlong se_w, Hlong se_h, double se_max, const char* setype ="byte", Hlong iter = 1);
HImage erosion(const HImage& grays, double mask_w, double mask_h, const char* maskshape = "octagon", Hlong iter = 1);

//膨胀:
HRegion dilation(const HRegion& region, Hlong mask_w, Hlong mask_h, Hlong iter = 1); //*奇数圆心坐标int,real 
HRegion dilation(const HRegion& region, double mask_r, Hlong iter = 1); //*奇数圆心坐标int,real 
HRegion dilation(const HRegion& region, const HRegion& SE, Hlong iter = 1);
HImage dilation(const HImage& grays, Hlong mask_w, Hlong mask_h, Hlong iter = 1);//maskWidth,maskHeight=11,11
HImage dilation(const HImage& grays, Hlong se_w, Hlong se_h, double se_max, const char* setype ="byte", Hlong iter = 1);
HImage dilation(const HImage& grays, double mask_w, double mask_h, const char* maskshape = "octagon", Hlong iter = 1);

//开运算:
HRegion opening(const HRegion& region, Hlong mask_w, Hlong mask_h, Hlong iter = 1);//*奇数圆心坐标int,real 
HRegion opening(const HRegion& region, double mask_r, Hlong iter = 1); //*奇数圆心坐标int,real 
HRegion opening(const HRegion& region, const HRegion& SE, Hlong iter = 1);
HImage opening(const HImage& grays, Hlong mask_w, Hlong mask_h, Hlong iter = 1);//maskWidth,maskHeight=11,11
HImage opening(const HImage& grays, Hlong se_w, Hlong se_h, double se_max, const char* setype ="byte", Hlong iter = 1);
HImage opening(const HImage& grays, double mask_w, double mask_h, const char* maskshape = "octagon", Hlong iter = 1);

//闭运算:
HRegion closing(const HRegion& region, Hlong mask_w, Hlong mask_h, Hlong iter = 1);  //*奇数圆心坐标int,real 
HRegion closing(const HRegion& region, double mask_r, Hlong iter = 1); //*奇数圆心坐标int,real 
HRegion closing(const HRegion& region, const HRegion& SE, Hlong iter = 1);
HImage closing(const HImage& grays, Hlong mask_w, Hlong mask_h, Hlong iter = 1);//maskWidth,maskHeight=11,11
HImage closing(const HImage& grays, Hlong se_w, Hlong se_h, double se_max, const char* setype ="byte", Hlong iter = 1);
HImage closing(const HImage& grays, double mask_w, double mask_h, const char* maskshape = "octagon", Hlong iter = 1);

//*顶帽低帽击中击不中
HRegion top_hat(const HRegion& region, const HRegion& SE, Hlong iter = 1);
HImage top_hat(const HImage& grays, Hlong se_w=4, Hlong se_h=4, double se_max=0, const char* setype ="byte", Hlong iter = 1);

HRegion bot_hat(const HRegion& region, const HRegion& SE, Hlong iter = 1);
HImage bot_hat(const HImage& grays, Hlong se_w=4, Hlong se_h=4, double se_max=0, const char* setype ="byte", Hlong iter = 1);

HRegion hit_or_miss(const HRegion& region, const HRegion& SE1, const HRegion& SE2, Hlong x_referencepoint=0, Hlong y_referencepoint=0, Hlong iter = 1);


HRegion boundary(HRegion regs, const char* boundtype = "inner");//边界提取
HRegion fill_up(HRegion regs, const char* regsfeatures = "", double fmin = 1, double fmax = 100);//空洞填充
HRegion skeleton(HRegion regs);//骨架提取
HRegion skeleton_junctions(HRegion regs, HRegion* juncpoints);//获取骨架区域的端点交叉点

2021/6/25 4:33 v1.2版本发布

dev.tool.enhancement添加图像增强函数 及中文注释,函数内容如下

//线性灰度变换-增强图像对比度
HImage emphasize(HImage imgs, Hlong lowpass_mask_w = 7, Hlong lowpass_mask_h = 7, double factor = 1);
HImage scale_image(HImage grays, double mult = -1, double add = -1);

//非线性变换
HImage log_image(HImage imgs, const char* base = "e");
HImage pow_image(HImage imgs, double exponent = 2);

//直方图
HRegion gen_region_histo(HImage gray, Hlong cx = 255, Hlong cy = 255, Hlong scale = 1);
HImage equ_histo_image(HImage grays);//直方图均衡
HImage illuminate(HImage imgs, Hlong mask_w, Hlong mask_h, double factor = 0.7);//聚光灯:增强对比度

//图像平滑去噪
HImage mean_image(HImage imgs, Hlong mask_w = 9, Hlong mask_h = 9);//均值滤波平滑图像
HImage median_image(HImage imgs, const char* masktype = "circle", Hlong mask_r = 1, const char* margin = "mirrored");
HImage median_image(HImage imgs, Hlong mask_r = 1, const char* masktype = "circle", HTuple margin = "mirrored");
HImage median_image(HImage imgs, Hlong mask_w = 25, Hlong mask_h = 25, const char* margin = "mirrored");
HImage median_image(HImage imgs, Hlong mask_w = 25, Hlong mask_h = 25, HTuple margin = "mirrored");
HImage gauss_filter(HImage imgs, Hlong mask_size = 5);
HImage smooth_image(HImage imgs, double alpha = 0.5, const char* filter = "deriche2");
HImage bilateral_filter(HImage imgs, const HTuple& param_name, const HTuple& param_value, const HImage& img_joints, double sigma_spatial = 3,
	double sigma_range = 20.0);

//频域低通滤波
HImage fft_generic(HImage imgs, const char* direction = "to_freq", Hlong exponent = -1,
	const char* norm = "sqrt", const char* mode = "dc_center", const char* imgtype = "complex");

HImage gen_lowpass(HImage imgs, double f = 0.1, const char* norm = "none", const char* mode = "dc_center",
	Hlong width = 512, Hlong height = 512, const char* fftnorm = "sqrt");

//图像锐化
HImage gen_highpass(HImage imgs, double f = 0.1, const char* norm = "none", const char* mode = "dc_center",
	Hlong width = 512, Hlong height = 512, const char* fftnorm = "sqrt");

HImage shock_filter(HImage imgs, double theta = 0.5, Hlong iter = 10, double sigma = 1.0, const char* mode = "canny");

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值