我是opencv和c++的新手,我被迫精简c++以在我的delphi应用程序上使用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);
它可以正常工作,但会泄漏内存。如果将其放入代码中,则会收到“调试断言失败!”的消息。希望有人能帮助我,非常感谢。
最佳答案
不要使用指向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;
}