问题描述
在OpenCV中,将输入的图像转到Lab颜色空间中,使用cv::split 函数分离L,A,B三个通道的时候发生内存异常,报错。
cv::split(LabImg, std::vector<cv::Mat>{L, A, B});
报错信息:
0x00007FFAA1CDCF19 处(位于 Test.exe 中)引发的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x0000006471FDD9D8 处。
0x00007FFAA1CDCF19 处(位于 Test.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x0000006471FDD9D8 处。
原因分析:
在 OpenCV 中,cv::split 函数用于将多通道的图像分割成单独的通道。然而,这个内存错误很可能是由于在 cv::split 函数的调用中直接修改 std::vectorcv::Mat 的内容,而这个 std::vectorcv::Mat 是通过临时的初始化列表创建的。
std::vectorcv::Mat{L, A, B} 创建了一个临时的 std::vectorcv::Mat 实例,它包含了 L, A, B 这三个 cv::Mat 对象的引用。
然而,这个临时对象在 cv::split 函数调用结束后就会被销毁,这会导致 cv::split 试图写入一个已经不再有效的内存位置,从而引发内存错误。
解决方案:
解决这个问题,应该首先创建一个持久的 std::vectorcv::Mat 对象,然后再将其传递给 cv::split 函数。
// 创建一个包含3个cv::Mat的向量
std::vector<cv::Mat> channels(3);
cv::split(LabImg, channels);
L = channels[0]; // L通道
A = channels[1]; // A通道
B = channels[2]; // B通道