使用和不使用 NI Vision 从二进制缓冲区/文件创建 LabVIEW IMAQ 图像

Posted

技术标签:

【中文标题】使用和不使用 NI Vision 从二进制缓冲区/文件创建 LabVIEW IMAQ 图像【英文标题】:Create a LabVIEW IMAQ image from a binary buffer/file with and without NI Vision 【发布时间】:2021-11-21 14:20:12 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

使用 NI Vision

对于安装了 NI 视觉库的 LabVIEW 用户,有一些 VI 允许从二维数组复制 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 的示例如下面的sn-p 所示,其中U16 数据从二进制文件中读取并写入灰度U16 类型IMAQ image。请注意,如果文件是由 LabVIEW 以外的其他软件创建的,则很可能必须以 Read From Binary File.vi 指定的 little-endian 格式读取它

示例 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 用户,我们可以使用一个名为 GetImagePixelPtr.vi 的 VI,它与 NI-IMAQ 工具包/库一起安装。该 VI 可能在调色板中不可见,但应位于磁盘上的 &lt;LabVIEW-Install-Directory&gt;\vi.lib\vision\Basics.llb 中。

此外,我们将使用来自LabVIEW's memory manager library 的MoveBlock shared-library 调用

这些 VI/库调用可以如下面的 sn-p 所示使用,与之前的 sn-p 一样,U16 数据从二进制文件中读取并写入灰度 U16 类型的 IMAQ 图像。

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

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

【讨论】:

@Jhon,这真的很有帮助。但在我的实际情况中,我有一个 C++ 包装 dll,而不是文件,它有一个名为 capture(uint_16 **pSrc) 的函数。现在,该函数需要预先分配的内存来复制像素数据。如何在LabVIEW中为图像预分配内存并将其传递给dll?有什么想法吗? @AchuthaperumalRK 我添加了第二个示例来演示这一点。

以上是关于使用和不使用 NI Vision 从二进制缓冲区/文件创建 LabVIEW IMAQ 图像的主要内容,如果未能解决你的问题,请参考以下文章

ni vision assistant的例子在哪

NI Vision:二值图像连通域标记算法

如何用ni vision模块来将车牌从背景中提取出来??

LabVIEW & NI Vision 工控视觉开发环境配置

ni vision assistant 为啥生产不了vi

ni vision builder如何与工业相机连接?