个人网站运营怎么做,网站开发属于知识产权吗,做门头上那个网站申报,国际室内设计公司排名问题描述
在OpenCV中#xff0c;将输入的图像转到Lab颜色空间中#xff0c;使用cv::split 函数分离L#xff0c;A#xff0c;B三个通道的时候发生内存异常#xff0c;报错。
cv::split(LabImg, std::vectorcv::Mat{L, A, B});报错信息#xff1a; 0x00007FFAA1…问题描述
在OpenCV中将输入的图像转到Lab颜色空间中使用cv::split 函数分离LAB三个通道的时候发生内存异常报错。
cv::split(LabImg, std::vectorcv::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::vectorcv::Mat channels(3);
cv::split(LabImg, channels);
L channels[0]; // L通道
A channels[1]; // A通道
B channels[2]; // B通道