gpt4 book ai didi

c# - 从 C# 调用 C++ DLib 导致错误分配异常

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:31 25 4
gpt4 key购买 nike

如果我直接在 C++ 中运行我的代码,它运行得很好。但是,当我从 C# 调用它时,我收到一条错误的分配消息。我的 C++ 经验真的很低,但根据我阅读和修改的所有内容,我觉得这应该可行。

我的情况

通过面部识别传递图像路径,然后将结果保存/序列化到磁盘并返回图像在数组中的索引(函数:int AddImageToCollection)

如果我使用 main 函数运行我的代码,我会得到完美的结果(图 1),但如果我通过 C# 运行它(图 2),我会得到以下结果:

我得到日志 4-1 而不是日志 4-2,并且 e.what() 中的唯一错误是“错误分配”。我创建了一个无参数测试函数,该函数被硬编码为返回 5 并且可以正常工作,因此它与这个更复杂的函数隔离开来,我相信它必须与将数据传递给 const char* 相关。

图一

frontal_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;
}

face_descriptors.push_back(net(faces[faces.size() - 1]));

serialize("face_descriptors_in_collection.dat") << face_descriptors;

return faces.size() - 1; //Return Image's Index in Array
}

图2

    [DllImport("FacialRecognition.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int TestImageToCollection();

[DllImport("FacialRecognition.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern int AddImageToCollection([MarshalAs(UnmanagedType.LPStr)]string imagePath);

private void Form1_Load(object sender, EventArgs e)
{
int whatIsMyTestIdx = TestImageToCollection();

int whatIsMyIdx = AddImageToCollection(@"C:\images\Me.jpg");

MessageBox.Show(whatIsMyIdx.ToString());
}

最佳答案

你需要修改你的代码如下

在动态链接库中

extern "C"__declspec(dllexport) int AddImageToCollection(LPCWSTR imagePath)
{
....
//如果调用接受 ANSI 字符串的函数,则可能需要将 Unicode 字符串转换为 ANSI
}

在 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。如果它们不同,您应该调整正确的 import/export 申报单。

关于c# - 从 C# 调用 C++ DLib 导致错误分配异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51857061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com