如何将byte *转化为NIVision使用的Image
答案:2 悬赏:60 手机版
解决时间 2021-04-10 23:11
- 提问者网友:龅牙恐龙妹
- 2021-04-10 17:16
如何将byte *转化为NIVision使用的Image
最佳答案
- 五星知识达人网友:行雁书
- 2021-04-10 17:46
使用过 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 为了提高图像处理的速度而制定的。
如果是从硬盘读入图像,可以利用函数 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 为了提高图像处理的速度而制定的。
全部回答
- 1楼网友:玩世
- 2021-04-10 19:21
labview是ni的编程平台。vision是视觉开发包,vision assistant是视觉助手,安装vision工具包后附带的一个程序,帮助用户快速编程的。labview是有许多学习书籍的。vision没得,只有软件自带的培训教程。
面料的平整度需要不需要打一下光呢?我觉得打一下光比较理想。如果做go-no-go的话更好做。平的就go,不平的就no go。用同轴光、线光等可以考虑。面积大的话,就得考虑多个相机同时工作了。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