最近在做影像项目,发现在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");