借助 NI 视觉
对于 LabVIEW 用户已安装 NI 视觉库的人,有一些 VI 允许从 2D 数组复制 IMAQ 图像的图像数据。
对于单通道图像(U8
, U16
, I16
, float
)VI 是
Vision and Motion >> Vision Utilites >> Pixel Manipulation >> IMAQ ArrayToImage.vi
对于多通道图像(RGB
等)VI是
Vision and Motion >> Vision Utilites >> Color Utilities >> IMAQ ArrayColorToImage.vi
实施例1
使用的示例IMAQ ArrayToImage.vi
如下面的代码片段所示U16
数据从二进制文件读取并写入灰度U16
type IMAQ image
。请注意,如果该文件是由 LabVIEW 以外的其他软件创建的,那么很可能必须以小端格式读取该文件,该格式是为Read From Binary File.vi
实施例2
当使用某些驱动程序 DLL 调用来获取图像数据作为缓冲区时,可以使用类似的过程。例如,如果驱动程序有一个功能capture(unsigned short * buffer)
那么可以采用以下技术,在函数调用之前使用以下方法初始化正确大小的数组:initialize array
原始。
// example function which fills a buffer with image data
#include <stdint.h>
__declspec(dllexport) int capture(uint16_t * buffer)
{
int width,height;
width = 2500;
height = 3052;
// check pointer
if(!buffer){
return -1;
}
// fill buffer with some data for testing
// this should be a greyscale gradient
// black in the top left corner
// to white in the bottom left
for(int row = 0; row<height;row++){
for(int pixel=0; pixel<width; pixel++){
*buffer = row * 8 + pixel * 8;
buffer++;
}
}
return 0;
}
没有 NI 视觉
对于 LabVIEW 用户没有安装 NI Vision 的人,我们可以使用一个名为GetImagePixelPtr.vi
它与 NI-IMAQ 工具包/库一起安装。该VI可能在调色板中不可见,但应位于磁盘上<LabVIEW-Install-Directory>\vi.lib\vision\Basics.llb
.
此外,我们将使用MoveBlock
共享库调用来自LabVIEW 的内存管理器库 https://zone.ni.com/reference/en-XX/help/371361R-01/lvexcode/memory_manager_functions/
这些 VI/库调用可以如下面的代码片段所示使用,其中,如前面的代码片段所示,U16
数据从二进制文件读取并写入灰度 U16 类型 IMAQ 图像。
一旦我们获得了 2D 数组形式的图像数据,我们就需要通过设置 IMAQ 图像的尺寸来准备它。然后使用 for 循环迭代图像数据的行;对于每一行,我们获得一个指向相应 IMAQ Image 行开头的指针,并使用 MoveBlock 调用来复制数据。每次调用 MoveBlock 后,我们都会取消映射 IMAQ 图像指针以进行整理。
请注意,本示例使用 U16 数据;对于其他数据类型,请确保bytes per pixels
数值常量(在 for 循环中)会相应更新。