我有这样的代码:为什么这段代码在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();
为什么这个简单的代码崩溃?
'imageBuffer' null(或非常小)?那么'exposureBuffer'呢? – Mat
我对OpenCV并不熟悉,但我猜想,在用作cvtColor中的输出参数之前,您必须初始化imageColor。 – MikeMB
@Mat不,他们足够大的图像。另外,当我在Visual Studio中使用图像视图时,我可以看到原始图像,因此缓冲区有效且足够大。但我会做一个测试,以确保它足够大。 – mans