输入相同但输入方式不同结果不同
Different results with same inputs but different ways of inputting
我有一个来自 opencv dll 的外部函数 cvCreateFileCapture,它应该将路径作为输入并 return 结构。
CV_IMPL CvCapture * cvCreateFileCapture (const char * filename)
我出于测试目的创建了一个 vs2010 项目,从那里我使用有效的文件路径调用此函数并获得我应该获得的结构 returned。
当我从另一个程序(我使用的是 labVIEW)调用此函数时,我跳转到具有相同输入的相同函数,但它 returns 0.
有谁知道为什么它以一种方式工作而不是另一种方式?
C 调用是CvCapture* p = cvCreateFileCapture("C:/Users/****/Downloads/Disturbedloc.avi");
labview 调用如下所示:
加载时间调试
如果库调用在一个环境中有效但在另一个环境中无效,则说明环境存在差异。主要有两种方法:
- 使用 depends.exe to make sure that
opencv
has the correct linkage. Perhaps Visual Studio is inspecting opencv
for other libraries (like FFMPEG or GStreamer) and adding extra loader instructions to fetch those binaries on launch. LabVIEW, on the other hand, will do a pure dynamic load,如果库没有正确公布其依赖项,则不会加载这些库,您将获得一个 NULL
指针。
- 在您的 VI 首次调用
opencv
之前将 Visual Studio 附加到 LabVIEW,然后观察 Modules window 以查看支持库是否驻留在内存中。与您的工作 Visual Studio 程序进行比较会显示是否有任何遗漏。
正在强制加载缺失的库
运行 时间链接在 opencv
中不起作用是他们项目中的一个错误。你应该向他们报告。
您有两个解决方法:
- 修复错误,自行构建
opencv
,然后将其与您的应用程序一起重新分发。
- 在每个依赖项中调用dummy entry points以提示LabVIEW将它们引入到进程中。然后开始调用
opencv
.
一旦开始工作
由于您的 opencv
dll returns 是指向结构的指针,您有两个选择:
- 在另一个 C/C++ 库中包装和调整
opencv
库,以便 inputs/outputs 是更简单的数据类型,例如数字。
- 使用集群和一些特定的调用库函数节点配置,以便 LabVIEW 可以理解
opencv
类型的内存布局。 NI 有一些很好的文档描述了 LabVIEW 如何与外部库接口,但从这里开始:Calling C/C++ DLLs from LabVIEW.
我刚刚试过了,它对我有用。
这是前面板:
和框图:
我正在使用 Labview 2014 和 OpenCV 3.0。
我在使用更复杂的路径(包括空格等)时遇到问题(即返回 0)
我有一个来自 opencv dll 的外部函数 cvCreateFileCapture,它应该将路径作为输入并 return 结构。
CV_IMPL CvCapture * cvCreateFileCapture (const char * filename)
我出于测试目的创建了一个 vs2010 项目,从那里我使用有效的文件路径调用此函数并获得我应该获得的结构 returned。
当我从另一个程序(我使用的是 labVIEW)调用此函数时,我跳转到具有相同输入的相同函数,但它 returns 0.
有谁知道为什么它以一种方式工作而不是另一种方式?
C 调用是CvCapture* p = cvCreateFileCapture("C:/Users/****/Downloads/Disturbedloc.avi");
labview 调用如下所示:
加载时间调试
如果库调用在一个环境中有效但在另一个环境中无效,则说明环境存在差异。主要有两种方法:
- 使用 depends.exe to make sure that
opencv
has the correct linkage. Perhaps Visual Studio is inspectingopencv
for other libraries (like FFMPEG or GStreamer) and adding extra loader instructions to fetch those binaries on launch. LabVIEW, on the other hand, will do a pure dynamic load,如果库没有正确公布其依赖项,则不会加载这些库,您将获得一个NULL
指针。 - 在您的 VI 首次调用
opencv
之前将 Visual Studio 附加到 LabVIEW,然后观察 Modules window 以查看支持库是否驻留在内存中。与您的工作 Visual Studio 程序进行比较会显示是否有任何遗漏。
正在强制加载缺失的库
运行 时间链接在 opencv
中不起作用是他们项目中的一个错误。你应该向他们报告。
您有两个解决方法:
- 修复错误,自行构建
opencv
,然后将其与您的应用程序一起重新分发。 - 在每个依赖项中调用dummy entry points以提示LabVIEW将它们引入到进程中。然后开始调用
opencv
.
一旦开始工作
由于您的 opencv
dll returns 是指向结构的指针,您有两个选择:
- 在另一个 C/C++ 库中包装和调整
opencv
库,以便 inputs/outputs 是更简单的数据类型,例如数字。 - 使用集群和一些特定的调用库函数节点配置,以便 LabVIEW 可以理解
opencv
类型的内存布局。 NI 有一些很好的文档描述了 LabVIEW 如何与外部库接口,但从这里开始:Calling C/C++ DLLs from LabVIEW.
我刚刚试过了,它对我有用。
这是前面板:
和框图:
我正在使用 Labview 2014 和 OpenCV 3.0。
我在使用更复杂的路径(包括空格等)时遇到问题(即返回 0)