OpenCV初始化4通道1行5列矩阵遇(-215)异常,求排查
问题分析与解决办法
嗨,这个问题我太熟悉了,核心是你用的cv::Mat_模板参数和指定的通道类型不匹配,导致OpenCV内部计算元素位置时出错,抛出了越界异常!
错误原因拆解
你写的代码里:
cv::Mat_<char> samples(1,5,CV_8UC4);
这里有两个冲突点:
cv::Mat_<char>是单通道的模板类,<char>已经明确了每个元素是单通道的char类型;- 但你后面又传入了
CV_8UC4,这是4通道的8位无符号字符类型(UC=unsigned char)。
这种矛盾会让OpenCV在计算元素内存位置时混乱,最终触发unsigned(i1 * channels) < unsigned(size.p[1] * channels())的越界检查异常。
正确的写法有两种
方法一:用Mat_配合对应多通道类型
Mat_的模板参数需要直接对应多通道元素的类型,4通道8位无符号字符对应的是cv::Vec4b(它本质是Vec<uchar,4>的别名),所以代码应该改成:
cv::Mat_<cv::Vec4b> samples(1, 5); // 不需要再传CV_8UC4,Vec4b已经对应该类型 samples.at<cv::Vec4b>(0,0) = { 1, 2, 3, 4 }; samples.at<cv::Vec4b>(0,1) = { 1, 2, 3, 4 }; samples.at<cv::Vec4b>(0,2) = { 1, 2, 3, 4 }; samples.at<cv::Vec4b>(0,3) = { 1, 2, 3, 4 }; // 继续赋值第5个元素
方法二:直接用cv::Mat初始化
如果你更习惯用普通的Mat,写法是这样的:
cv::Mat samples(1, 5, CV_8UC4); samples.at<cv::Vec4b>(0,0) = { 1, 2, 3, 4 }; // 后续赋值和上面一致
额外小提示
注意char和uchar的区别:CV_8UC4里的是无符号字符,而char在大多数编译器里是有符号的,即使你强行用Mat_<char>配CV_8UC4,也会因为类型不匹配埋下隐患,用Vec4b才是和CV_8UC4完全匹配的正确选择。
内容的提问来源于stack exchange,提问作者infoclogged
相关产品推荐
相关产品推荐

