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&lt;typename _Tp&gt; inline _Tp&amp; Mat::at(int i0, int i1) CV_DbgAssert( dims &lt;= 2 &amp;&amp; data &amp;&amp; (unsigned)i0 &lt; (unsigned)size.p[0] &amp;&amp; (unsigned)(i1*DataType&lt;_Tp&gt;::channels) &lt; (unsigned)(size.p[1]*channels()) &amp;&amp; CV_ELEM_SIZE1(DataType&lt;_Tp&gt;::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 抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

opencv:使用 cout 和 Mat 对象抛出异常

Android findContours 上的 OpenCV 抛出异常

基于 OpenCV C++ 光流的分割代码抛出异常

OpenCV SVM 在火车上抛出异常,“错误参数(只有一个类)”

c# emgu/opencv 使用抛出异常 - 试图读取或写入受保护的内存

Emgu CvInvoke.CalcHist 抛出异常 OpenCV: 0 <= _rowRange.start && _rowRange.start <= _rowRan