从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 //其他获取数据的方法与上面类似
image file是图像文件。
BMP、PCX、GIF、TIF和JPG格式的文件是位图文件,文件的扩展名指明了图像文件的标准。每种位图文件都按照不同的标准存储图像信息,这些标准是为某些特定的目的制定的。GIF标准设计,用来把尽可能多的图像信息压缩到尽可能小的空间中。ß位图文件有两种存储像素数据的格式。16777216色(真彩色)的图像,一个像素的颜色可以用24位数据表示。然而,256色的图像可以用调色板对颜色的信息进行编码,一个像素的值对应的是调色板的索引,而不是直接对应一个像素的颜色,调色板的索引映射为像素的颜色。这样通过减少描述像素的字节数可以大大减少文件的长度。
大部分位图文件格式是按行格式来存储像素值的。如果一幅图像的尺寸是100100,并且像素是八位值描述的,那么文件中图形数据的第一个100字节存储图像的第一行的像素值,第二个100字节存储图像的第二行,以此类推。有的位图格式的行排列顺序则恰恰相反,BMP文件是先存储图像的最下面一行,然后依次向上存储。ß每种位图文件格式的图形数据和非图形数据的结构是不同的。以一百万个像素,256种颜色的BMP文件在电脑上的存储为例。这个文件包括一个十四字节的文件首部,一个四十字节的信息首部,一个1024字节的颜色表,一兆字节的位图数据。文件首部的前两个字节由字符BM组成,还包括了文件长度和位图数据在文件中的起始位置。文件的信息首部包含了图像的高、宽、颜色数等非图形数据。这个图像共有一百万个像素,一个像素需要八位的颜色信息,文件的这一部分的长度是一百万个字节,字节排放的顺序是自左到右从图像的最下面那行开始,这个文件的总大小是1001078字节。
最大颜色数不同的BMP文件的格式将有细微的差异。
希望我能帮助你解疑释惑。
以上就是关于如何用C++调用halcon函数 (最好能详细点,谢谢)全部的内容,包括:如何用C++调用halcon函数 (最好能详细点,谢谢)、halcon image也可以当region么、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)