如何在 LabVIEW 的 DLL 中打开 OpenCV 结构化边缘检测器的模型文件?
How to open Model file for OpenCV's structured edge detector in a DLL for LabVIEW?
我已经使用 OpenCV 为 LabVIEW 创建了 EdgeBoxes.cpp 示例 DLL。我试图在 DLL 中打开模型文件,但我得到的只是断言失败。我还为形态学、角点检测、霍夫变换创建了 VI,但从未收到任何类似的错误消息。
我试过:
- 每个路径组合都使用正斜杠或反斜杠。
- 将每个文件放入同一个文件夹(也在
C:\
中)。 (LabVIEW VI、DLL、模型文件)
- 首先在LabVIEW中用“
Open/Create/Replace.vi
”打开它
- 打开提取的 model.yml 文件而不是 model.yml.gz
- 将yml文件转成json,txt也不行
这就是我无能为力的地方:
string filename = "C:\model.yml.gz"
Ptr<StructuredEdgeDetection> pDollar; = createStructuredEdgeDetection(filename);
我收到的错误消息:
Error -1002 occurred at OpenCV(4.0.1-dev)
C:\OpenCV\opencv_contrib-master\modules\ximgproc\src\structured_edge_detection.cpp:432:
error: (-215:Assertion failed) modelFile.isOpened() in function
'cv::ximgproc::StructuredEdgeDetectionImpl::StructuredEdgeDetectionImpl'
我不知道如何在不收到此错误消息的情况下打开此文件。甚至可以在 DLL 调用中访问文件。由于权限问题,我是否必须以某种方式在 LabVIEW VI 中打开它?
谢谢!
更新:1
现在我尝试使用 ifstream 读取文件,似乎我可以毫无问题地访问文件(下面的代码)。所以它不起作用的原因似乎与 OpenCV 有关?
std::ifstream is(filename, std::ifstream::binary);
is.seekg(0, is.end);
int length = is.tellg();
is.seekg(0, is.beg);
char * buffer = new char[length];
is.read(buffer, length);
is.close();
delete[] buffer; // buffer contains the entire file
更新:2
现在我尝试像调用 OpenCV 一样打开文件:
createStructuredEdgeDetection(filename);
之后 OpenCV 尝试打开文件:
参见第 431 行
https://github.com/opencv/opencv_contrib/blob/master/modules/ximgproc/src/structured_edge_detection.cpp
cv::FileStorage modelFile(filename, FileStorage::READ);
if (modelFile.isOpened())
{ return -1; }
为什么它适用于
ifstream::binary
我必须重新编译 "structured_edge_detection.cpp" 吗?
我解决了我的问题。如果您在 Visual Studio 中使用调试模式,您需要做的就是注意只链接带有 "d" 的库。我同时使用了:
opencv_imgproc401d.lib, opencv_imgproc401.lib, opencv.ximg....
仅将附加链接器依赖项更改为调试库后
opencv_imgproc401d.lib;opencv_ximgproc401d.lib;opencv_core401d.lib;
对我来说一切都很好。
我已经使用 OpenCV 为 LabVIEW 创建了 EdgeBoxes.cpp 示例 DLL。我试图在 DLL 中打开模型文件,但我得到的只是断言失败。我还为形态学、角点检测、霍夫变换创建了 VI,但从未收到任何类似的错误消息。
我试过:
- 每个路径组合都使用正斜杠或反斜杠。
- 将每个文件放入同一个文件夹(也在
C:\
中)。 (LabVIEW VI、DLL、模型文件) - 首先在LabVIEW中用“
Open/Create/Replace.vi
”打开它 - 打开提取的 model.yml 文件而不是 model.yml.gz
- 将yml文件转成json,txt也不行
这就是我无能为力的地方:
string filename = "C:\model.yml.gz"
Ptr<StructuredEdgeDetection> pDollar; = createStructuredEdgeDetection(filename);
我收到的错误消息:
Error -1002 occurred at OpenCV(4.0.1-dev) C:\OpenCV\opencv_contrib-master\modules\ximgproc\src\structured_edge_detection.cpp:432: error: (-215:Assertion failed) modelFile.isOpened() in function 'cv::ximgproc::StructuredEdgeDetectionImpl::StructuredEdgeDetectionImpl'
我不知道如何在不收到此错误消息的情况下打开此文件。甚至可以在 DLL 调用中访问文件。由于权限问题,我是否必须以某种方式在 LabVIEW VI 中打开它? 谢谢!
更新:1
现在我尝试使用 ifstream 读取文件,似乎我可以毫无问题地访问文件(下面的代码)。所以它不起作用的原因似乎与 OpenCV 有关?
std::ifstream is(filename, std::ifstream::binary);
is.seekg(0, is.end);
int length = is.tellg();
is.seekg(0, is.beg);
char * buffer = new char[length];
is.read(buffer, length);
is.close();
delete[] buffer; // buffer contains the entire file
更新:2
现在我尝试像调用 OpenCV 一样打开文件:
createStructuredEdgeDetection(filename);
之后 OpenCV 尝试打开文件: 参见第 431 行 https://github.com/opencv/opencv_contrib/blob/master/modules/ximgproc/src/structured_edge_detection.cpp
cv::FileStorage modelFile(filename, FileStorage::READ);
if (modelFile.isOpened())
{ return -1; }
为什么它适用于
ifstream::binary
我必须重新编译 "structured_edge_detection.cpp" 吗?
我解决了我的问题。如果您在 Visual Studio 中使用调试模式,您需要做的就是注意只链接带有 "d" 的库。我同时使用了:
opencv_imgproc401d.lib, opencv_imgproc401.lib, opencv.ximg....
仅将附加链接器依赖项更改为调试库后
opencv_imgproc401d.lib;opencv_ximgproc401d.lib;opencv_core401d.lib;
对我来说一切都很好。