2012-02-15 81 views
5

我熟悉编写DLL文件,可以在LabVIEW中调用,但我很好奇,什么正确的方式IMAQ图像传递到DLL可能。以下是我发现的一种方法 - 我也使用类似的机制将IMAQ Image实例从我的DLL发布到事件结构。的LabVIEW,C++ DLL,和IMAQ图像

Example Diagram

注意的是,图像实例转换到/从集群节点位于${LABVIEW_INSTALL_DIR}/vi.lib/vision/DatatypeConversion.llb,并分别命名为IMAQ Image Datatype to Image Cluster.viIMAQ Image Cluster to Image Datatype.vi。创建的群集包含映像名称和一个整数值,该值表示指向C/C++中Image*类型的指针地址。

这是做到这一点的最好办法,还是有更好的办法?

+1

我能看到的一个问题是转换节点正在给U32。如果你在64位可能会有问题... – CharlesB 2012-02-16 16:02:45

+0

是的,我注意到 - 这是因为我将函数调用的参数定义为一个“指针大小的整数”函数。由于我在32位环境下运行,这并不直接影响我 - 它很好奇,尽管32位输出正好如此,因为我运行的是NI Vision 2011,它自称有64位支持。看上面的集群输出,这似乎并不完全是真的...... – hatboyzero 2012-02-16 16:41:46

+1

好吧,我很确定,在64位环境中,它提供了一个64位指针 – CharlesB 2012-02-16 16:47:47

回答

4

我使用不同的方法,将所有的图像信息(指针,大小等),在集群中使用以下代码:

enter image description here

群集然后被传递到DLL功能,使得像素操作(当然不会改变大小),然后调用IMAQ的unmap像素指针。经过讨论


编辑:

你的解决方案依赖于具有NI视觉,在这种情况下,它比我的好。但是,如果没有NI Vision矿山,则只能使用IMAQ的像素数据。

+0

这似乎有点忙,尤其是考虑到你可以通过调用'imaqGetImageInfo(_pImage,&imageInfo)'时,通过引用返回'imageInfo'结构中的所有信息,其中'_pImage'中存储的地址等同于示例中传递的整数上面的问题。 – hatboyzero 2012-02-16 14:57:25

+0

不知道这个!集群解包之前的noe名称是什么?反正你的解决方案似乎比我好,所以你应该去用它,如果它的工作:-) – CharlesB 2012-02-16 15:15:00

+2

这两个转换节点位于'$ {} LABVIEW_INSTALL_DIR/vi.lib /视觉/ DatatypeConversion.llb'。很可惜,默认情况下它们不包含在IMAQ调色板中,诚实地说... – hatboyzero 2012-02-16 15:41:42