
从Halcon到VC++
read_image(&Image,"文件名");//读入的为灰度图像
//获取图像指针,注意输出变量的类型
char lpcsType[MAX_STRING];
Hlong Pointer,Width, Height;
get_image_pointer1(Image, &Pointer, lpcsType, &Width, &Height);
//Halcon与VC++中的图像之间,存在着上下翻转
BYTE lpByte;
BYTE ImageG;
int bytewidth;
bytewidth = ((long) Width 3 + 3 ) / 4 4 ;
ImageG = NULL ;
ImageG = new BYTE[ bytewidth (long) Height ];
lpByte = (BYTE ) Pointer; //注意结合图像像素存储的类型进行定义
int i,j;
for( j = (long)Height-1; j>=0; j--)
{ //(注意tuple中图像数据的存放和VC中的差别)
for( i = 0; i < (long)WidthGray; i++)
{
(ImageG + j bytewidth + i 3 + 0 ) = lpByte ;
(ImageG + j bytewidth + i 3 + 1 ) = lpByte ;
(ImageG + j bytewidth + i 3 + 2 ) = lpByte ;
lpByte++;
}
}
BITMAPINFO RotateBmpInfo;
BYTE bitBuffer;
bitBuffer = NULL;
bitBuffer = new BYTE[sizeof(BITMAPINFO)];
RotateBmpInfo = (BITMAPINFO )bitBuffer;
RotateBmpInfo->bmiHeaderbiSize = sizeof(BITMAPINFOHEADER);
RotateBmpInfo->bmiHeaderbiHeight = Height;
RotateBmpInfo->bmiHeaderbiWidth = Width;
RotateBmpInfo->bmiHeaderbiPlanes = 1;
RotateBmpInfo->bmiHeaderbiBitCount = 24;
RotateBmpInfo->bmiHeaderbiCompression = BI_RGB;
RotateBmpInfo->bmiHeaderbiSizeImage = Height bytewidth;
RotateBmpInfo->bmiHeaderbiXPelsPerMeter= 0;
RotateBmpInfo->bmiHeaderbiYPelsPerMeter= 0;
RotateBmpInfo->bmiHeaderbiClrUsed = 0;
RotateBmpInfo->bmiHeaderbiClrImportant = 0;
CWnd m_pWnd ;
m_pWnd = AfxGetApp()->GetMainWnd();
CDC pDC = m_pWnd->GetDC();
::StretchDIBits(
pDC->GetSafeHdc(),
Width + 10,
Height + 10,
Width, //显示窗口宽度
Height, //显示窗口高度
0,
0,
Width, //图像宽度
Height, //图像高度
ImageG,
RotateBmpInfo,
DIB_RGB_COLORS,
SRCCOPY);
m_pWnd->ReleaseDC(pDC);
delete [] ImageG ;
delete [] bitBuffer ;
2 从VC++到Halcon
unsigned char Pointer;
int width, height;
Pointer = new unsigned char[width height];
int i, j;
for (i=0; i<height; i++)
{
for (j=0; j<width; j++)
{
Pointer[iwidth+j] = j % 255;
}
}
Hobject Image;
gen_image1_extern(&Image, "byte", (HTuple)width, (HTuple)height, (long)Pointer, NULL);
注:
a) gen_image1_extern函数中的变量width,height必须为HTuple类型,Pointer指针为unsigned char类型,输入时转换为long型。
b) width, height必须与Pointer指向的图像数据的长宽一致。
c) Pointer指针在gen_image1_extern函数调用之前分配了内存,之后不要马上释放,否则会出错。应该在确保不再使用Image变量之后再释放。halcon内部会自动释放Image,感觉没有释放Pointer(还需要进一步验证)。
d) 显示图像时,可能存在着图像的上下翻转,可以按照1中的方法,将图像数据翻转后再调用gen_image1_extern,或者使用halcon中的函数mirror_image()进行翻转。
3 在VC界面中建立图像窗口
Hlong lWWindowID;
HTuple WindowHandle;
lWWindowID = (Hlong)m_hWnd; //要显示的控件的句柄
set_window_attr("border_width",0); //设置窗口属性
set_window_attr("background_color","light gray"); //设置窗口背景颜色
set_check("~father");
open_window(0,0,m_Width,m_Height,lWWindowID,"visible","",&WindowHandle); //创建窗口
set_check("father");
set_part(WindowHandle,0,0,m_Width-1,m_Height-1); //对窗口上显示图像和区域的一些设置
set_draw(WindowHandle,"margin");
set_colored(WindowHandle,12);
disp_obj(Image,WindowHandle); //显示图像Image(Hobject类型)
4 从HTuple类型读取数据
//HTuple有一个元素
HTuple aa = 120;
double dd = aa[0]D(); // dd=120000
int ii = aa[0]I(); //ii=120
long ll = aa[0]L(); //ll=120
Hlong hh = aa[0]L();//hh=120
long num = aaNum(); //num =1;
aa = "120"; //HTuple为字符串时,如果赋值不是字符串,不能调用S()函数
const char cc;
cc = aa[0]S(); //cc[0]='1',cc[1]='2',cc[2]='0'
//当aa为多元素的数组时
aa[1] = 230;
num = aaNum(); //num =2;
ii = aa[1]I(); //ii=230 //其他获取数据的方法与上面类似
1、安装Firepackage驱动,该驱动是halcon的1394驱动,安装完毕后,单机安装程序后的installdriverexe,为1394卡安装驱动
2、在halcon中加入如下代码,是通过修改相机的pan参数来获取左右图像的,理想的方法是通过raw16,format7 mod3的设置来获取,但暂时还没有找到实现方式,只能暂时这样。
open_framegrabber ('1394IIDC', 1, 1, 0, 0, 0, 0, 'progressive', 8, 'rgb', -1, 'false', 'default', '00B09D0100AD58AC', 0, -1, AcqHandle)
set_framegrabber_param (AcqHandle, 'bits_per_channel', 8)
set_framegrabber_param (AcqHandle, 'color_space', 'rgb')
set_framegrabber_param (AcqHandle, 'camera_type', '7:0:1')
set_framegrabber_param (AcqHandle, 'horizontal_resolution', 1024)
set_framegrabber_param (AcqHandle, 'horizontal_offset', 0)
set_framegrabber_param (AcqHandle, 'vertical_offset', 0)
set_framegrabber_param (AcqHandle, 'start_row', 0)
grab_image_start (AcqHandle, -1)
while (true)
set_framegrabber_param (AcqHandle, 'pan', 1)
grab_image_async (Image, AcqHandle, -1)
set_framegrabber_param (AcqHandle, 'pan', 0)
grab_image_async (Image1, AcqHandle, -1)
Do something
endwhile
close_framegrabber (AcqHandle)
前面总结了利用HALCON进行模板匹配的一些方法,讨论了利用物体形状的轮廓进行匹配的步骤和如何来优化匹配的速度,提高匹配的精度和速度,当然这两者之间本身也存在着制约,而在这两者之间找到一个适合自己要求的结合点,正是我们要研究和实验的。模板匹配并不是单纯的一个任务,它是一些其他工作的一个必备环节,比如物体识别、对象跟踪、检验产品、零件统计等等一些机器视觉应用。在很多情况下,模板匹配是个不错的选择。在前面总结模板匹配方法的基础上,利用HALCON做了一些视频对象跟踪的实验,并多次试验来调整程序参数优化跟踪过程,采用标准视频进行测试,将这些方法作了如下总结。
首先来看看HALOCN中的帧采集器(FrameGrabber),HDevelop提供这样一个函数来开启你采用的帧采集器(这里我的理解就是图像采集卡或工业摄像机)open_framegrabber(),这个函数中指定了HALCON目前支持的一些帧采集器的文件参数,主要有'BARRACUDA', 'BaumerFCAM', 'BCAM1394', 'BitFlow', 'DahengCAM', 'DahengFG', 'DFG-BW', 'DFG-LC', 'DirectFile', 'DirectShow', 'DT315x', 'DT3162', 'File', 'FireGrab', 'FirePackage', 'FlashBus', 'FlashBusMX', 'Ginga++', 'GingaDG', 'IDS', 'INSPECTA', 'Leutron', 'MatrixVision', 'MeteorII', 'mEnable3', 'MultiCam', 'Opteon', 'p3i2', 'p3i4', 'PT1000CL', 'PX', 'PXC', 'PXD', 'PXR', 'SaperaLT', 'TAG', 'TWAIN', 'uEye';除此之外,在官方网站上也在逐步推出新支持的一些采集卡,比如近期推出的支持大恒的DahengCAM的USB20接口(更多的信息请访问>
1、灰度转换-->二值化(硬阈值或者动态阈值处理)-->连通区域-->抠图(reduce_domin)
2、创建一个与原始图像一样大小纯黑色的图像gen_image_const()
3、将抠图得到的目标图像与创建的纯黑图像拼接,union1()
4、运用for循环,遍历每个坐标,获取灰度值(get_grayval),将灰度值等于0的剔除,剩下的就是目标灰度值与对应的坐标。
比价原始的办法,不知道是否有更简单的方法
可以用Halcon建立深度学习模型,并用到实际项目中。
流程大概是使用免费的 Halcon Deeplearing Label Tool制作模型后,导出成 hdl 文件,并在应用程序中用 ApplyDlClassifier 应用模型。
经过测试, ApplyDlClassifer 在第一次运行时,无论数据集有多大,执行时间在500ms左右(AMD 5800X + Nvidia P2200),能够明显感受到卡顿,而在第二次运行时,就感受不到卡顿。所以我考虑,在应用程序启动时,使用线程对模型进行预热。
预热听着高深,其实就是读取模型( ReadDlClassifier ) 并送入一张空白图。
下面演示我的做法:
21 封装一个自己的Application类
22 我将Halcon算子封装成一个单例类,并使用 getAlgorithmGlobalData 获得这个单例对象。 slotDoModelWarmUp 是这个单例类一个槽函数。
23 在 slotDoModelWarmUp 中开多线程,对模型进行预热。
我将Halcon深度学习算子要用到的变量封装成一个 context 结构体,放在单例类中。为了节约开销,我使用引用,直接获取这个单例对象。这样,在向线程中传参数时,需要一个 std::ref 。
线程函数如下:
classifierHandle 是一个引用变量,这使得我可以直接 *** 控单例类中的数据成员,而不是使用拷贝。
经过测试,在AMD 5800X + Nvidia P2200下,推理速度达到了1166ms。
养成良好的查资料习惯,可以实现事半功倍。
在Halcon12中,有set_font和set_display_font两个算子,其中set_display_font是本地函数形式,所以最终的实现算子为set_font
按照不同的系统环境下,使用方法略有不同:
不同的系统下使用的方法不同,原本以为比较简单,直接按照文档的example来设定就行,但是win下的字体比较多,这种方法可行,其他的系统下未必有指定的Font类型,所以我在Linux下一直提示的Font类型错误;
再翻一下最新版Halcon20版本的文档
新版介绍简单了很多,如果只修改字体,直接使用set_system('default_font',Font)设置默认字体就行,这里还进行提示,根据不同的系统,获取支持的字体进行设置,最后给出了比较简洁的example做参考。
根据之前的帮助文档,可以在Qt下实现字体修改
由于在Linux下设置了好几种字体都显示错误,所以直接使用第二种方法,获取Linux支持的字体进行设置。
根据上述方法设定的效果如下
Halcon窗口显示文字字体修改
以上就是关于如何用C++调用halcon函数 (最好能详细点,谢谢)全部的内容,包括:如何用C++调用halcon函数 (最好能详细点,谢谢)、Halcon检测不到Point Grey三目立体视觉相机,哪位大神提供一个解决的思路,深入交流一下。、基于HALCON的视频对象分割及跟踪方法总结等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)