【发布时间】:2019-12-12 18:09:33
【问题描述】:
我正在尝试使用 Microsoft Visual Studio 2017 在 C++ 中构建完全独立的 DLL。通常我将 c++ 与 OpenCV 和 LabVIEW 额外库一起使用,一切正常,直到我尝试在 LabVIEW 中的外部机器上运行它。
我构建了自己的环境,用于将我的机器视觉方法链接为 LabVIEW 的实时应用程序。我的 DLL 一次只分析一个图像/帧。在我开始使用基于 Haar 级联分类器 (HCC) 的新方法之前,一切都运行良好,这需要额外的带有权重的 XML 文件。我训练自己的 HCC 权重,并将它们保存为 XML 文件,在编译期间必须由代码读取。不幸的是,DLL 在每台机器上都需要该文件的路径,这使得使用它变得困难。是否有任何选项可以将此 XML 内容永久导入 DLL?我不想每次运行 DLL 时都提供此路径。在下面的代码中,我粘贴了一些我的问题的 sn-p。在编译之前,我必须将级联 XML 文件的路径作为 HaarPathXML 变量。我认为这就是我的代码在其他机器上崩溃的原因 - 它看不到这条路径。编译期间是否有硬编码此文件数据的选项?
// ========================
// === SOME HEADER CODE ===
// ========================
// === Dll entry point ===
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(hModule);
UNREFERENCED_PARAMETER(lpReserved);
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
// === Function to export as DLL ===
extern "C" __declspec(dllexport) char* PupilData(
const uint8_t *__arr[],
const uint16_t __img_rows,
const uint16_t __img_cols,
uint8_t __GB,
) // Describe inputs
{
// === Define the data ===
string HaarPathXML = "C:\\Users\\path_to_file\\cascade.xml";
// ====================================================================
// === SOME MAIN CODE, WHICH GIVES out VARIABLE WITH CALCULATED DATA ===
// ====================================================================
// === Change out string to char table and return it as an DLL output ===
char* C_pupil_data = new char[out.size() + 1];
copy(out.begin(), out.end(), C_pupil_data);
C_pupil_data[out.size()] = '\0';
return C_pupil_data;
}
我认为我可以将路径作为另一个变量并为此准备 LabVIEW 代码。但我正在寻找更简单的方法来处理它。此外 - 连续读取 XML 文件可能会减少我的代码的每秒帧数。
【问题讨论】:
-
您可以将文件编译为项目的资源,然后在程序执行期间将这些文件写入磁盘,并在使用后立即删除它们。您可能需要向操作系统询问您具有写入权限的合适临时文件夹。
-
感谢您的帮助,但我在没有资源的情况下找到了不同的方法。我尝试处理你的提议,但我失败了。它不像你的提议那样普遍,但它解决了我的问题。我在下面发布。但我仍然对你的提议感兴趣。 XML如何加载到VS17资源并在Opencv项目中使用?此类资源文件应存储在项目结构中的什么位置?万事如意。
标签: c++ opencv dll compilation haar-classifier