利用相机SDK采相转换至HImage

来源于http://blog.sina.com.cn/s/blog_d40acd530102xndm.html

Halcon采相功能非常强大,基本支持各大品牌以及各个通信接口的相机,并且Halcon提供为相机厂商提供了制作Halcon相机接口库的办法,总之Halcon基本可以直接连接所有工业相机。

但是Halcon连接相机采相存在两个问题:一是相机参数可调整范围有限,不如相机的SDK提供的可调参数多;二是相机SDK提供了采相回调函数,采相实时性更好(Halcon下也可回调,没研究过)。因此大部分机器视觉工程师仍然采用相机SDK采相。

使用相机SDK采相,必然面临的问题就是如何将图像在内存中直接转换为HImage格式。今天我们将学习如何将内存中的图像转化为HImage。

首先,简单介绍三个算子;然后,纵向比较三个算子不同点;最后,举例说明算子的用法。

gen_image1( : Image : Type, Width, Height, PixelPointer : )

从像素指针创建图像,即得到像素的内存指针(PixelPointer),已知图像的类型(Type)、尺寸(Width、Height)就可将其转化为HImage。

gen_image3(: ImageRGB : Type, Width, Height, PixelPointerRed, PixelPointerGreen, PixelPointerBlue : )

 从像素指针创建图像,即得到像素的RGB三通道内存指针(PixelPointerRed、PixelPointerGreen、PixelPointerBlue),已知图像的类型(Type)、尺寸(Width、Height)就可将其转化为HImage。

gen_image_interleaved( : ImageRGB : PixelPointer, ColorFormat, OriginalWidth, OriginalHeight, Alignment, Type, ImageWidth, ImageHeight, StartRow,StartColumn, BitsPerChannel, BitShift : )

 从像素指针创建图像,即得到像素的内存指针(PixelPointer),已知图像的类型(ColorFormat)、尺寸(ImageWidth、ImageHeight)就可将其转化为HImage。

gen_image1适合于单通道图像转化,gen_image3转化需要分别知道RGB三个通道的指针,gen_image_interleaved转化需要知道图像的内存的总指针以及图像的格式。

因此gen_image1适合单通道灰度图转化,gen_image3适合RGB三通道内存分别存放的相机转化,gen_image_interleaved基本适合所有格式的转化,操作简单且可以进行ROI操作,因为大部分相机采相为1个总指针,所以gen_image_interleaved适用范围非常广,所以我们首先结合Halcon的例子来展示一下这个算子的魅力。

*1.读取图像

read_image (Image, 'lena')

*2.将图像分离为三通道后合并得到图像总指针(这一步是一个外部函数,大家不必关心,因为相机SDK基本可以直接拿到这个指针)

rgb3_to_interleaved (Image,ImageInterleaved)

get_image_pointer1 (ImageInterleaved,Pointer, TypeRGB, Width, Height)

dev_close_window ()

dev_open_window (0, 0, Width / 3, Height,'black', WindowHandle)

dev_set_part (0, 0, Height, Width / 3)

*3图像由内存中转化为HImage

gen_image_interleaved (BImageRGB1, Pointer,'rgb', Width / 3, Height, -1, 'byte', 0, 0, 0, 0, -1, 0)

stop ()

*4图像由内存中转化为HImage,并进行ROI

gen_image_interleaved (BImageRGB2, Pointer,'rgb', Width / 3, Height, -1, 'byte', Width / 6, Height / 2, Height / 3, Width/ 12, -1, 0)

stop ()

*5图像格式有RGB定义为BGR,展示这个功能主要是想提醒小伙伴,如果转化火来颜色不对,可能是由于格式选择错误

gen_image_interleaved (BImageBGR1, Pointer,'bgr', Width / 3, Height, -1, 'byte', 0, 0, 0, 0, -1, 0)

接下来我们将结合度申相机SDK来展示如何从将图像由内存转化至HImage

首先我们来看度申相机SDK的采相回调函数如下:

  public  int _dvpStreamCallback (uint handle, dvpStreamEvent _event, IntPtr pContext, refdvpFrame refFrame, IntPtr pBuffer)

handle——相机句柄

refFrame——帧信息

pBuffer——数据内存指针

