Halcon_VC相关

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何使用VC在Halcon中得到像素的信息

作者:支源,时间2007-3-16

Halcon的强大功能使我们省去很多图像处理(机器视觉)中的很多麻烦而又重复性的工作。但是,面向不同的应用,应该编写自己最核心的算法,从而达到最佳的处理效果;而且Halcon并不可能把各种情况都考虑进去。以下是我初步入门Halcon和VC的一点感触和想法,已经被实验证明了是正确的。

1,在VC中,使用Halcon打开图像文件,这里要注意read_image()和get_image_pointer1()指令被HDevelop翻译过来以后如下:

Hobject Image

HTuple Pointer, Type, Width, Height

get_image_pointer1(Image, &Pointer, &Type, &Width, &Height);

VC中如下声明:

Halcon::Hobject Image

Halcon::HTuple Pointer, Type, Width, Height

VC中也可以如下声明使用:

Hobject Image

Char lpcsType[MAX_STRING]

Hlong Pointer, Width, Height 或long Width, Height

(如果定义为HTuple Pointer ; Hlong Width, Height; 编译会出现错误;

使用Halcon::HTuple Pointer, Type, Width, Height的话,后续中需要

图像的高宽时,强制类型转换不可用;

当然Hlong可以换成long,推荐使用Hlong。)

get_image_pointer1(Image, &Pointer, lpcsType, &Width, &Height);

这里注意,在VC中如果get_image_pointer1( )中的字节类型使用tuple变量,那么Width和Height也必须使用tuple变量,否则编译时候容易出错误,至于原因是什么,可能halcon编译的时候需要各个参数的类型形式一致。

2,tuple类型的返回指针Pointer指向图像数据区域(如果是彩色则指向色彩的第一通道),图像的RGB色彩存放是同一种色彩信号最放在一起。注意Pointer所指向区域的大小比图像必须的色彩信息要大许多,这里可能是因为必须为tuple变量定义一定的类型限制,从而使用的空间变大了(由于不了解tuple的内部存储格式,所以不敢断定)。请看下面一段例子程序:使用Halcon,把彩色图像转化为灰度图像,然后使用Pointer指针得到灰度图像并显示,包括在VC窗口中进行显示部分。

using namespace Halcon;

char lpcsType[MAX_STRING];

Hlong PointerGray,WidthGray, HeightGray;

rgb1_to_gray(objImage, &objImageGray);

get_image_pointer1(objImage, &PointerGray, lpcsType, &WidthGray, &HeightGray);

BYTE * lpByte;

BYTE * ImageGray;

int bytewidth;

bytewidth = ((long) WidthGray * 3 + 3 ) / 4 * 4 ;

ImageGray = NULL ;

ImageGray = new BYTE[ bytewidth * (long) HeightGray];

lpByte = (BYTE *) PointerGray; //注意结合图像像素存储的类型进行定义int i,j;

for( j = (long)HeightGray-1; j>=0; j--)

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

for( i = 0; i < (long)WidthGray; i++)

{

* (ImageGray + j * bytewidth + i * 3 + 0 ) = * lpByte ;

* (ImageGray + j * bytewidth + i * 3 + 1 ) = * lpByte ;

* (ImageGray + 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= HeightGray;

RotateBmpInfo->bmiHeader.biWidth= WidthGray;

RotateBmpInfo->bmiHeader.biPlanes= 1;

RotateBmpInfo->bmiHeader.biBitCount= 24;

RotateBmpInfo->bmiHeader.biCompression= BI_RGB; RotateBmpInfo->bmiHeader.biSizeImage= HeightGray * 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 *ddc = m_pWnd->GetDC();

::StretchDIBits(

ddc->GetSafeHdc(),

WidthGray + 10,

HeightGray + 10,

WidthGray, //显示窗口宽度

HeightGray, //显示窗口高度

0,

0,

WidthGray, //图像宽度

HeightGray, //图像高度

ImageGray,

相关文档
最新文档