C#联合halcon的窗体为什么不显示ROI

C#联合halcon的窗体为什么不显示ROI,第1张

C#联合halcon的窗体不显示ROI原因:说明了在各种编程语言如何 *** 作Halocn提含世核供的函数或者使用导出的类。

里面谈掘会附有程序员文返返档,说明了在各种编程语言如何 *** 作Halocn提供的函数或者使用导出的类,并且在Example中提供有关具体应用的例子。常用的方法是先在Halocn提供的集成开发环境中做实验。

编译:

程序直接编译成标准的二进制可执行形式,但C#的源程序并不是被编译成二进制可执行形式,而是一种中间语言(IL),类似于JAVA字节码,如果前面的Hello World程序被保存成一个文本文件并被命名为Hello.cs,它将被编译成命名Hello.exe的可执行程序。

C#程序不能直接编译成标准的二进制可执行形式,与Java类似,它被编译成为中间代码(Microsoft Intermediate Language)。

从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-1j>=0j--)

{//(注意tuple中图像数据的存放和VC中的差别)

for( i = 0i <(long)WidthGrayi++)

{

* (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=0i<heighti++)

{

for (j=0j<widthj++)

{

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


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

原文地址:https://54852.com/yw/12395016.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存