那么数据内存指针就有了,接着我们查看帧信息中有什么,打开类定义如下

    publicstructdvpFrame

       {

        [Description("是否水平翻转")]

        publicbyte bFlipHorizontalState;

        [Description("是否垂直翻转")]

        publicbyte bFlipVerticalState;

        [Description("位宽")]

        publicdvpBits bits;

        [Description("是否逆时针旋转")]

        publicbyte bRotateOpposite;

        [Description("是否旋转90度")]

        publicbyte bRotateState;

        [Description("模拟增益")]

        publicfloat fAGain;

        [Description("曝光时间(微秒)")]

        publicdouble fExposure;

        [Description("格式")]

        publicdvpImageFormat format;

        [Description("高度")]

        publicint iHeight;

        [Description("宽度")]

        publicint iWidth;

        [Description("第一个像素点的位置")]

        publicdvpFirstPosition position;

        [Description("保留字节")]

        publicuint[] reserved;

        [Description("字节数")]

        publicuint uBytes;

        [Description("帧编号")]

        publiculong uFrameID;

        [Description("时间戳")]

        publiculong uTimestamp;

       }

gen_image_interleaved(: ImageRGB : PixelPointer, ColorFormat, OriginalWidth, OriginalHeight, Alignment, Type, ImageWidth, ImageHeight, StartRow,StartColumn, BitsPerChannel, BitShift : )

从帧信息中可以得到图像格式、位数、图像宽度、图像高度,于是gen_image_interleaved的必备参数全部得到。

写到C#格式下

public  int _dvpStreamCallback0(uint handle, dvpStreamEvent _event, IntPtr pContext, refdvpFrame refFrame, IntPtr pBuffer)

    {          

     if (ho_Img != null)

       {

         ho_Img.Dispose();//释放HIamge资源

       }

     else

      {

       HOperatorSet.GenEmptyObj(out ho_Img);//初始化HImage

      }

     if ((long)pBuffer != 0)

     {

      HOperatorSet.GenImageInterleaved(out ho_Img, pBuffer, "bgr", refFrame.iWidth, refFrame.iHeight, -1, "byte", refFrame.iWidth,refFrame.iHeight, 0, 0, -1, 0);//格式转换

      }

      GC.GetTotalMemory(true);//需要实时将图像的内存回收掉,防止占用过多CPU资源控制系统垃圾回收器,专制内存不足    

}

 

参考这个相机SDK采相转HImage的例子,各位小伙伴应该学会如何使用相机SDK再Halcon中采相了吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java项目启动tomcat没报错,然后页面报404无法找到,重新编译后,出现以下状态...

严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListenerorg.springframework.beans.factory.BeanCreationException: Error creating bean with name MapperScannerConfigurer defined in c…

3.12PMP试题每日一题

哪一个是组织过程资产的事例:A、项目管理信息系统B、配置管理姿势库C、配置管理系统D、共享系统和云计算 作者:Tracy19890201(同微信号)转载于:https://blog.51cto.com/13554215/2361982

相机与镜头常识

1.焦距(FocalLength)   焦距是从镜头的中心点到胶平面上所形成的清晰影像之间的距离。焦距的大小决定着视角的大小,焦距数值小,视角大,所观察的范围也大;焦距数值大,视角小,观察范…

vsftpd的安装

简介 vsftpd是一个免费的开源的ftp服务器软件; 特点 小巧轻快,安全易用,支持虚拟用户、支持带宽限制等功能; 安装 执行 yum -y install vsftpd 创建虚拟用户(注意权限问题(chmod),这个要根据情况来定) 选择在根或用户目…

halcon模板匹配测试流程

