永发信息网

如何将byte *转化为NIVision使用的Image

答案:2  悬赏:60  手机版
解决时间 2021-04-10 23:11
如何将byte *转化为NIVision使用的Image
最佳答案
使用过 NIVision 的人都知道,库中所有的图像处理函数的入口都是一个指向 Image 结构体的指针。 Image 结构体是 NI 公司定义的一个结构体,且其内容是不对外开放的,使用者无法获 知其组织结构。
如果是从硬盘读入图像,可以利用函数 imaqReadFile(Image* image, const char* fileName, RGBValue* colorTable, int* numColors) 得到一个 Image * 的结构体指针,进而可以利用库中 的函数进行图像处理操作。对于这种情况,可以将 Image 结构体视为一个“黑盒子”,其内部结构不必知道,不影响使用。
但是对于内存中的图像数据,一般为一个 byte * 类型的指针,指向图像数据的首地址,例如从摄像机或者相机的视频 流中获取的图像。在这种情况下,如果要使用 NIVision 库函数,就必须先根据 byte * 类型的指针构造一个 Image 结构体的指针。我们知道, Image结构体的内部结构是不对外开放的,那么如何 将 byte * 转化为 NIVision 使用的 Image * 呢 ? 下面提供一种解决方法,经过我的反复测试,这种方法是一种有效 的解决手段。需要说明的是:下面的方法仅适用于 8 位灰度图像。因为一般机器视觉的图像都为 8 位灰度图像,所以暂时只做了这个,希望对大家有用。
我将 byte * 转化为 Image * 的功能写成一个函数:
Image * Copy_C_Image_To_LabVIEW_Image(BYTE * ImagePtr, int LineWidth, int Width, int Height)
参数说明: ImagePtr 为图像数据的首地址, LineWidth 为图像一行的字节数,与 Width 的关系为 (Width+3)/4*4 , Width 为图像的像素宽度, Height 为图像的像素高度。返回值就是一个 Image 结构体的指针。源代码如下:
// 这个函数非常重要,用以完成将 byte 数组形式的图像数据转换成 NI 定义的图像结构体 Image
////////////////////////////
/////////// 陈运锦 2010.03.29 //////////////////
////////////////////////////
Image * Copy_C_Image_To_LabVIEW_Image(BYTE * ImagePtr,int LineWidth,int Width,int Height)
{
Image * NI_Image = NULL;
ImageInfo NI_ImageInfo;
int y;
// 创建一个 Image 结构体,带边界的,边界宽度为 3
NI_Image = imaqCreateImage(IMAQ_IMAGE_U8,3);
// 设置 NI_Image 的长,宽尺寸
imaqSetImageSize(NI_Image, Width, Height);
// 获取 NI_Image 的信息,以便找到 (0,0) 像素的指针,以及每一行的字节数,便于数据拷贝
imaqGetImageInfo(NI_Image,&NI_ImageInfo);
// 一行一行地拷贝像素数据,注意一行只拷贝真实像素数据的宽度 Width ,而不是字节宽度 LineWidth
for (y=0;y {
memcpy((BYTE )NI_ImageInfo.imageStart+y*NI_ImageInfo.pixelsPerLine,
ImagePtr+y*LineWidth,Width);
}
return NI_Image;
}
注意:上述代码在创建 Image 结构体时,设置了 Image 结构体的边界宽度。由于有些图像处理操作涉及到边界,如:边缘 检测、空域滤波等,因此 NIVision 在创建图像 Image 结构体时,就必须要带有边界,否则的话,无边界的图像是不能使用诸如边缘检测等处理函数的。另外需要说 明的是,在 Image 结构体中,图像每一行的像素个数 ( 字节数 ) 为 pixelsPerLine ,这个值与 LineWidth 是不相等的。 LineWidth 要求为 4 的倍数,而 pixelsPerLine 要求为 32 的倍数,后者的要求是 NIVision 为了提高图像处理的速度而制定的。
全部回答
labview是ni的编程平台。vision是视觉开发包,vision assistant是视觉助手,安装vision工具包后附带的一个程序,帮助用户快速编程的。labview是有许多学习书籍的。vision没得,只有软件自带的培训教程。 面料的平整度需要不需要打一下光呢?我觉得打一下光比较理想。如果做go-no-go的话更好做。平的就go,不平的就no go。用同轴光、线光等可以考虑。面积大的话,就得考虑多个相机同时工作了。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎么样学习不会感到累
钢琴怎样才能练好?
判断题如果海拔1200m表示高于海平面1200m,那
从惠州快递到湛江要多久啊?
创国家卫生城市标语,你的家乡正在全力创建全
百姓饺子馆在什么地方啊,我要过去处理事情
类似于九连环的古典智力游戏 两个M形的怎么解
怎么感觉同学聚会越来越没意思了,有同感的。
往来无白丁的出处是哪个文言文?
单选题一种元素跟另一种元素本质的区别是A.中
万花筒业务点整
唐诗三百首带拼音版,唐诗三百首每首诗都有拼
江西省09年考的会计从业资格考试怎么查出成绩
梦见一个陌生人(男生)
柏兴木业有限公司怎么去啊,有知道地址的么
推荐资讯
表弟要结婚了,送什么礼物好呢?
经常打香港电话,怎样才能节省话费
车险理赔有几个步骤?
梦幻诛仙的进
女孩子的危险期是什么时候?
省略号的作用?
梦幻更新会跳出patch.2.0.5.xy,更新失败?
如何成为超级QQ
DNF 35级阿修罗综合加点
优果在哪里啊,我有事要去这个地方
华夏银行在日本提现免手续费吗?金额是多少免
听妈妈说男人吃黑枣补肾,真的吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?