我是opencv和c ++的新手,我不得不在我的delphi app上使用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);
它会正常工作,但泄漏记忆。如果我把它放在代码中,我会得到“Debug Assertion Failed!”希望有人可以帮助我,非常感谢。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
我自己修好了,我在visual studio 2010上尝试了它并且工作正常。我使用的是opencv的vc11库,所以现在我只需要在visual studio 2012上构建opencv。