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;
}
}
Error is follows:
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%\build\include\opencv2\core\mat.hpp, line 537
UPDATE
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)
Why? This prototype has 5 parameters, while I am providing 4 arguments.
This question is related to
c++
opencv
matrix
initialization
You can use this to fill zeroes in a Mat object already containing data:
image1 = Scalar::all(0);
For eg, if you use it this way:
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);
It will work fine. But you cannot use this for uninitialised Mat. For that you can go for other options mentioned in above answers, like
Mat drawing = Mat::zeros( image.size(), CV_8UC3 );
Mat img;
img=Mat::zeros(size of image,CV_8UC3);
if you want it to be of an image img1
img=Mat::zeros(img1.size,CV_8UC3);
If You are more into programming with templates, You may also do it this way...
template<typename _Tp>
... some algo ...
cv::Mat mat = cv::Mat_<_Tp>::zeros(rows, cols);
mat.at<_Tp>(i, j) = val;
How to fill Matrix with zeros in OpenCV?
To fill a pre-existing Mat
object with zeros, you can use Mat::zeros()
Mat m1 = ...;
m1 = Mat::zeros(1, 1, CV_64F);
To intialize a Mat
so that it contains only zeros, you can pass a scalar with value 0
to the constructor:
Mat m1 = Mat(1,1, CV_64F, 0.0);
// ^^^^double literal
The reason your version failed is that passing 0
as fourth argument matches the overload taking a void*
better than the one taking a scalar.
use cv::mat::setto
img.setTo(cv::Scalar(redVal,greenVal,blueVal))
I presume you are talking about filling zeros of some existing mat? How about this? :)
mat *= 0;
Source: Stackoverflow.com