2016-06-28 195 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);