LabVIEW:IMAQ colorImage 到数组
LabVIEW: IMAQ colorImage to Array
我正在开发一个应用程序,其中应从 LabVIEW(通过相机)读取图像并在 python 函数中进行预处理(不应从文件路径读取图像,这意味着我们不应该保存相机中显示的图像,而应该直接在 python 函数中读取它,这就是为什么我想到将其像素值发送到函数的原因),为此我正在使用系统执行程序。
作为第一步,我尝试从文件路径读取图像以检查我是否可以将其像素值作为数组并将其发送到命令行。我使用 IMAQ colorImage 来排列并将其转换为字符串我使用了“Flatten to string function”(因为没有 32U to string 函数)但是如图所示我得到了奇怪的符号。
Ps:我使用了 system exec,因为我没有其他 python LabVIEW connectivity
的许可证
如果您知道如何将图像像素数组作为参数发送给 python 函数,请帮助我,我将不胜感激!
检查此示例以将数字数据 table 转换为所需格式的字符串:
您可以使用flatten to string节点将图像数据发送到您的python脚本,但您应该注意以下内容:
图像数据将从 U32 二维数组转换为无符号字节(值 0-255)。其中一些值在标准 ASCII 字符集之外,因此它们将无法正确呈现(它们看起来像奇怪的符号或空格)。这也意味着很难将它们作为参数传递,但我们可以将它们写入 stdin.
flatten to string 节点(默认情况下)将数组大小作为 I32s 附加到数据的开头(这很有用)并使用 big-endian格式(不是)。
这里的up-shot是我们需要重写flatten to string节点的默认行为来使用little-endian格式和剥离前 8 个字节转换为 python.
中的数组宽度和高度
LabVIEW 以 ARGB 顺序存储图像像素,但由于我们使用 little-endian 选项展平,我们最终得到 BGRA 顺序的数据,这是 openCV 的预期通道顺序。
将这些放在一起并确保我们将图像数据传递到 系统 exec.vi 的 standard input
输入,我们有以下 LabVIEW 和 python代码:
import sys
import numpy as np
import cv2
# read std in as byteArray
dataInBuffer = sys.stdin.buffer.read()
# first 8 bytes are two, 4-byte signed integer values image width and height
width = int.from_bytes( dataInBuffer[0:3], "little", signed=True )
height = int.from_bytes( dataInBuffer[4:7], "little", signed=True)
# the rest of the data is 4-channel pixel data in BGRA format
imageBuffer = np.frombuffer(dataInBuffer[8:], dtype=np.uint8)
image = imageBuffer.reshape(width,height,4)
cv2.imshow('sample image',image)
cv2.waitKey(0) # waits until a key is pressed
cv2.destroyAllWindows() # destroys the window showing image
作为第一步,我尝试从文件路径读取图像以检查我是否可以将其像素值作为数组并将其发送到命令行。我使用 IMAQ colorImage 来排列并将其转换为字符串我使用了“Flatten to string function”(因为没有 32U to string 函数)但是如图所示我得到了奇怪的符号。 Ps:我使用了 system exec,因为我没有其他 python LabVIEW connectivity
的许可证如果您知道如何将图像像素数组作为参数发送给 python 函数,请帮助我,我将不胜感激!
检查此示例以将数字数据 table 转换为所需格式的字符串:
您可以使用flatten to string节点将图像数据发送到您的python脚本,但您应该注意以下内容:
图像数据将从 U32 二维数组转换为无符号字节(值 0-255)。其中一些值在标准 ASCII 字符集之外,因此它们将无法正确呈现(它们看起来像奇怪的符号或空格)。这也意味着很难将它们作为参数传递,但我们可以将它们写入 stdin.
flatten to string 节点(默认情况下)将数组大小作为 I32s 附加到数据的开头(这很有用)并使用 big-endian格式(不是)。
这里的up-shot是我们需要重写flatten to string节点的默认行为来使用little-endian格式和剥离前 8 个字节转换为 python.
中的数组宽度和高度LabVIEW 以 ARGB 顺序存储图像像素,但由于我们使用 little-endian 选项展平,我们最终得到 BGRA 顺序的数据,这是 openCV 的预期通道顺序。
将这些放在一起并确保我们将图像数据传递到 系统 exec.vi 的 standard input
输入,我们有以下 LabVIEW 和 python代码:
import sys
import numpy as np
import cv2
# read std in as byteArray
dataInBuffer = sys.stdin.buffer.read()
# first 8 bytes are two, 4-byte signed integer values image width and height
width = int.from_bytes( dataInBuffer[0:3], "little", signed=True )
height = int.from_bytes( dataInBuffer[4:7], "little", signed=True)
# the rest of the data is 4-channel pixel data in BGRA format
imageBuffer = np.frombuffer(dataInBuffer[8:], dtype=np.uint8)
image = imageBuffer.reshape(width,height,4)
cv2.imshow('sample image',image)
cv2.waitKey(0) # waits until a key is pressed
cv2.destroyAllWindows() # destroys the window showing image