2016-06-28 26 views
1

次のコードを使用して、imencode opencv(2.4.10)の機能を使用してjpgにbmpイメージをエンコードしようとしています。opencv imencode中にデバッグアサーションが失敗しました

void test() 
{ 
    cv::Mat img = cv::imread("C:\\Users\\Maruf\\Pictures\\bingo.bmp", CV_LOAD_IMAGE_COLOR); 
    cv::vector<uchar> buf; 
    cv::imencode(".jpg", img, buf); 
    return; 
} 

return文では、次の例外がスローされます。

これはなぜ発生していますか?これをどのように修正できますか?

+0

コードが正しいようです。その使用はあなたの設定にあるようです。デバッグモードでOpenCVデバッグライブラリにリンクし、リリースモードでlibsをリリースするようにしてください。また、OpenCVがあなたのプロジェクトと同じコンパイラで構築されていることを確認してください。 – Miki

答えて

2

私は確かに問題がクロスmsvcバージョンを使用する原因になる可能性があります。 Visual Studio 10でコードを構築し、openvv dll & libパス(msvc 11またはmsvc 12)を使用しています。ほとんどの場合、環境パスにopencvディレクトリを追加すると発生します。私は、Visual Studio 10を使用していて、libdllパスのopencv vc11フォルダを使用していたブロブ検出でも同様の問題を発見しました。それをvc10に変更した後、完全に機能しました。

環境パスにopencvが追加されている場合は、変更してVisual Studioを再起動してください。また、プロジェクトのlibパスも同様に変更する必要があります。

+0

ありがとうございました。 – qmaruf

0

cv::vector<uchar> buf;std::vector<uchar> buf;に変更してみてください。名前空間cvにはvectorオブジェクトがありません。

+0

うまくいかない。同じエラー。 – qmaruf

+0

@qmaruf bmpファイルが存在することを確認しましたか?私は自分の側でimencodeを実行するのに問題はありません(OpenCV 3.1.0)。また、returnステートメント(Visual Studio 2013、デバッグモード)にも問題はありません。 – Sunreef

+0

@gmaruf OpenCVデバッグライブラリを使用していることを確認してください。デバッグモードでリリースライブラリを使用すると、ほとんどの場合、取得したようなメモリ破損エラーが発生する可能性があります。 – Sunreef

0

ダイナミックライブラリとしてopencvがリンクされているため、同じヒープアドレス空間にメモリを割り当て、割り当てを解除する必要があります。

BUF - あなたの例では、例えば(OpenCVのDLLの内側)imencode :: CVの内側にメモリを割り当てるが、(他のヒープ空間の)範囲外のときにそれを解放し

なかった、あなたがenoughtメモリを割り当てる必要がありますopencv関数にベクトルコンテナを入れる前に cv::Mat img = cv::imread("C:\Users\Maruf\Pictures\bingo.bmp", CV_LOAD_IMAGE_COLOR); //for instance allocate 10Mb. std::vector buf(10 * 1024 * 1024); cv::imencode(".jpg", img, buf);

関連する問題