【发布时间】:2019-10-03 17:29:59
【问题描述】:
我使用 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);
我收到的错误消息:
OpenCV(4.0.1-dev) 发生错误 -1002 C:\OpenCV\opencv_contrib-master\modules\ximgproc\src\structured_edge_detection.cpp:432: 错误:(-215:断言失败)函数中的modelFile.isOpened() '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”吗?
【问题讨论】:
-
通过文件扩展名,您指定的文件似乎已压缩或包含在存档 (model.yml.gz) 中。该函数可能正在尝试直接加载文件,并且无法将内容检测为 yml 文件。将文件解压缩到同一个文件夹并将您的字符串分配更改为“string filename = 'C:\model.yml'”,看看是否有帮助。在这里找到了一个类似的问题 -> stackoverflow.com/questions/49734695/structured-edge-detection
-
谢谢,但我也已经尝试过了。刚才忘记在上面说了。提取文件后,它只是一个 yml 文件 --> model.yml。它不适用于任何文件。
标签: c++ opencv dll visual-studio-2015 labview