1

私はopencvとc ++を初めて使用し、c ++を使用して、私のデルファイアプリでopencvを使用することを余儀なくされました。したがって、この関数をdllからエクスポートして、画像処理後にポインターをマットに変換してバイトに戻します。これは私が使用している関数です:

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!」というメッセージが表示されます。誰かが私を助けてくれることを願っています、どうもありがとう。

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 に答える