本文介绍了如何在 OpenCV 中用零填充矩阵?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!
问题描述
下面的代码导致异常.为什么?
The code below causes an exception. Why?
#include <opencv2/core/core.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void main() {
try {
Mat m1 = Mat(1,1, CV_64F, 0);
m1.at<double>(0,0) = 0;
}
catch(cv::Exception &e) {
cerr << e.what() << endl;
}
}
错误如下:
OpenCV Error: Assertion failed (dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] && (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) && ((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3
) - 1))*4) & 15) == elemSize1()) in unknown function, file %OPENCV_DIR%uildincludeopencv2coremat.hpp, line 537
更新
如果跟踪这段代码,我看到构造函数行调用了构造函数
If tracing this code, I see that constructor line calls the constructor
inline Mat::Mat(int _rows, int _cols, int _type, void* _data, size_t _step)
为什么?这个原型有 5 个参数,而我提供了 4 个参数.
Why? This prototype has 5 parameters, while I am providing 4 arguments.
推荐答案
因为最后一个参数是可选的,而且数据指针应该指向适当的地方:
Because the last parameter is optional and also the data pointer should point somewhere appropriate:
//inline Mat::Mat(int _rows, int _cols, int _type, void* _data, size_t _step)
double mydata[1];
Mat m1 = Mat(1,1, CV_64F, mydata);
m1.at<double>(0,0) = 0;
但最好直接使用这个基于模板的构造函数:
But better do it directly with this template-based constructor:
//inline Mat::Mat(int _rows, int _cols, int _type, const Scalar& _s)
Mat m1 = Mat(1,1, CV_64F, cvScalar(0.));
//or even
Mat m1 = Mat(1,1, CV_64F, double(0));
这篇关于如何在 OpenCV 中用零填充矩阵?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!
The End


大气响应式网络建站服务公司织梦模板
高端大气html5设计公司网站源码
织梦dede网页模板下载素材销售下载站平台(带会员中心带筛选)
财税代理公司注册代理记账网站织梦模板(带手机端)
成人高考自考在职研究生教育机构网站源码(带手机端)
高端HTML5响应式企业集团通用类网站织梦模板(自适应手机端)