如何填充矩阵与零在OpenCV
How to fill Matrix with zeros in OpenCV?
下面的代码导致一个异常。为什么?
#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%buildincludeopencv2coremat.hpp, line 537
如果跟踪这段代码,我看到构造函数行调用了构造函数
inline Mat::Mat(int _rows, int _cols, int _type, void* _data, size_t _step)
为什么?这个原型有5个参数,而我提供了4个参数。
如何填充矩阵与零在OpenCV?
要用0填充已有的Mat
对象,可以使用Mat::zeros()
Mat m1 = ...;
m1 = Mat::zeros(1, 1, CV_64F);
要初始化一个Mat
,使其只包含0,您可以将值为0
的标量传递给构造函数:
Mat m1 = Mat(1,1, CV_64F, 0.0);
// ^^^^double literal
你的版本失败的原因是传递0
作为第四个参数比传递标量的void*
更匹配重载
use cv::mat::setto
img.setTo(简历::标量(redVal, greenVal blueVal))
因为最后一个参数是可选的,而且数据指针应该指向合适的位置:
//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;
但是最好直接使用这个基于模板的构造函数:
//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));
您可以选择填充零数据或创建零垫。
-
使用setTo()填充零数据:
img.setTo(Scalar::all(0));
-
使用zeros()创建零数据:
img = zeros(img.size(), img.type());
如果你更喜欢使用模板编程,你也可以这样做…
template<typename _Tp>
... some algo ...
cv::Mat mat = cv::Mat_<_Tp>::zeros(rows, cols);
mat.at<_Tp>(i, j) = val;
您可以使用此方法在已经包含数据的Mat对象中填充零:
image1 = Scalar::all(0);
例如,如果你这样使用:
Mat image,image1;
image = imread("IMG_20160107_185956.jpg", CV_LOAD_IMAGE_COLOR); // Read the file
if(! image.data ) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl ;
return -1;
}
cvtColor(image,image1,CV_BGR2GRAY);
image1 = Scalar::all(0);
它会工作的很好。但是你不能将此用于未初始化的Mat。为此,你可以使用上面答案中提到的其他选项,如
Mat drawing = Mat::zeros( image.size(), CV_8UC3 );
> img=Mat:: 0 (size of image,CV_8UC3); 如果你希望它是一个图像img1 img =垫::0 (img1.size CV_8UC3);
我想你说的是填充一些现有垫的零?这个怎么样?:)
相关文章:
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 在c++中用vector填充一个简单的动态数组
- 尝试导入pybind-opencv模块时出现libgtk错误
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 如何使用用户输入在C++中正确填充2D数组
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- OPENCV异常填充Conconvexppoly
- 用图像或视频在OpenCV(OpenFrameWorks)中填充Blobs
- 如何在OpenCV中用OpenNi的deepPixel数组填充矩阵
- OpenCV填充垫,与VideoWriter一起使用
- OpenCV泛洪填充多个种子
- OpenCV:设置图像边界,不带填充
- 如何选择一个像魔杖一样的区域,并使用OpenCV进行泛洪填充
- 如何填充矩阵与零在OpenCV
- Opencv Java填充convexpoly和approxPolyDP函数
- 如何在OpenCV中填充图像矢量?c++
- Opencv:如何用距离中心的距离填充椭圆形状
- OpenCV填充洞二进制垫为多个对象