初学一门技术,肯定会遇到各种各样的问题,这里把我初学时遇到的问题进行整理并给出解决方案,希望能够对大家有所帮助。

1.CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1());处出现未经处理的异常

错误如图所示:

VS opencv出现0X0007FFF14793B29有未处理的异常 opencv未经处理的异常_visual studio


源代码:

VS opencv出现0X0007FFF14793B29有未处理的异常 opencv未经处理的异常_解决方案_02

这里错误的主要原因是利用Mat类建立的src对象是8位无符号uchar类型,而利用at访问的确实int类型,类型出错导致程序报错。

修改方案:

将int改为uchar,即:

VS opencv出现0X0007FFF14793B29有未处理的异常 opencv未经处理的异常_c++_03

ok,程序正常运行。

【注】:
at后的类型一旦填写出错就会报错误:
CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1());处出现未经处理的异常

所以如果你产生了这种错误,一定要回头去看是不是类型出错!

【拓展】:这里重点介绍一下at的用法:

at函数的功能是访问矩阵元素,比如:

Mat src(300, 400, CV_8UC1, Scalar(255));
int elem = src.at<uchar>(0, 0);
cout << elem << endl;

该代码含义是:创建一个300*400的8为uchar类型单通道Mat类型数据,且颜色赋值为255,输出第(0,0)的值。
显然我们知道,输出结果应该为255。

但是at后面类型是怎么确定的呢?当三通道时,访问元素应该怎么做呢?

【解释】:

src.at(i,j):取出灰度图像中i行j列的点。
src.at(i,j)[k]:取出彩色图像中i行j列第k通道的颜色点。k∈[0,2]
其中uchar,Vec3b都是图像像素值的类型,不要对Vec3b这种类型感觉害怕,其实在core里它是通过typedef Vec<T,N>来定义的,N代表元素的个数,T代表类型。

2.0x00007FFF71D63B29 处(位于 OpenCV_test.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x00000019982FE618 处。

错误如图所示:

VS opencv出现0X0007FFF14793B29有未处理的异常 opencv未经处理的异常_解决方案_04


解决方案:

上述错误可能是大家学习OpenCV最经常遇到的一种错误,其一般是由于图像加载失败或者图像通道错误等诸多原因引起。

因此,如果发生该错误,首先检查原图像,错误肯定围绕图像而产生的。