如果我直接在 C++ 中运行我的代码,它运行得很好。但是,当我从 C# 调用它时,我收到一条错误的分配消息。我的 C++ 经验非常低,但根据我阅读和修改的所有内容,我觉得这应该可行。我的情况通过面部识别传递图像路径,然后将结果保存/序列化到磁盘并返回图像在数组中的索引(函数:int AddImageToCollection)如果我使用 main 函数运行我的代码,我会得到完美的结果(图 1),但如果我通过 C# 运行它(图 2),我会得到以下结果:我得到的是日志 4-1 但不是日志 4-2,而且 e.what() 中唯一的错误是“分配错误”。我创建了一个无参数测试函数,它被硬编码为返回 5 并且可以工作,因此它与这个更复杂的函数隔离,我相信它必须与将数据传递给 const char* 相关。图1frontal_face_detector detector = get_frontal_face_detector();shape_predictor sp;anet_type net;bool fileExists(const std::string& name) {ifstream f(name.c_str());return f.good();}void log(std::string name) {}int main(int argc, char** argv) try{string str = "C:\\images\\Me.jpg";const char* c = str.c_str();int whatIsMyIdx = AddImageToCollection(c);cout << whatIsMyIdx << endl;cin.get();}catch (std::exception& e){ cout << e.what() << endl;}int AddImageToCollection(const char* imagePath){ deserialize("shape_predictor_5_face_landmarks.dat") >> sp; deserialize("dlib_face_recognition_resnet_model_v1.dat") >> net; matrix<rgb_pixel> image; string imagePathStr(imagePath); load_image(image, imagePathStr); std::vector<matrix<rgb_pixel>> faces; if (fileExists("faces_in_collection.dat")) { deserialize("faces_in_collection.dat") >> faces; } auto facesDetected = detector(image); if (facesDetected.size() == 0) { return -1; } if (facesDetected.size() > 1) { return -2; } auto shape = sp(image, facesDetected[0]); log("4-1"); matrix<rgb_pixel> face_chip; extract_image_chip(image, get_face_chip_details(shape, 150, 0.25), face_chip); log("4-2"); faces.push_back(move(face_chip)); serialize("faces_in_collection.dat") << faces; std::vector<matrix<float, 0, 1>> face_descriptors; if (fileExists("face_descriptors_in_collection.dat")) { deserialize("face_descriptors_in_collection.dat") >> face_descriptors; }
1 回答
绝地无双
TA贡献1946条经验 获得超4个赞
你需要调整你的代码如下
在 DLL 中
extern "C" __declspec(dllexport) int AddImageToCollection(LPCWSTR imagePath)
{
....
// you may need to convert from Unicode string to ANSI if you are calling function that accept ANSI strings
}
并在 c# 应用程序中
[DllImport("FacialRecognition.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] public static extern int AddImageToCollection(string imagePath);
并调用你的函数
int whatIsMyIdx = AddImageToCollection(@"C:\\images\\Me.jpg");
为了使上述工作正常,不要忘记将应用程序和 Dll 编译为 Unicode。如果它们不同,您应该调整正确的出口和进口申报。
- 1 回答
- 0 关注
- 269 浏览
添加回答
举报
0/150
提交
取消