使用和不使用 NI Vision 从二进制 buffer/file 创建 LabVIEW IMAQ 图像

Create a LabVIEW IMAQ image from a binary buffer/file with and without NI Vision

假设您有一个表示二维图像的二进制缓冲区或文件。

如何将二进制数据转换为 IMAQ 图像以便使用 LabVIEW 进行进一步处理?

带 NI Vision

对于安装了 NI 视觉库的 LabVIEW 用户,有一些 VI 允许从 2D 阵列复制 IMAQ 图像的图像数据。

对于单通道图像(U8U16I16float)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 类型 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 Vision

对于未安装 NI vision 的 LabVIEW 用户,我们可以使用与 NI-IMAQ toolkit/library 一起安装的名为 GetImagePixelPtr.vi 的 VI .该 VI 在调色板中可能不可见,但应该在 <LabVIEW-Install-Directory>\vi.lib\vision\Basics.llb.

中的磁盘上

此外,我们将使用来自 LabVIEW's memory manager library

MoveBlock 共享库调用

可以使用这些 VI/library 调用,如下面的代码片段所示,与前面的代码片段一样,U16 数据从二进制文件中读取并写入灰度 U16 类型的 IMAQ 图像.

一旦我们将图像数据作为二维数组,我们需要通过设置其尺寸来准备 IMAQ 图像。然后使用 for 循环遍历图像数据的行;对于每一行,我们获得一个指向相应 IMAQ 图像行开始的指针,并使用 MoveBlock 调用来复制数据。在每次 MoveBlock 调用之后,我们取消映射 IMAQ 图像指针以进行整理。

请注意,本例使用的是U16数据;对于其他数据类型,请确保相应地更新 bytes per pixels 数字常量(在 for 循环中)。