1

我是 opencv 和 c++ 的新手,我被迫在我的 delphi 应用程序上使用 c++ 来使用 opencv。所以我从 dll 中导出这个函数,以便在图像处理后将指向 mat 的指针转换回字节。这是我使用的功能:

DllExport unsigned char* MatToBytes(cv::Mat *src, int &outLen)
{ 
    cv::Mat &matCvrt = *src;
    std::vector<unsigned char> *poutVet = new std::vector<unsigned char>();
    std::vector<unsigned char> &outVet = *poutVet;
    imencode(".png", matCvrt, outVet);
    outLen = outVet.size();
    unsigned char* outBytes;
    outBytes = new unsigned char[outVet.size()];
    std::copy(outVet.begin(), outVet.end(), outBytes);
    vector<unsigned char>().swap(outVet);
    return outBytes;
}

我现在已经研究了一整天,但找不到答案。如果我删除代码

vector<unsigned char>().swap(outVet);

它可以正常工作,但会泄漏内存。如果我把它放在代码中,我会得到“调试断言失败!” 希望有人能帮帮我,非常感谢。

4

2 回答 2

0

不要使用指向std::vector. 这个类已经管理内存分配和释放:

DllExport unsigned char* MatToBytes(cv::Mat *src, int &outLen)
{ 
    std::vector<unsigned char> outVet;
    imencode(".png", *src, outVet);
    outLen = outVet.size();
    unsigned char* outBytes;
    outBytes = new unsigned char[outVet.size()];
    std::copy(outVet.begin(), outVet.end(), outBytes);
    return outBytes;
}
于 2013-08-18T10:19:41.420 回答
0

我自己修复了它,我在 Visual Studio 2010 上尝试过它,它工作正常。我使用的是opencv的vc11库,所以现在我只需要在visual studio 2012上构建opencv。

于 2013-08-18T17:34:41.123 回答