OpenCV mat::at 抛出异常
Posted
技术标签:
【中文标题】OpenCV mat::at 抛出异常【英文标题】:OpenCV mat::at throwing exception 【发布时间】:2013-12-08 06:28:45 【问题描述】:此代码仅在调试模式下引发异常。在 Release 中,它给出的预期输出为 0。
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
Mat image;
image = Mat::zeros(5,5,CV_8UC1);
try
cout<< image.at<unsigned int>(1,1)<<"\n";
catch(Exception ex)
cout<< ex.msg;
cin.get();
return 0;
抛出异常的文本是
OpenCV 错误:断言失败 (dims ::channels) > ((DataType<_tp>::depth) & ((1
OpenCV的版本是2.4.6,可执行文件是动态链接到调试库的。
【问题讨论】:
我不是 OpenCv 专家,但也许您将 Matrix 元素定义为unsigned char
但您要求的是 unsigned int
并且 mat.hpp 第 537 行是什么?跨度>
感谢您的回复。将模板参数更改为 unsigned char 会使程序不输出任何内容(也不例外)
Mat.hpp 的第 533 到 539 行是template<typename _Tp> inline _Tp& Mat::at(int i0, int i1) CV_DbgAssert( dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] && (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) && CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1()); return ((_Tp*)(data + step.p[0]*i0))[i1];
你能在那个断言上放一个断点,看看那个表达式的哪个子句是false
吗?
不完全确定如何做到这一点。 VS 会按顺序遍历每个子句吗?'
【参考方案1】:
发生异常是因为您将 image 定义为 unsigned char 数组,但在 at 函数中使用了 unsigned int。 at 必须获得与您的矩阵相同的类型,即无符号字符。否则它会抛出你看到的异常。
当您向 cout 函数提供 unsigned char 时,它假定您正在尝试打印字符 (char) 而不是数字。如果你想查看它的数值,将其转换为 int:
cout (1,1)
【讨论】:
以上是关于OpenCV mat::at 抛出异常的主要内容,如果未能解决你的问题,请参考以下文章
Android findContours 上的 OpenCV 抛出异常
OpenCV SVM 在火车上抛出异常,“错误参数(只有一个类)”
c# emgu/opencv 使用抛出异常 - 试图读取或写入受保护的内存
Emgu CvInvoke.CalcHist 抛出异常 OpenCV: 0 <= _rowRange.start && _rowRange.start <= _rowRan