2016-06-28 172 views
1

我想使用下面的代碼使用imencode函數opencv(2.4.10)將BMP圖像編碼爲jpg。在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調試庫,同時在發佈模式下釋放庫。同時檢查OpenCV是否與您的項目使用相同的編譯器構建 – Miki

回答

2

我很確定這個問題可能是使用交叉msvc版本的原因。比如說,你正在使用visual studio 10編譯代碼,並使用msvc 11或msvc 12的opencv dll & lib路徑。當我們在環境路徑中添加opencv目錄時,大多數情況會發生。我發現在使用visual studio 10時使用blob檢測的類似問題,並使用opencv vc11文件夾作爲lib & dll路徑。將其更改爲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,Debug模式)上也沒有任何問題。 – Sunreef

+0

@gmaruf確保您使用的是OpenCV調試庫。在調試模式下使用發佈庫可能(並且幾乎總是)會導致內存損壞錯誤,比如您得到的錯誤。 – Sunreef

0

由於opencv鏈接爲動態庫,因此您需要確保在相同的堆地址空間中分配和釋放內存。

BUF - 沒有CV :: imencode的內部分配內存(內OpenCV的dll文件),但是當你鬆開例如它的範圍(在其他堆空間)

例如,你需要分配足夠多的內存在將矢量容器放入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);