Halcon中外部函数在VC中是怎么调用的

作者&投稿:缪购 (若有异议请与网页底部的电邮联系)
如何在VC环境下使用Halcon库~

在VC环境下进行图像处理比在MATLAB下开发运算速度要快,但工作量要大的多,用MATLAB做图像处理,直接调用里面的相关函数就可以完成,而且比较直观,但满足不了在速度上要求比较高的场合。所以在VC环境下直接开发往往是首选,但由于VC只是一个开发环境,直接运用于图像处理的函数还得自己编写添加,所以往往很耗时。随着各类机器视觉软件的开发,各种机器视觉软件包也相继产生,HALCON就是一个比较强大的机器视觉软件,功能比较全,在HDevelop环境下开发比较容易,执行速度也较快。除此之外,HALCON也可以集成到其他开发环境下,这样可以节约底层开发时间,直接有效地运用它的函数库,可以产生很好的效果。下面就结合自己的经验,简单介绍一下在VC环境下如何使用HALCON库。
  在VC环境下进行图像处理,往往需要自己写图像处理的类,现在有一些前人写好的类,比如CDib类、DIBAPI类等等,因此可以直接“拿来主义”。HALCON库就相当于一个封装好的类,通过在VC下进行一些简单的设置,我们就可以使用其里面的函数了。下面是在VC环境下如何设置:

  1. 首先在project->settings.....中的Link属性页中添加halconcpp.lib;

  2. 其次在project->settings.....中的C/C++属性页中的Preprocessor中添加目录$(HALCONROOT)\include,$(HALCONROOT)\include\cpp;

  3. 然后在project->settings.....中的Link属性页中input下来菜单中添加路径$(HALCONROOT)\lib\i586-nt4;

  4. 最后当然是不要忘了在程序中添加类的头文件了:#i nclude "HalconCpp.h"

  上面的设置好了,一切OK了。下面就可以在程序中调用HDevelop中的函数了,比如图像增强函数emphasize(hImage, &hRotateImage, 7, 7, 2.0)等等。我们知道在HDevelop中通常图像是作为一个tuple变量,因此在VC中有必要进行变量转换,例如:

  针对灰度图像可以将图像数转换成一个Hobject变量:

  gen_image1(&hImage,"byte",WIDTH, HEIGHT,(long)m_pImageBuffer);

  针对彩色图像,可以分别取出R、G、B三个分量:

  ExtractRGB24Channels(m_pImageBuffer, m_pRed, m_pGreen,m_pBlue);

  然后在转换为Hobject变量:

  gen_image3(&hImage, "byte", width, height, (long )m_pRed, (long )m_pGreen, (long )m_pBlue);

  接下来就可以调用图像处理函数了,比如

  图像增强:emphasize(hImage, &hRotateImage, 7, 7, 2.0); //参数可以调整

  阈值化:bin_threshold(hImage,&hRotateImage);

  rgb1_to_gray(hImage,&hRotateImage);//转化为灰度图

  把处理完的变量转换成到一个buffer中,用于图像显示:get_image_pointer1(hRotateImage,(long *)&m_pImageBuffer,Type, &width1, &height1);

  但在调用HALCON库函数时也碰到了一些问题,比如在图像旋转中rotate_image(hImage, &hRotateImage, 90, "constant"); 将处理后的变量转换成

  get_image_pointer3(hRotateImage, (long *)&m_pRed, (long *)&m_pGreen, (long *)&m_pBlue, Type, &width1, &height1);

  ComposeRGB24(m_pRed, m_pGreen, m_pBlue, m_pImageBuffer);

  而执行过程中出现错误,get_image_pointer3这个函数报错,Undefined gray value in get_image_pointer3还需解决!

  边摸索边进步,在其他环境中的调用还需要试试,比如嵌入式操作系统等等。

从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->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

RotateBmpInfo->bmiHeader.biHeight = Height;

RotateBmpInfo->bmiHeader.biWidth = Width;

RotateBmpInfo->bmiHeader.biPlanes = 1;

RotateBmpInfo->bmiHeader.biBitCount = 24;

RotateBmpInfo->bmiHeader.biCompression = BI_RGB;

RotateBmpInfo->bmiHeader.biSizeImage = Height * bytewidth;

RotateBmpInfo->bmiHeader.biXPelsPerMeter= 0;

RotateBmpInfo->bmiHeader.biYPelsPerMeter= 0;

RotateBmpInfo->bmiHeader.biClrUsed = 0;

