2015-04-21 64 views
-1

我有这样的代码:为什么这段代码在cvtColor上崩溃?

void * imageBuffer = reinterpret_cast<void *>(exposureBuffer + imageHeader->imgoffset); 
cv::Mat imageRaw(imageHeader->height, imageHeader->width, CV_8UC1, imageBuffer); 
cv::Mat imageColour; 
cv::cvtColor(imageRaw, imageColour, cv::COLOR_BayerGR2BGR); 

当我运行这一点,在这条线将停止调试器:

cv::Mat imageColour; 

我可以看到imageRaw中有一个有效的图像(我可以看到图像图像视图,它是一个有效图像)

但随后在这条线的应用程序崩溃:

cv::cvtColor(imageRaw, imageColour, cv::COLOR_BayerGR2BGR); 

并且似乎创建了一个mat文件,但没有为它分配足够的内存。

的错误信息是:

Unhandled exception at 0x00007FF7503F992B in test_PictureProcessing.exe: 0xC0000005: Access violation reading location 0x0000000000000023. 

我使用的OpenCV 3.我有类似的代码成功地运行在的OpenCV 2.

EDIT1

我改变了代码到这一个确保imagebuffer是一个有效的缓冲区,并且我不初始化imageColour的事实不是问题:

void *imageBuffer = new char[imageHeader->height* imageHeader->width]; 
cv::Mat imageRaw(imageHeader->height, imageHeader->width, CV_8UC1, imageBuffer); 
cv::Mat imageColour = imageRaw.clone(); 

但我仍然得到在这一行错误:

cv::Mat imageColour = imageRaw.clone(); 

编辑2

这也崩溃了!

cv::Mat imageRaw(imageHeader->height, imageHeader->width, CV_8UC1); 
cv::Mat imageColour = imageRaw.clone(); 

为什么这个简单的代码崩溃?

+0

'imageBuffer' null(或非常小)?那么'exposureBuffer'呢? – Mat

+1

我对OpenCV并不熟悉,但我猜想,在用作cvtColor中的输出参数之前,您必须初始化imageColor。 – MikeMB

+0

@Mat不,他们足够大的图像。另外,当我在Visual Studio中使用图像视图时,我可以看到原始图像,因此缓冲区有效且足够大。但我会做一个测试,以确保它足够大。 – mans

回答

0

我发现这个问题很奇怪!

我忘了在添加opencv.hpp到我的源文件后,它完美的工作。

这很奇怪,因为我没有得到任何编译错误,但我得到了运行时错误。

如果你看到你的openCV行为奇怪,请确保你包含了opencv.hpp到你的源代码。它可以帮助你解决你的问题! CroCo提到,并不是所有的问题都来自错过这个标题。

+0

“如果您发现openCV的行为异常,请确保您将opencv.hpp包含在您的源代码中。”不是所有的问题都来自错过这个标题。 – CroCo

+0

@CroCo更新的答案突出显示了这一点。 – mans