最近编写如下代码,运行时窗口一闪而过,最后终端报出错误Assertion failed (!fixedSize() || ((Mat*)obj)->size.operator()() == _sz) in create
。
#include
#include
#include
int main()
{
const std::string name = "image";
cv::namedWindow(name, cv::WINDOW_AUTOSIZE);
int w = 100, h = 300, y = 50;
// 黑图白线
cv::Mat img1(w, h, CV_8UC1, cv::Scalar(0)); // cv::Mat img = cv::Mat::zeros(w, h, CV_8UC1);
cv::line(img1, cv::Point(0, y), cv::Point(img1.cols, y), cv::Scalar(255), 2);
// 白图黑线
cv::Mat img2(w, h, CV_8UC1, cv::Scalar(255)); // cv::Mat img = cv::Mat::ones(w, h, CV_8UC1) * 255;
cv::line(img2, cv::Point(0, y), cv::Point(img2.cols, y), cv::Scalar(0), 2);
// 蓝图绿线
cv::Mat img3(w, h, CV_8UC3, cv::Scalar(255, 0, 0));
cv::line(img3, cv::Point(0, y), cv::Point(img3.cols, y), cv::Scalar(0, 255, 0), 2);
// 三张图片合并到一张图片上显示
cv::Mat img(3 * w, h, CV_8UC3);
cv::cvtColor(img1, img(cv::Rect(0, 0, w, h)), cv::COLOR_GRAY2BGR);
cv::cvtColor(img2, img(cv::Rect(w, 0, w, h)), cv::COLOR_GRAY2BGR);
img3.copyTo(img(cv::Rect(2 * w, 0, w, h)));
cv::imshow(name, img);
cv::waitKey();
return 0;
}
终端错误提示:
OpenCV: terminate handler is called! The last OpenCV error is:
OpenCV(3.4.10) Error: Assertion failed (!fixedSize() || ((Mat*)obj)->size.operator()() == _sz) in create, file D:\opencv3410\sources\modules\core\src\matrix_wrap.cpp, line 1194
类似的错误:
OpenCV: terminate handler is called! The last OpenCV error is:
OpenCV(3.4.10) Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) in Mat, file D:\opencv3410\sources\modules\core\src\matrix.cpp, line 466
首先,由错误提示中的Assertion failed (!fixedSize() || ((Mat*)obj)->size.operator()() == _sz) in create
,以及调试时报错的代码推断错误原因是:cv::Rect
表示的范围与图片img1
的尺寸不相符。
cv::cvtColor(img1, img(cv::Rect(0, 0, w, h)), cv::COLOR_GRAY2BGR);
cv::cvtColor(img2, img(cv::Rect(w, 0, w, h)), cv::COLOR_GRAY2BGR);
img3.copyTo(img(cv::Rect(2 * w, 0, w, h)));
然后,分别显示图片img1
和img(cv::Rect(0, 0, w, h))
,可发现两张图片宽高正好相反。
#include
#include
#include
int main()
{
const std::string name = "image";
cv::namedWindow(name, cv::WINDOW_AUTOSIZE);
int w = 100, h = 300, y = 50;
// 黑图白线
cv::Mat img1(w, h, CV_8UC1, cv::Scalar(0)); // cv::Mat img = cv::Mat::zeros(w, h, CV_8UC1);
cv::line(img1, cv::Point(0, y), cv::Point(img1.cols, y), cv::Scalar(255), 2);
// 白图黑线
cv::Mat img2(w, h, CV_8UC1, cv::Scalar(255)); // cv::Mat img = cv::Mat::ones(w, h, CV_8UC1) * 255;
cv::line(img2, cv::Point(0, y), cv::Point(img2.cols, y), cv::Scalar(0), 2);
// 蓝图绿线
cv::Mat img3(w, h, CV_8UC3, cv::Scalar(255, 0, 0));
cv::line(img3, cv::Point(0, y), cv::Point(img3.cols, y), cv::Scalar(0, 255, 0), 2);
// 三张图片合并到一张图片上显示
cv::Mat img(3 * w, h, CV_8UC3);
cv::imshow("1", img1);
cv::imshow("2", img(cv::Rect(0, 0, w, h)));
// cv::cvtColor(img1, img(cv::Rect(0, 0, w, h)), cv::COLOR_GRAY2BGR);
// cv::cvtColor(img2, img(cv::Rect(w, 0, w, h)), cv::COLOR_GRAY2BGR);
// img3.copyTo(img(cv::Rect(2 * w, 0, w, h)));
// cv::imshow(name, img);
cv::waitKey();
return 0;
}
最后,检查前面的代码发现错误原因是:定义和初始化图片错误,w
和h
使用颠倒。
// 构造函数,rows对应h,cols对应w
cv::Mat(int rows, int cols, int type, const Scalar&s)
// 错误代码
cv::Mat img1(w, h, CV_8UC1, cv::Scalar(0));
#include
#include
#include
int main()
{
const std::string name = "image";
cv::namedWindow(name, cv::WINDOW_AUTOSIZE);
int w = 300, h = 100, y = 50;
// 黑图白线
cv::Mat img1(h, w, CV_8UC1, cv::Scalar(0)); // cv::Mat img = cv::Mat::zeros(w, h, CV_8UC1);
cv::line(img1, cv::Point(0, y), cv::Point(img1.cols, y), cv::Scalar(255), 2);
// 白图黑线
cv::Mat img2(h, w, CV_8UC1, cv::Scalar(255)); // cv::Mat img = cv::Mat::ones(w, h, CV_8UC1) * 255;
cv::line(img2, cv::Point(0, y), cv::Point(img2.cols, y), cv::Scalar(0), 2);
// 蓝图绿线
cv::Mat img3(h, w, CV_8UC3, cv::Scalar(255, 0, 0));
cv::line(img3, cv::Point(0, y), cv::Point(img3.cols, y), cv::Scalar(0, 255, 0), 2);
// 三张图片合并到一张图片上显示
cv::Mat img(3 * h, w, CV_8UC3);
cv::cvtColor(img1, img(cv::Rect(0, 0, w, h)), cv::COLOR_GRAY2BGR);
cv::cvtColor(img2, img(cv::Rect(0, h, w, h)), cv::COLOR_GRAY2BGR);
img3.copyTo(img(cv::Rect(0, 2 * h, w, h)));
cv::imshow(name, img);
cv::waitKey();
return 0;
}
1、OpenCV出现Assertion failed
之类的错误,一般都是如数组、矩阵、ROI等数据超出实际有效范围。
2、OpenCV中cols
表示列数,对应x
,w
等横坐标;rows
表示行数,对应y
,h
等纵坐标。使用时需特别注意参数中cols
与rows
的先后顺序。