*1、创建模板(获取要做模板区域的图像) *create_shape_model (ImageReduced, 4, 0, rad(360), rad(1), none, use_polarity, 30, 10, ModelID) *2、获取形状模型---第二步(为了显示找的的模板) *get_shape_model_contours (…

企业云存储:为什么中大型企业偏爱自建私有云?

“上云?我们通常自建企业私有云。”9102年了,在云存储服务的选择上,中大型企业基本步调一致,统筹规划自建企业私有云。为什么中大型企业都偏爱自建企业私有云?一、长久的成本考量从账面上看,通常私有云初期…

ETL作业调度软件TASKCTL自定义扩展作业类型插件安装

TASKCTL批量自动化调度作业类型扩展插件的安装方法如下几种: 1、 直接覆盖法 直接覆盖法的意思就是将自定义扩展好的插件,通常是一个shell脚本,上传至后台调度核心服务上,然后修改后台任务类型的XML元素配置文件即可。 注意&#…

递归就这么简单

递归介绍 本来预算此章节是继续写快速排序的,然而编写快速排序往往是递归来写的,并且递归可能不是那么好理解,于是就有了这篇文章。 在上面提到了递归这么一个词,递归在程序语言中简单的理解是:方法自己调用自己 递归其…

阿里云RPA(机器人流程自动化)干货系列之二:认识RPA(下)

2019独角兽企业重金招聘Python工程师标准>>> 导读:本文是阿里云RPA(机器人流程自动化)干货系列之二,主要介绍了RPA的发展齐纳经和主要使用场景有哪些,目前国内外主流的RPA厂商以及RPA的未来在哪。 一、RPA的…

C# 图片的读取

//图片转成二进制public byte[] GetPictureData(string imagepath){/**/根据图片文件的路径使用文件流打开,并保存为byte[] FileStream FileStream new FileStream(imagepath, FileMode.Open);byte[] byData new byte[FileStream.Length];FileStream.Read(byData,…

SDOI2010 地精部落

题目描述 传说很久以前,大地上居住着一种神秘的生物:地精。 地精喜欢住在连绵不绝的山脉中。具体地说,一座长度为N的山脉H可分为从左到右的N段,每段有一个[b][u]独一无二[/u][/b]的高度Hi,其中Hi是1到N之间的正整数。 …

Codechef Yet another cute girl

题意大概就是让你求一下[L,R]中的约数个数是素数的数的个数。 其中1<L<R<1e12,R-L<1e6. 然后我写了两种做法&#xff0c;第一种是可以直接搞出来L-R的约数个数&#xff0c;然后直接统计一下就好了。 这个的复杂度大致是 O((R-L) * log(R-L)) 第二种就是需要先发现满…

简单弄一个-个人主页

--- 整理一下已经发表的文章 JAVA基础 java基础数据结构之-红黑树(插入)java基础数据结构之-红黑树(删除)了解一下jdk动态代理的本质了解一下cglib动态代理的本质SpringBoot源码解析 前言&#xff1a;阅读springboot源码之前&#xff0c;最好对spring源码有一定的了解&#xff…

Halocn OCR识别入门学习

一、建立OCR库 dev_close_window() read_image(Image,OCR) get_image_size(Image,Width,Hight) dev_open_window(0,0,Width,Hight,black,Window) dev_display(Image)*字符处理 rgb1_to_gray(Image,ImageGray) *鼠标画你要找的roi区域 draw_rectangle1(Window,Row1,Column1,Row…

ctsc2009 移民站选址

分析&#xff1a;非常非常好的一道题&#xff01; 首先需要对问题进行转化&#xff1a; 行列无关&#xff0c;对于行单独处理&#xff0c;对于列单独处理必然存在一个最优方案使得每一个新站与旧站重合.转化1很显然&#xff0c;对于转化2&#xff0c;是一类非常经典的“中位数问…

Jenkins 安装与使用--实例

參考了博客Jenkins master在windows上安装 Jenkins的主要功能是监视反复工作的运行&#xff0c;比如软件project的构建详细地&#xff1a; *软件的持续构建和測试 本质上提供了一个易于使用的持续集成系统。使得开发者更easy地将改变集成到project中。使得用户更easy获得一个…

后端项目搭建技术栈

Koa2&#xff1a;koa-bodyparser koa-router koa-session koa-corsTypeScript数据库&#xff1a;Mysql &#xff08;库&#xff1a;Sequelize&#xff09;表单验证库&#xff1a;Joi

C# 实体类几种深拷贝的方法——解决关于对象赋值,A=B,A改变,B也改变问题

几种常见的深拷贝方式 1、利用反射实现 public static T DeepCopyByReflection<T>(T obj) {   if (obj is string || obj.GetType().IsValueType)   return obj; object retval Activator.CreateInstance(obj.GetType());   FieldInfo[] fields obj.GetType().…

Hadoop学习之路(九)HDFS深入理解

HDFS的优点和缺点 HDFS的优点 1、可构建在廉价机器上 通过多副本提高可靠性&#xff0c;提供了容错和恢复机制 服务器节点的宕机是常态 必须理性对象 2、高容错性 数据自动保存多个副本&#xff0c;副本丢失后&#xff0c;自动恢复 HDFS的核心设计思想&#xff1a; 分散均匀…

关于Unity中的声音管理模块(专题七)

声音的要素 1: 音频文件AudioClip2: 音源AudioSource;3: 耳朵AudioListener;//全局只能有一个4: 2D/3D音频;//2D只是简单地播放声音&#xff0c;3D可以根据距离衰减音量 怎样听到声音&#xff1a; 创建一个节点&#xff0c;挂载AudioSource组件&#xff0c;AudioSource组件关联…