如何用C++调用halcon函数 (最好能详细点,谢谢)

如何用C++调用halcon函数 (最好能详细点,谢谢),第1张

从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 //其他获取数据的方法与上面类似

Visionpro的优势

1、在美国有着更大的市场

2、对于无编程基础的人员来说更加简单易用

3、更低的系统软件开发lisence花费

4、具有美国邮政的条码读取工具

5、QuickBuild环境允许无编程基础的人更快的开发应用程序

15 Visionpro的劣势

1、有限的3D机器视觉算法

2、更低的运行时lisence花费

3、支持的图像位深度少

4、没有GPU处理

5、很少的图像处理算法工具(例如缺少FFT)

6、QuickBuild环境下,想要开发出更高级的应用程序会增加不必要的复杂性,与其这样,您最好在NET的环境中去开发您的程序,这样就避免QuickBuild环境带来的不便

二、视觉处理性能

21 2D模式匹配

对于8位灰度图像而言,Visionpro的PatMax和Halcon的几何模式匹配算法具有几乎一样的2D模式匹配性能。Halcon的模式匹配也可以用在16位的图像上。Visionpro模式匹配只能用于8位图像。

22 1D和2D形态学

Halcon最高支持32位深度的处理;Visionpro支持基本的8位处理,仅有一小部分工具支持16位的图像。

23 BLOB分析

Halcon的blob工具更多、更灵活、更强大;Visionpro的工具相当的基本,非常适用于典型的应用

24 Imageprocessing filters

halcon拥有不少于100个图像处理滤波器包括FFT,并且支持更高的图像位深度,大多数Halcon滤波器可以运行在32位深度的图像上。Visionpro只有一小部分图像处理滤波器,大部分只支持8位,一些支持16位。Visionpro缺少FFT算法,而该算法在缺陷检测的应用中可以把固定的纹理特征移除。

25 ImageClassifier Tools

Halcon支持相当多的识别以及检测应用的预定义的分类器工具,halcon支持多层感知神经网络分类器,支持向量机分类器,高斯混合模型分类器,N维盒子以及非正态分布数据集领域的聚类。K-最近邻分类器,自动特征选择。

Cognex有一个"Inspection Designer",或者CogDataAnalysis工具,可以允许您根据程序的结果创建一个用户分类器。没有预定义的分类器工具。有一个追加的视觉模块称作VisionPro Surface-其训练算法根据人类视觉提供的线索训练每个种类的缺陷

26 OCRand OCV

OCV比OCR有一个更加易用的接口,使用之前需要训练。Halocn有一个预训练的工业字符库,因此使用时无需训练,库里面的字体的特征已经很完美了。

27 1Dand 2D Barcode tools

1D和2D有同样的性能,Cognex在条码评分等级的数量上有优势并且有解码美国邮政条码的能力

28 图像采集和特征

Visionpro通过他们的图像采集供应商提供对相机的支持。相机供应商或者cognex必须创建一个用户相机配置文件-例如CCF。Visionpro支持通用的Gige视觉系统的GeniCam,但是奇怪的是,不支持其他框架下的通用geniCam比如Cameralink,CoaXpress,或者USB3。

Halcon支持所有的图像采集标准-gige ,usb3,genicam,gentl,directshow,twain等等。Halocn也具有从非高清相机创建高清图像的能力-一般情况下,一个典型的basler gige相机,运用halcon的算法可以获得超过100DB动态范围的高清图像。

以上就是关于如何用C++调用halcon函数 (最好能详细点,谢谢)全部的内容,包括:如何用C++调用halcon函数 (最好能详细点,谢谢)、Visionpor24位图片转Halcon图片格式,为什么图片会扭曲、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10208630.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存