RotateBmpInfo->bmiHeader.biClrImportant = 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[i*width+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=120.000
int ii = aa[0].I(); //ii=120
long ll = aa[0].L(); //ll=120
Hlong hh = aa[0].L();//hh=120
long num = aa.Num(); //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 = aa.Num(); //num =2;
ii = aa[1].I(); //ii=230 //其他获取数据的方法与上面类似

项目>>项目属性>>配置属性>>链接器>>输入>>附加依赖项 里面添加test.lib 也可以用#pragma comment (lib,"test.lib") 使用 __declspec(dllimport) 调用外部库 还有就是调用LoadLibrary 在显式链接下,应用程序必须进行函数调用以在运行时显式加载。


眼睛干涩用什么眼药水好
干涩的原因有多种.如果是用眼过度的话建 议用珍视明(或者珍珠明目液).如果不是的话,那就不要乱用药,会负作用的. 还有滴药水时最好能躺着一小会儿,才能发挥药效.润洁一般是脏了才用的,像沙眼.

察布查尔锡伯自治县15889855676: Halcon中外部函数在VC中是怎么调用的 -
蒙娴医创: 项目>>项目属性>>配置属性>>链接器>>输入>>附加依赖项 里面添加test.lib 也可以用#pragma comment (lib,"test.lib") 使用 __declspec(dllimport) 调用外部库 还有就是调用LoadLibrary 在显式链接下,应用程序必须进行函数调用以在运行时显式加载.

察布查尔锡伯自治县15889855676: 如何在VC环境下使用Halcon库 -
蒙娴医创: 在VC环境下进行图像处理比在MATLAB下开发运算速度要快,但工作量要大的多,用MATLAB做图像处理,直接调用里面的相关函数就可以完成,而且比较直观,但满足不了在速度上要求比较高的场合.所以在VC环境下直接开发往往是首选,...

察布查尔锡伯自治县15889855676: 如何用C++调用halcon函数 (最好能详细点,谢谢) -
蒙娴医创: 用VC创建工程 1. 首先在project->settings.....中的Link属性页中添加halconcpp.lib; 2. 其次在project->settings.....中的C/C++属性页中的Preprocessor中添加目(HALCONROOT)\include,(HALCONROOT)\include\cpp; 然后加入头文件#include "HalconCpp.h" 最后加入语句#pragma comment(lib,"halconcpp.lib") 就可以使用halcon的库了

察布查尔锡伯自治县15889855676: vs中如何用c++语言调用halcon -
蒙娴医创: 通过小猫拉屎对你的伟大支持来调用小猫吃饭来驱动小猫解手

察布查尔锡伯自治县15889855676: VC++线程函数内怎么调用外部函数 -
蒙娴医创: 1.把外部函数做成静态函数,就可以直接调用了.2.把外部函数所在的对象通过线程函数参数传到线程里面来,这样线程里可以使用此对象及其函数了.

察布查尔锡伯自治县15889855676: 如何在VisualStudio10.0中设置Halcon机器视觉 -
蒙娴医创: 开始做Halcon的上位机,选用Visual Studio 10.0平台. 具体设置以C#,VB为例子,如下: C# 第一步: 01.新建项目 02.选择Visual C# 03.修改文件名 04.确认 第二步: 01.选择“解决方案资源管理器” 02.选择“引用”,右键 03.选择“添加引用...

察布查尔锡伯自治县15889855676: c语言中外部函数是什么意思 -
蒙娴医创: 有两种理解.(1)库函数是C语言的内部函数或自带函数,外部函数即程序员自定函数. (2)凡加写了extern 的函数是外部函数. 第一种理解好懂: C语言的内部函数指的是C语言自带的函数,无论是动态链接的或静态链接的. 这些函数通过C语言...

察布查尔锡伯自治县15889855676: 如何在vc++中调用halcon的hdev档案 -
蒙娴医创: vc使用halcon 使用hdevelop导出halcon程序的c++代码之后,比如 [cpp] view plaincopyread_image (image, 'C:/Documents and Settings/Administrator/桌面/vision/IMG_20121015_091436.bmp') rgb1_to_gray (image, GrayImage) dev_set_color('...

察布查尔锡伯自治县15889855676: c 中调用外部函数怎么调用 -
蒙娴医创: 先定义,再调用,在不同的文件时,先写头文件

察布查尔锡伯自治县15889855676: 在C语言中,内部函数和外部函数的区别? -
蒙娴医创: 内部函数跟外部函数的区别在于:一个文件中定义的函数能否被其它文件调用.能被调用的函数在前面加extern(一般省略),而不能被调用的加static(不能省略),通常函数本质上是全局的,也就是外部的可调用的. 我们通常调用的#include本质上就是一些外部函数的集合,由于在一个文件中的函数要调用另外一个文件的函数,要求在开始声明一下,为了省略这些声明,我们引用include命令.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网