OpenCV Error:Assertion failed ...

来源:互联网 发布:怎么自学成为程序员 编辑:程序博客网 时间:2024/05/16 11:42

在编写程序时遇见了两个错误:

1.在用函数cornerSubPix(image, corners, winSize, zeroZone, criteria);求亚像素角点时遇见错误:


Assertion failed (ncorners >= 0 && corners.depth() == CV_32F) in cornerSubPix

原因是:

std::vector<cv::Point> corners  应该为:std::vector<cv::Point2f> corners


2.在求灰度图像某个点的灰度值时


//函数 double getidata()提取灰度图像固定地方灰度值
double getidata(Mat p, int x, int y)
{

Scalar intensity;

intensity = p.at<uchar>(x, y);

return intensity.val[0];

}

出现错误:

OpenCV Error: Assertion failed <dims <=2 && data && <unsigned >i0 < <unsigned>size.p[0] && <unsigned >< i1


原因是


经过调试发现发生这种错误的原因在于,你访问构造矩阵时越界了,所以报错,,例如:


cv::Mat mat1 = cv::Mat::zeros(480,640,CV_8UC1);


mat1.at<uchar>(481,643)
你构造的mat1为640X480的矩阵,你却访问了643X481那就肯定会出错,所以在每次访问之前一定要 记得加上


if(i>=0 && i<mat1.cols && j>=0 && j< mat1.rows)


mat1.at<uchar>(j,i);


这样 就可以保证你访问的元素在这个行,列之内了。


即程序可改为:

double getidata(Mat p, int x, int y)
{
Scalar intensity;
if (x >= 0 && x<p.cols && y >= 0 && y< p.rows)
 intensity = p.at<uchar>(y, x);//
return intensity.val[0];
}

0 0