如何使用VC在Halcon中得到像素的信息_第1页
如何使用VC在Halcon中得到像素的信息_第2页
如何使用VC在Halcon中得到像素的信息_第3页
如何使用VC在Halcon中得到像素的信息_第4页
如何使用VC在Halcon中得到像素的信息_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如何使用VC在Halcon中得到像素的信息 Halcon的强大功能使我们省去很多图像处理(机器视觉)中的很多麻烦而又重复性的工作。但是,面向不同的应用,应该编写自己最核心的算法,从而达到最佳的处理效果;而且Halcon并不可能把各种情况都考虑进去。以下是我初步入门Halcon和VC的一点感触和想法,已经被实验证明了是正确的。1,在VC中,使用Halcon打开图像文件,这里要注意read_image()和get_image_pointer1()指令被HDevelop翻译过来以后如下:HobjectImageHTuplePointer,Type,Width,Heightget_image_pointer1(Image,&Pointer,&Type,&Width,&Height);VC中如下声明:Halcon::HobjectImageHalcon::HTuplePointer,Type,Width,HeightVC中也可以如下声明使用:HobjectImageCharlpcsType[MAX_STRING]HlongPointer,Width,Height或longWidth,Height(如果定义为HTuplePointer;HlongWidth,Height;编译会出现错误;使用Halcon::HTuplePointer,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窗口中进行显示部分。usingnamespaceHalcon;charlpcsType[MAX_STRING];HlongPointerGray,WidthGray,HeightGray;rgb1_to_gray(objImage,&objImageGray);get_image_pointer1(objImage,&PointerGray,lpcsType,&WidthGray,&HeightGray);BYTE*lpByte;BYTE*ImageGray;intbytewidth;bytewidth=((long)WidthGray*3+3)/4*4;ImageGray=NULL;ImageGray=newBYTE[bytewidth*(long)HeightGray];lpByte=(BYTE*)PointerGray; //注意结合图像像素存储的类型进行定义inti,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=newBYTE[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, RotateBmpInfo, DIB_RGB_COLORS, SRCCOPY);m_pWnd->ReleaseDC(ddc) ;delete[]ImageGray;delete[]bitBuffer;后来实验发现,如果按照HDevelop默认翻译过来的规则写C++程序,如下:Halcon::HobjectImageHalcon::HTuplePointer,Type,Width,Height操作get_image_pointer1(objImage,&Pointer,&Type,&Width,&Height)执行以后,可以使用Width[0],Height[0]进行数据访问,但是命令:lpByte=(BYTE*)PointerGray; 不能够执行,作者也在进一步弄清楚如何解决这个问题,请大家给点帮助。今天在调试程序中发现一个问题,再次让我感受Halcon内存管理的神秘,嘿嘿,说说问题吧HlongPointerGray,PointerRed,PointerGreen,PointerBlue;HlongWidthGray,HeightGray;get_image_pointer1(objImageGray,&PointerGray,lpcsType,&WidthGray,&HeightGray);编译可以通过,但是HlongPointerGray,PointerRed,PointerGreen,PointerBlue;HlongWidthGray,HeightGray;get_image_pointer3(objImage,&PointerRed,&PointerGreen,&PointerBlue,&lpcsType,&WidthGray,&HeightGray);编译就通不过,大家可以试一下如果需要,可以使用decompose3(objImage,&objImageRed,&objImageGreen,&objImageGray);然后使用函数get_image_pointer1()得到指针我个人认为是Halcon的变量类型讲究统一,如果是Tuple都是Tuple,我个人认为PointerRed,PointerGreen,PointerBlue可能是Tuple变量中的三个量,而HeightGray不是按照Tuple变量进行管理的,纯属个人猜测,大家有想法的给我回,或发邮件zhiyuanshiji@或者zhiyuan_maiker@1.从Halcon到VC++read_image(&Image,"文件名");//读入的为灰度图像//获取图像指针,注意输出变量的类型charlpcsType[MAX_STRING];HlongPointer,Width,Height;get_image_pointer1(Image,&Pointer,lpcsType,&Width,&Height);//Halcon与VC++中的图像之间,存在着上下翻转BYTE*lpByte;BYTE*ImageG;intbytewidth;bytewidth=((long)Width*3+3)/4*4;ImageG=NULL;ImageG=newBYTE[bytewidth*(long)Height];lpByte=(BYTE*)Pointer;//注意结合图像像素存储的类型进行定义inti,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=newBYTE[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++到Halconunsignedchar*Pointer;intwidth,height;Pointer=newunsignedchar[width*height];inti,j;for(i=0;i<height;i++){for(j=0;j<width;j++){Pointer=j%255;}}HobjectImage;gen_image1_extern(&Image,"byte",(HTuple)width,(HTuple)height,(long)Pointer,NULL);注:a)gen_image1_extern函数中的变量width,height必须为HTuple类型,Pointer指针为unsignedchar类型,输入时转换为long型。b)width,height必须与Pointer指向的图像数据的长宽一致。c)Pointer指针在gen_image1_extern函数调用之前分配了内存,之后不要马上释放,否则会出错。应该在确保不再使用Image变量之后再释放。halcon内部会自动释放Image,感觉没有释放Pointer(还需要进一步验证)。d)显示图像时,可能存在着图像的上下翻转,可以按照1中的方法,将图像数据翻转后再调用gen_image1_extern,或者使用halcon中的函数mirror_image()进行翻转。3.在VC界面中建立图像窗口HlonglWWindowID;HTupleWindowHandle;lWWindowID=(Hlong)m_hWnd;//要显示图片的控件的句柄set_window_attr("border_widt

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论