org.opencv.core.Mat Maven / Gradle / Ivy
Show all versions of opencv Show documentation
package org.opencv.core; // C++: class Mat /** *
* *OpenCV C++ n-dimensional dense array class
* *class CV_EXPORTS Mat
* *// C++ code:
* * *public:
* *//... a lot of methods......
* */ *! includes several bit-fields:
* *- the magic signature
* *- continuity flag
* *- depth
* *- number of channels
**
* *- / *
int flags;
* *//! the array dimensionality, >= 2
* *int dims;
* *//! the number of rows and columns or (-1, -1) when the array has more than 2 * dimensions
* *int rows, cols;
* *//! pointer to the data
* *uchar* data;
* *//! pointer to the reference counter;
* *// when array points to user-allocated data, the pointer is NULL
* *int* refcount;
* *// other members...
* *};
* *The class
Mat
represents an n-dimensional dense numerical * single-channel or multi-channel array. It can be used to store real or * complex-valued vectors and matrices, grayscale or color images, voxel * volumes, vector fields, point clouds, tensors, histograms (though, very * high-dimensional histograms may be better stored in aSparseMat
). * The data layout of the arrayM is defined by the array
* *M.step[]
, so that the address * of element (i_0,...,i_(M.dims-1)), where 0 <= i_k<M.size[k], * is computed as:addr(M_(i_0,...,i_(M.dims-1))) = M.data + M.step[0]*i_0 + M.step[1]*i_1 * +... + M.step[M.dims-1]*i_(M.dims-1)
* *In case of a 2-dimensional array, the above formula is reduced to:
* *addr(M_(i,j)) = M.data + M.step[0]*i + M.step[1]*j
* *Note that
* *M.step[i] >= M.step[i+1]
(in fact,M.step[i] >= * M.step[i+1]*M.size[i+1]
). This means that 2-dimensional matrices are * stored row-by-row, 3-dimensional matrices are stored plane-by-plane, and so * on.M.step[M.dims-1]
is minimal and always equal to the element * sizeM.elemSize()
.So, the data layout in
* *Mat
is fully compatible with *CvMat
,IplImage
, andCvMatND
types * from OpenCV 1.x. It is also compatible with the majority of dense array types * from the standard toolkits and SDKs, such as Numpy (ndarray), Win32 * (independent device bitmaps), and others, that is, with any array that uses * *steps* (or *strides*) to compute the position of a pixel. Due to this * compatibility, it is possible to make aMat
header for * user-allocated data and process it in-place using OpenCV functions.There are many different ways to create a
*Mat
object. The most * popular options are listed below:
-
*
- Use the
create(nrows, ncols, type)
method or the similar *Mat(nrows, ncols, type[, fillValue])
constructor. A new array of * the specified size and type is allocated.type
has the same * meaning as in thecvCreateMat
method. *
For example, CV_8UC1
means a 8-bit single-channel array,
* CV_32FC2
means a 2-channel (complex) floating-point array, and
* so on.
// C++ code:
* *// make a 7x7 complex matrix filled with 1+3j.
* *Mat M(7,7,CV_32FC2,Scalar(1,3));
* *// and now turn M to a 100x60 15-channel 8-bit matrix.
* *// The old content will be deallocated
* *M.create(100,60,CV_8UC(15));
* * * *As noted in the introduction to this chapter, create()
allocates
* only a new array when the shape or type of the current array are different
* from the specified ones.
-
*
- Create a multi-dimensional array: *
// C++ code:
* *// create a 100x100x100 8-bit array
* *int sz[] = {100, 100, 100};
* *Mat bigCube(3, sz, CV_8U, Scalar.all(0));
* * * *It passes the number of dimensions =1 to the Mat
constructor but
* the created array will be 2-dimensional with the number of columns set to 1.
* So, Mat.dims
is always >= 2 (can also be 0 when the array is
* empty).
-
*
- Use a copy constructor or assignment operator where there can be an
* array or expression on the right side (see below). As noted in the
* introduction, the array assignment is an O(1) operation because it only
* copies the header and increases the reference counter. The
Mat.clone()
* method can be used to get a full (deep) copy of the array when you need it. * - Construct a header for a part of another array. It can be a single * row, single column, several rows, several columns, rectangular region in the * array (called a *minor* in algebra) or a diagonal. Such operations are also * O(1) because the new header references the same data. You can actually modify * a part of the array using this feature, for example: *
// C++ code:
* *// add the 5-th row, multiplied by 3 to the 3rd row
* *M.row(3) = M.row(3) + M.row(5)*3;
* *// now copy the 7-th column to the 1-st column
* *// M.col(1) = M.col(7); // this will not work
* *Mat M1 = M.col(1);
* *M.col(7).copyTo(M1);
* *// create a new 320x240 image
* *Mat img(Size(320,240),CV_8UC3);
* *// select a ROI
* *Mat roi(img, Rect(10,10,100,100));
* *// fill the ROI with (0,255,0) (which is green in RGB space);
* *// the original 320x240 image will be modified
* *roi = Scalar(0,255,0);
* * * *Due to the additional datastart
and dataend
* members, it is possible to compute a relative sub-array position in the main
* *container* array using locateROI()
:
// C++ code:
* *Mat A = Mat.eye(10, 10, CV_32S);
* *// extracts A columns, 1 (inclusive) to 3 (exclusive).
* *Mat B = A(Range.all(), Range(1, 3));
* *// extracts B rows, 5 (inclusive) to 9 (exclusive).
* *// that is, C ~ A(Range(5, 9), Range(1, 3))
* *Mat C = B(Range(5, 9), Range.all());
* *Size size; Point ofs;
* *C.locateROI(size, ofs);
* *// size will be (width=10,height=10) and the ofs will be (x=1, y=5)
* * * *As in case of whole matrices, if you need a deep copy, use the
* clone()
method of the extracted sub-matrices.
-
*
- Make a header for user-allocated data. It can be useful to do the * following: *
- Process "foreign" data using OpenCV (for example, when you implement a
* DirectShow* filter or a processing module for
gstreamer
, and so * on). For example: *
// C++ code:
* *void process_video_frame(const unsigned char* pixels,
* *int width, int height, int step)
* * *Mat img(height, width, CV_8UC3, pixels, step);
* *GaussianBlur(img, img, Size(7,7), 1.5, 1.5);
* * * *-
*
- Quickly initialize small matrices and/or get a super-fast element * access. *
// C++ code:
* *double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};
* *Mat M = Mat(3, 3, CV_64F, m).inv();
* * * *Partial yet very common cases of this *user-allocated data* case are
* conversions from CvMat
and IplImage
to
* Mat
. For this purpose, there are special constructors taking
* pointers to CvMat
or IplImage
and the optional flag
* indicating whether to copy the data or not.
Backward conversion from Mat
to CvMat
or
* IplImage
is provided via cast operators Mat.operator
* CvMat() const
and Mat.operator IplImage()
. The operators
* do NOT copy the data.
// C++ code:
* *IplImage* img = cvLoadImage("greatwave.jpg", 1);
* *Mat mtx(img); // convert IplImage* -> Mat
* *CvMat oldmat = mtx; // convert Mat -> CvMat
* *CV_Assert(oldmat.cols == img->width && oldmat.rows == img->height &&
* *oldmat.data.ptr == (uchar*)img->imageData && oldmat.step == img->widthStep);
* * *-
*
- Use MATLAB-style array initializers,
zeros(), ones(), * eye()
, for example: *
// C++ code:
* *// create a double-precision identity martix and add it to M.
* *M += Mat.eye(M.rows, M.cols, CV_64F);
* * *-
*
- Use a comma-separated initializer: *
// C++ code:
* *// create a 3x3 double-precision identity matrix
* *Mat M = (Mat_
With this approach, you first call a constructor of the "Mat_" class with the
* proper parameters, and then you just put <<
operator followed by
* comma-separated values that can be constants, variables, expressions, and so
* on. Also, note the extra parentheses required to avoid compilation errors.
Once the array is created, it is automatically managed via a
* reference-counting mechanism. If the array header is built on top of
* user-allocated data, you should handle the data by yourself.
* The array data is deallocated when no one points to it. If you want to
* release the data pointed by a array header before the array destructor is
* called, use Mat.release()
.
The next important thing to learn about the array class is element access.
* This manual already described how to compute an address of each array
* element. Normally, you are not required to use the formula directly in the
* code. If you know the array element type (which can be retrieved using the
* method Mat.type()
), you can access the elementM_(ij)
* of a 2-dimensional array as:
// C++ code:
* *M.at
assuming that M is a double-precision floating-point array. There are several
* variants of the method at
for a different number of dimensions.
*
If you need to process a whole row of a 2D array, the most efficient way is
* to get the pointer to the row first, and then just use the plain C operator
* []
:
// C++ code:
* *// compute sum of positive matrix elements
* *// (assuming that M isa double-precision matrix)
* *double sum=0;
* *for(int i = 0; i < M.rows; i++)
* * *const double* Mi = M.ptr
for(int j = 0; j < M.cols; j++)
* *sum += std.max(Mi[j], 0.);
* * *Some operations, like the one above, do not actually depend on the array * shape. They just process elements of an array one by one (or elements from * multiple arrays that have the same coordinates, for example, array addition). * Such operations are called *element-wise*. It makes sense to check whether * all the input/output arrays are continuous, namely, have no gaps at the end * of each row. If yes, process them as a long single row:
* *// compute the sum of positive matrix elements, optimized variant
* *double sum=0;
* *int cols = M.cols, rows = M.rows;
* *if(M.isContinuous())
* * *cols *= rows;
* *rows = 1;
* * *for(int i = 0; i < rows; i++)
* * *const double* Mi = M.ptr
for(int j = 0; j < cols; j++)
* *sum += std.max(Mi[j], 0.);
* * *In case of the continuous matrix, the outer loop body is executed just once. * So, the overhead is smaller, which is especially noticeable in case of small * matrices. *
* *Finally, there are STL-style iterators that are smart enough to skip gaps
* between successive rows:
// C++ code:
* *// compute sum of positive matrix elements, iterator-based variant
* *double sum=0;
* *MatConstIterator_
for(; it != it_end; ++it)
* *sum += std.max(*it, 0.);
* *The matrix iterators are random-access iterators, so they can be passed to
* any STL algorithm, including std.sort()
.
*
Note:
*-
*
- An example demonstrating the serial out capabilities of cv.Mat can be * found at opencv_source_code/samples/cpp/cout_mat.cpp *
Various Mat constructors
* *These are various constructors that form a matrix. As noted in the * "AutomaticAllocation", often the default constructor is enough, and the * proper matrix will be allocated by an OpenCV function. The constructed matrix * can further be assigned to another matrix or matrix expression or can be * allocated with "Mat.create". In the former case, the old content is * de-referenced.
* * @see org.opencv.core.Mat.Mat */ public Mat() { nativeObj = n_Mat(); return; } // // C++: Mat::Mat(int rows, int cols, int type) // /** *Various Mat constructors
* *These are various constructors that form a matrix. As noted in the * "AutomaticAllocation", often the default constructor is enough, and the * proper matrix will be allocated by an OpenCV function. The constructed matrix * can further be assigned to another matrix or matrix expression or can be * allocated with "Mat.create". In the former case, the old content is * de-referenced.
* * @param rows Number of rows in a 2D array. * @param cols Number of columns in a 2D array. * @param type Array type. UseCV_8UC1,..., CV_64FC4
to create 1-4
* channel matrices, or CV_8UC(n),..., CV_64FC(n)
to create
* multi-channel (up to CV_CN_MAX
channels) matrices.
*
* @see org.opencv.core.Mat.Mat
*/
public Mat(int rows, int cols, int type)
{
nativeObj = n_Mat(rows, cols, type);
return;
}
//
// C++: Mat::Mat(Size size, int type)
//
/**
* Various Mat constructors
* *These are various constructors that form a matrix. As noted in the * "AutomaticAllocation", often the default constructor is enough, and the * proper matrix will be allocated by an OpenCV function. The constructed matrix * can further be assigned to another matrix or matrix expression or can be * allocated with "Mat.create". In the former case, the old content is * de-referenced.
* * @param size 2D array size:Size(cols, rows)
. In the
* Size()
constructor, the number of rows and the number of columns
* go in the reverse order.
* @param type Array type. Use CV_8UC1,..., CV_64FC4
to create 1-4
* channel matrices, or CV_8UC(n),..., CV_64FC(n)
to create
* multi-channel (up to CV_CN_MAX
channels) matrices.
*
* @see org.opencv.core.Mat.Mat
*/
public Mat(Size size, int type)
{
nativeObj = n_Mat(size.width, size.height, type);
return;
}
//
// C++: Mat::Mat(int rows, int cols, int type, Scalar s)
//
/**
* Various Mat constructors
* *These are various constructors that form a matrix. As noted in the * "AutomaticAllocation", often the default constructor is enough, and the * proper matrix will be allocated by an OpenCV function. The constructed matrix * can further be assigned to another matrix or matrix expression or can be * allocated with "Mat.create". In the former case, the old content is * de-referenced.
* * @param rows Number of rows in a 2D array. * @param cols Number of columns in a 2D array. * @param type Array type. UseCV_8UC1,..., CV_64FC4
to create 1-4
* channel matrices, or CV_8UC(n),..., CV_64FC(n)
to create
* multi-channel (up to CV_CN_MAX
channels) matrices.
* @param s An optional value to initialize each matrix element with. To set all
* the matrix elements to the particular value after the construction, use the
* assignment operator Mat.operator=(const Scalar& value)
.
*
* @see org.opencv.core.Mat.Mat
*/
public Mat(int rows, int cols, int type, Scalar s)
{
nativeObj = n_Mat(rows, cols, type, s.val[0], s.val[1], s.val[2], s.val[3]);
return;
}
//
// C++: Mat::Mat(Size size, int type, Scalar s)
//
/**
* Various Mat constructors
* *These are various constructors that form a matrix. As noted in the * "AutomaticAllocation", often the default constructor is enough, and the * proper matrix will be allocated by an OpenCV function. The constructed matrix * can further be assigned to another matrix or matrix expression or can be * allocated with "Mat.create". In the former case, the old content is * de-referenced.
* * @param size 2D array size:Size(cols, rows)
. In the
* Size()
constructor, the number of rows and the number of columns
* go in the reverse order.
* @param type Array type. Use CV_8UC1,..., CV_64FC4
to create 1-4
* channel matrices, or CV_8UC(n),..., CV_64FC(n)
to create
* multi-channel (up to CV_CN_MAX
channels) matrices.
* @param s An optional value to initialize each matrix element with. To set all
* the matrix elements to the particular value after the construction, use the
* assignment operator Mat.operator=(const Scalar& value)
.
*
* @see org.opencv.core.Mat.Mat
*/
public Mat(Size size, int type, Scalar s)
{
nativeObj = n_Mat(size.width, size.height, type, s.val[0], s.val[1], s.val[2], s.val[3]);
return;
}
//
// C++: Mat::Mat(Mat m, Range rowRange, Range colRange = Range::all())
//
/**
* Various Mat constructors
* *These are various constructors that form a matrix. As noted in the * "AutomaticAllocation", often the default constructor is enough, and the * proper matrix will be allocated by an OpenCV function. The constructed matrix * can further be assigned to another matrix or matrix expression or can be * allocated with "Mat.create". In the former case, the old content is * de-referenced.
* * @param m Array that (as a whole or partly) is assigned to the constructed * matrix. No data is copied by these constructors. Instead, the header pointing * tom
data or its sub-array is constructed and associated with
* it. The reference counter, if any, is incremented. So, when you modify the
* matrix formed using such a constructor, you also modify the corresponding
* elements of m
. If you want to have an independent copy of the
* sub-array, use Mat.clone()
.
* @param rowRange Range of the m
rows to take. As usual, the range
* start is inclusive and the range end is exclusive. Use Range.all()
* to take all the rows.
* @param colRange Range of the m
columns to take. Use
* Range.all()
to take all the columns.
*
* @see org.opencv.core.Mat.Mat
*/
public Mat(Mat m, Range rowRange, Range colRange)
{
nativeObj = n_Mat(m.nativeObj, rowRange.start, rowRange.end, colRange.start, colRange.end);
return;
}
/**
* Various Mat constructors
* *These are various constructors that form a matrix. As noted in the * "AutomaticAllocation", often the default constructor is enough, and the * proper matrix will be allocated by an OpenCV function. The constructed matrix * can further be assigned to another matrix or matrix expression or can be * allocated with "Mat.create". In the former case, the old content is * de-referenced.
* * @param m Array that (as a whole or partly) is assigned to the constructed * matrix. No data is copied by these constructors. Instead, the header pointing * tom
data or its sub-array is constructed and associated with
* it. The reference counter, if any, is incremented. So, when you modify the
* matrix formed using such a constructor, you also modify the corresponding
* elements of m
. If you want to have an independent copy of the
* sub-array, use Mat.clone()
.
* @param rowRange Range of the m
rows to take. As usual, the range
* start is inclusive and the range end is exclusive. Use Range.all()
* to take all the rows.
*
* @see org.opencv.core.Mat.Mat
*/
public Mat(Mat m, Range rowRange)
{
nativeObj = n_Mat(m.nativeObj, rowRange.start, rowRange.end);
return;
}
//
// C++: Mat::Mat(Mat m, Rect roi)
//
/**
* Various Mat constructors
* *These are various constructors that form a matrix. As noted in the * "AutomaticAllocation", often the default constructor is enough, and the * proper matrix will be allocated by an OpenCV function. The constructed matrix * can further be assigned to another matrix or matrix expression or can be * allocated with "Mat.create". In the former case, the old content is * de-referenced.
* * @param m Array that (as a whole or partly) is assigned to the constructed * matrix. No data is copied by these constructors. Instead, the header pointing * tom
data or its sub-array is constructed and associated with
* it. The reference counter, if any, is incremented. So, when you modify the
* matrix formed using such a constructor, you also modify the corresponding
* elements of m
. If you want to have an independent copy of the
* sub-array, use Mat.clone()
.
* @param roi Region of interest.
*
* @see org.opencv.core.Mat.Mat
*/
public Mat(Mat m, Rect roi)
{
nativeObj = n_Mat(m.nativeObj, roi.y, roi.y + roi.height, roi.x, roi.x + roi.width);
return;
}
//
// C++: Mat Mat::adjustROI(int dtop, int dbottom, int dleft, int dright)
//
/**
* Adjusts a submatrix size and position within the parent matrix.
* *The method is complimentary to"Mat.locateROI". The typical use of these
* functions is to determine the submatrix position within the parent matrix and
* then shift the position somehow. Typically, it can be required for filtering
* operations when pixels outside of the ROI should be taken into account. When
* all the method parameters are positive, the ROI needs to grow in all
* directions by the specified amount, for example:
// C++ code:
* *A.adjustROI(2, 2, 2, 2);
* *In this example, the matrix size is increased by 4 elements in each * direction. The matrix is shifted by 2 elements to the left and 2 elements up, * which brings in all the necessary pixels for the filtering with the 5x5 * kernel. *
* *adjustROI
forces the adjusted ROI to be inside of the parent
* matrix that is boundaries of the adjusted ROI are constrained by boundaries
* of the parent matrix. For example, if the submatrix A
is located
* in the first row of a parent matrix and you called A.adjustROI(2, 2, 2,
* 2)
then A
will not be increased in the upward direction.
The function is used internally by the OpenCV filtering functions, like * "filter2D", morphological operations, and so on.
* * @param dtop Shift of the top submatrix boundary upwards. * @param dbottom Shift of the bottom submatrix boundary downwards. * @param dleft Shift of the left submatrix boundary to the left. * @param dright Shift of the right submatrix boundary to the right. * * @see org.opencv.core.Mat.adjustROI * @see org.opencv.imgproc.Imgproc#copyMakeBorder */ public Mat adjustROI(int dtop, int dbottom, int dleft, int dright) { Mat retVal = new Mat(n_adjustROI(nativeObj, dtop, dbottom, dleft, dright)); return retVal; } // // C++: void Mat::assignTo(Mat m, int type = -1) // /** *Provides a functional form of convertTo
.
This is an internally used method called by the "MatrixExpressions" engine.
* * @param m Destination array. * @param type Desired destination array depth (or -1 if it should be the same * as the source type). * * @see org.opencv.core.Mat.assignTo */ public void assignTo(Mat m, int type) { n_assignTo(nativeObj, m.nativeObj, type); return; } /** *Provides a functional form of convertTo
.
This is an internally used method called by the "MatrixExpressions" engine.
* * @param m Destination array. * * @see org.opencv.core.Mat.assignTo */ public void assignTo(Mat m) { n_assignTo(nativeObj, m.nativeObj); return; } // // C++: int Mat::channels() // /** *Returns the number of matrix channels.
* *The method returns the number of matrix channels.
* * @see org.opencv.core.Mat.channels */ public int channels() { int retVal = n_channels(nativeObj); return retVal; } // // C++: int Mat::checkVector(int elemChannels, int depth = -1, bool // requireContinuous = true) // public int checkVector(int elemChannels, int depth, boolean requireContinuous) { int retVal = n_checkVector(nativeObj, elemChannels, depth, requireContinuous); return retVal; } public int checkVector(int elemChannels, int depth) { int retVal = n_checkVector(nativeObj, elemChannels, depth); return retVal; } public int checkVector(int elemChannels) { int retVal = n_checkVector(nativeObj, elemChannels); return retVal; } // // C++: Mat Mat::clone() // /** *Creates a full copy of the array and the underlying data.
* *The method creates a full copy of the array. The original step[]
* is not taken into account. So, the array copy is a continuous array occupying
* total()*elemSize()
bytes.
Creates a matrix header for the specified matrix column.
* *The method makes a new header for the specified matrix column and returns it. * This is an O(1) operation, regardless of the matrix size. The underlying data * of the new matrix is shared with the original matrix. See also the "Mat.row" * description.
* * @param x A 0-based column index. * * @see org.opencv.core.Mat.col */ public Mat col(int x) { Mat retVal = new Mat(n_col(nativeObj, x)); return retVal; } // // C++: Mat Mat::colRange(int startcol, int endcol) // /** *Creates a matrix header for the specified column span.
* *The method makes a new header for the specified column span of the matrix. * Similarly to "Mat.row" and "Mat.col", this is an O(1) operation.
* * @param startcol An inclusive 0-based start index of the column span. * @param endcol An exclusive 0-based ending index of the column span. * * @see org.opencv.core.Mat.colRange */ public Mat colRange(int startcol, int endcol) { Mat retVal = new Mat(n_colRange(nativeObj, startcol, endcol)); return retVal; } // // C++: Mat Mat::colRange(Range r) // /** *Creates a matrix header for the specified column span.
* *The method makes a new header for the specified column span of the matrix. * Similarly to "Mat.row" and "Mat.col", this is an O(1) operation.
* * @param r "Range" structure containing both the start and the end indices. * * @see org.opencv.core.Mat.colRange */ public Mat colRange(Range r) { Mat retVal = new Mat(n_colRange(nativeObj, r.start, r.end)); return retVal; } // // C++: int Mat::dims() // public int dims() { int retVal = n_dims(nativeObj); return retVal; } // // C++: int Mat::cols() // public int cols() { int retVal = n_cols(nativeObj); return retVal; } // // C++: void Mat::convertTo(Mat& m, int rtype, double alpha = 1, double beta // = 0) // /** *Converts an array to another data type with optional scaling.
* *The method converts source pixel values to the target data type.
* saturate_cast<>
is applied at the end to avoid possible
* overflows:
m(x,y) = saturate _ cast<rType>(alpha(*this)(x,y) + beta)
* * @param m output matrix; if it does not have a proper size or type before the * operation, it is reallocated. * @param rtype desired output matrix type or, rather, the depth since the * number of channels are the same as the input has; ifrtype
is
* negative, the output matrix will have the same type as the input.
* @param alpha optional scale factor.
* @param beta optional delta added to the scaled values.
*
* @see org.opencv.core.Mat.convertTo
*/
public void convertTo(Mat m, int rtype, double alpha, double beta)
{
n_convertTo(nativeObj, m.nativeObj, rtype, alpha, beta);
return;
}
/**
* Converts an array to another data type with optional scaling.
* *The method converts source pixel values to the target data type.
* saturate_cast<>
is applied at the end to avoid possible
* overflows:
m(x,y) = saturate _ cast<rType>(alpha(*this)(x,y) + beta)
* * @param m output matrix; if it does not have a proper size or type before the * operation, it is reallocated. * @param rtype desired output matrix type or, rather, the depth since the * number of channels are the same as the input has; ifrtype
is
* negative, the output matrix will have the same type as the input.
* @param alpha optional scale factor.
*
* @see org.opencv.core.Mat.convertTo
*/
public void convertTo(Mat m, int rtype, double alpha)
{
n_convertTo(nativeObj, m.nativeObj, rtype, alpha);
return;
}
/**
* Converts an array to another data type with optional scaling.
* *The method converts source pixel values to the target data type.
* saturate_cast<>
is applied at the end to avoid possible
* overflows:
m(x,y) = saturate _ cast<rType>(alpha(*this)(x,y) + beta)
* * @param m output matrix; if it does not have a proper size or type before the * operation, it is reallocated. * @param rtype desired output matrix type or, rather, the depth since the * number of channels are the same as the input has; ifrtype
is
* negative, the output matrix will have the same type as the input.
*
* @see org.opencv.core.Mat.convertTo
*/
public void convertTo(Mat m, int rtype)
{
n_convertTo(nativeObj, m.nativeObj, rtype);
return;
}
//
// C++: void Mat::copyTo(Mat& m)
//
/**
* Copies the matrix to another one.
* *The method copies the matrix data to another matrix. Before copying the data,
* the method invokes
// C++ code:
* *m.create(this->size(), this->type());
* *so that the destination matrix is reallocated if needed. While
* m.copyTo(m);
works flawlessly, the function does not handle the
* case of a partial overlap between the source and the destination matrices.
*
When the operation mask is specified, if the Mat.create
call
* shown above reallocates the matrix, the newly allocated matrix is initialized
* with all zeros before copying the data.
Copies the matrix to another one.
* *The method copies the matrix data to another matrix. Before copying the data,
* the method invokes
// C++ code:
* *m.create(this->size(), this->type());
* *so that the destination matrix is reallocated if needed. While
* m.copyTo(m);
works flawlessly, the function does not handle the
* case of a partial overlap between the source and the destination matrices.
*
When the operation mask is specified, if the Mat.create
call
* shown above reallocates the matrix, the newly allocated matrix is initialized
* with all zeros before copying the data.
Allocates new array data if needed.
* *This is one of the key Mat
methods. Most new-style OpenCV
* functions and methods that produce arrays call this method for each output
* array. The method uses the following algorithm:
-
*
- If the current array shape and the type match the new ones, return * immediately. Otherwise, de-reference the previous data by calling * "Mat.release". *
- Initialize the new header. *
- Allocate the new data of
total()*elemSize()
bytes. * - Allocate the new, associated with the data, reference counter and set * it to 1. *
Such a scheme makes the memory management robust and efficient at the same
* time and helps avoid extra typing for you. This means that usually there is
* no need to explicitly allocate output arrays. That is, instead of writing:
*
// C++ code:
* *Mat color;...
* *Mat gray(color.rows, color.cols, color.depth());
* *cvtColor(color, gray, CV_BGR2GRAY);
* *you can simply write:
* *Mat color;...
* *Mat gray;
* *cvtColor(color, gray, CV_BGR2GRAY);
* *because cvtColor
, as well as the most of OpenCV functions, calls
* Mat.create()
for the output array internally.
*
Allocates new array data if needed.
* *This is one of the key Mat
methods. Most new-style OpenCV
* functions and methods that produce arrays call this method for each output
* array. The method uses the following algorithm:
-
*
- If the current array shape and the type match the new ones, return * immediately. Otherwise, de-reference the previous data by calling * "Mat.release". *
- Initialize the new header. *
- Allocate the new data of
total()*elemSize()
bytes. * - Allocate the new, associated with the data, reference counter and set * it to 1. *
Such a scheme makes the memory management robust and efficient at the same
* time and helps avoid extra typing for you. This means that usually there is
* no need to explicitly allocate output arrays. That is, instead of writing:
*
// C++ code:
* *Mat color;...
* *Mat gray(color.rows, color.cols, color.depth());
* *cvtColor(color, gray, CV_BGR2GRAY);
* *you can simply write:
* *Mat color;...
* *Mat gray;
* *cvtColor(color, gray, CV_BGR2GRAY);
* *because cvtColor
, as well as the most of OpenCV functions, calls
* Mat.create()
for the output array internally.
*
Size(cols,
* rows)
* @param type New matrix type.
*
* @see org.opencv.core.Mat.create
*/
public void create(Size size, int type)
{
n_create(nativeObj, size.width, size.height, type);
return;
}
//
// C++: Mat Mat::cross(Mat m)
//
/**
* Computes a cross-product of two 3-element vectors.
* *The method computes a cross-product of two 3-element vectors. The vectors * must be 3-element floating-point vectors of the same shape and size. The * result is another 3-element vector of the same shape and type as operands.
* * @param m Another cross-product operand. * * @see org.opencv.core.Mat.cross */ public Mat cross(Mat m) { Mat retVal = new Mat(n_cross(nativeObj, m.nativeObj)); return retVal; } // // C++: long Mat::dataAddr() // public long dataAddr() { long retVal = n_dataAddr(nativeObj); return retVal; } // // C++: int Mat::depth() // /** *Returns the depth of a matrix element.
* *The method returns the identifier of the matrix element depth (the type of
* each individual channel). For example, for a 16-bit signed element array, the
* method returns CV_16S
. A complete list of matrix types contains
* the following values:
-
*
-
CV_8U
- 8-bit unsigned integers (0..255
) * -
CV_8S
- 8-bit signed integers (-128..127
) * -
CV_16U
- 16-bit unsigned integers (0..65535
) * -
CV_16S
- 16-bit signed integers (-32768..32767
) * -
CV_32S
- 32-bit signed integers (-2147483648..2147483647
) * -
CV_32F
- 32-bit floating-point numbers (-FLT_MAX..FLT_MAX, * INF, NAN
) * -
CV_64F
- 64-bit floating-point numbers (-DBL_MAX..DBL_MAX, * INF, NAN
) *
Extracts a diagonal from a matrix, or creates a diagonal matrix.
* *The method makes a new header for the specified matrix diagonal. The new * matrix is represented as a single-column matrix. Similarly to "Mat.row" and * "Mat.col", this is an O(1) operation.
* * @param d Single-column matrix that forms a diagonal matrix or index of the * diagonal, with the following values: *-
*
- d=0 is the main diagonal. *
- d>0 is a diagonal from the lower half. For example,
d=1
* means the diagonal is set immediately below the main one. * - d<0 is a diagonal from the upper half. For example,
d=1
* means the diagonal is set immediately above the main one. *
Extracts a diagonal from a matrix, or creates a diagonal matrix.
* *The method makes a new header for the specified matrix diagonal. The new * matrix is represented as a single-column matrix. Similarly to "Mat.row" and * "Mat.col", this is an O(1) operation.
* * @see org.opencv.core.Mat.diag */ public Mat diag() { Mat retVal = new Mat(n_diag(nativeObj, 0)); return retVal; } // // C++: static Mat Mat::diag(Mat d) // /** *Extracts a diagonal from a matrix, or creates a diagonal matrix.
* *The method makes a new header for the specified matrix diagonal. The new * matrix is represented as a single-column matrix. Similarly to "Mat.row" and * "Mat.col", this is an O(1) operation.
* * @param d Single-column matrix that forms a diagonal matrix or index of the * diagonal, with the following values: *-
*
- d=0 is the main diagonal. *
- d>0 is a diagonal from the lower half. For example,
d=1
* means the diagonal is set immediately below the main one. * - d<0 is a diagonal from the upper half. For example,
d=1
* means the diagonal is set immediately above the main one. *
Computes a dot-product of two vectors.
* *The method computes a dot-product of two matrices. If the matrices are not * single-column or single-row vectors, the top-to-bottom left-to-right scan * ordering is used to treat them as 1D vectors. The vectors must have the same * size and type. If the matrices have more than one channel, the dot products * from all the channels are summed together.
* * @param m another dot-product operand. * * @see org.opencv.core.Mat.dot */ public double dot(Mat m) { double retVal = n_dot(nativeObj, m.nativeObj); return retVal; } // // C++: size_t Mat::elemSize() // /** *Returns the matrix element size in bytes.
* *The method returns the matrix element size in bytes. For example, if the
* matrix type is CV_16SC3
, the method returns 3*sizeof(short)
* or 6.
Returns the size of each matrix element channel in bytes.
* *The method returns the matrix element channel size in bytes, that is, it
* ignores the number of channels. For example, if the matrix type is
* CV_16SC3
, the method returns sizeof(short)
or 2.
Returns true
if the array has no elements.
The method returns true
if Mat.total()
is 0 or if
* Mat.data
is NULL. Because of pop_back()
and
* resize()
methods M.total() == 0
does not imply that
* M.data == NULL
.
Returns an identity matrix of the specified size and type.
* *The method returns a Matlab-style identity matrix initializer, similarly to
* "Mat.zeros". Similarly to"Mat.ones", you can use a scale operation to
* create a scaled identity matrix efficiently:
// C++ code:
* *// make a 4x4 diagonal matrix with 0.1's on the diagonal.
* *Mat A = Mat.eye(4, 4, CV_32F)*0.1;
* * @param rows Number of rows. * @param cols Number of columns. * @param type Created matrix type. * * @see org.opencv.core.Mat.eye */ public static Mat eye(int rows, int cols, int type) { Mat retVal = new Mat(n_eye(rows, cols, type)); return retVal; } // // C++: static Mat Mat::eye(Size size, int type) // /** *Returns an identity matrix of the specified size and type.
* *The method returns a Matlab-style identity matrix initializer, similarly to
* "Mat.zeros". Similarly to"Mat.ones", you can use a scale operation to
* create a scaled identity matrix efficiently:
// C++ code:
* *// make a 4x4 diagonal matrix with 0.1's on the diagonal.
* *Mat A = Mat.eye(4, 4, CV_32F)*0.1;
* * @param size Alternative matrix size specification asSize(cols,
* rows)
.
* @param type Created matrix type.
*
* @see org.opencv.core.Mat.eye
*/
public static Mat eye(Size size, int type)
{
Mat retVal = new Mat(n_eye(size.width, size.height, type));
return retVal;
}
//
// C++: Mat Mat::inv(int method = DECOMP_LU)
//
/**
* Inverses a matrix.
* *The method performs a matrix inversion by means of matrix expressions. This * means that a temporary matrix inversion object is returned by the method and * can be used further as a part of more complex matrix expressions or can be * assigned to a matrix.
* * @param method Matrix inversion method. Possible values are the following: *-
*
- DECOMP_LU is the LU decomposition. The matrix must be non-singular. *
- DECOMP_CHOLESKY is the Cholesky LL^T decomposition for * symmetrical positively defined matrices only. This type is about twice faster * than LU on big matrices. *
- DECOMP_SVD is the SVD decomposition. If the matrix is singular or even * non-square, the pseudo inversion is computed. *
Inverses a matrix.
* *The method performs a matrix inversion by means of matrix expressions. This * means that a temporary matrix inversion object is returned by the method and * can be used further as a part of more complex matrix expressions or can be * assigned to a matrix.
* * @see org.opencv.core.Mat.inv */ public Mat inv() { Mat retVal = new Mat(n_inv(nativeObj)); return retVal; } // // C++: bool Mat::isContinuous() // /** *Reports whether the matrix is continuous or not.
* *The method returns true
if the matrix elements are stored
* continuously without gaps at the end of each row. Otherwise, it returns
* false
. Obviously, 1x1
or 1xN
matrices
* are always continuous. Matrices created with "Mat.create" are always
* continuous. But if you extract a part of the matrix using "Mat.col",
* "Mat.diag", and so on, or constructed a matrix header for externally
* allocated data, such matrices may no longer have this property.
* The continuity flag is stored as a bit in the Mat.flags
field
* and is computed automatically when you construct a matrix header. Thus, the
* continuity check is a very fast operation, though theoretically it could be
* done as follows:
// C++ code:
* *// alternative implementation of Mat.isContinuous()
* *bool myCheckMatContinuity(const Mat& m)
* * *//return (m.flags & Mat.CONTINUOUS_FLAG) != 0;
* *return m.rows == 1 || m.step == m.cols*m.elemSize();
* * *The method is used in quite a few of OpenCV functions. The point is that * element-wise operations (such as arithmetic and logical operations, math * functions, alpha blending, color space transformations, and others) do not * depend on the image geometry. Thus, if all the input and output arrays are * continuous, the functions can process them as very long single-row vectors. * The example below illustrates how an alpha-blending function can be * implemented.
* *template
void alphaBlendRGBA(const Mat& src1, const Mat& src2, Mat& dst)
* * *const float alpha_scale = (float)std.numeric_limits
inv_scale = 1.f/alpha_scale;
* *CV_Assert(src1.type() == src2.type() &&
* *src1.type() == CV_MAKETYPE(DataType
src1.size() == src2.size());
* *Size size = src1.size();
* *dst.create(size, src1.type());
* *// here is the idiom: check the arrays for continuity and,
* *// if this is the case,
* *// treat the arrays as 1D vectors
* *if(src1.isContinuous() && src2.isContinuous() && dst.isContinuous())
* * *size.width *= size.height;
* *size.height = 1;
* * *size.width *= 4;
* *for(int i = 0; i < size.height; i++)
* * *// when the arrays are continuous,
* *// the outer loop is executed only once
* *const T* ptr1 = src1.ptr
const T* ptr2 = src2.ptr
T* dptr = dst.ptr
for(int j = 0; j < size.width; j += 4)
* * *float alpha = ptr1[j+3]*inv_scale, beta = ptr2[j+3]*inv_scale;
* *dptr[j] = saturate_cast
dptr[j+1] = saturate_cast
dptr[j+2] = saturate_cast
dptr[j+3] = saturate_cast
This approach, while being very simple, can boost the performance of a simple * element-operation by 10-20 percents, especially if the image is rather small * and the operation is quite simple. *
* *Another OpenCV idiom in this function, a call of "Mat.create" for the * destination array, that allocates the destination array unless it already has * the proper size and type. And while the newly allocated arrays are always * continuous, you still need to check the destination array because * "Mat.create" does not always allocate a new matrix.
* * @see org.opencv.core.Mat.isContinuous */ public boolean isContinuous() { boolean retVal = n_isContinuous(nativeObj); return retVal; } // // C++: bool Mat::isSubmatrix() // public boolean isSubmatrix() { boolean retVal = n_isSubmatrix(nativeObj); return retVal; } // // C++: void Mat::locateROI(Size wholeSize, Point ofs) // /** *Locates the matrix header within a parent matrix.
* *After you extracted a submatrix from a matrix using "Mat.row", "Mat.col",
* "Mat.rowRange", "Mat.colRange", and others, the resultant submatrix points
* just to the part of the original big matrix. However, each submatrix contains
* information (represented by datastart
and dataend
* fields) that helps reconstruct the original matrix size and the position of
* the extracted submatrix within the original matrix. The method
* locateROI
does exactly that.
*this
as a part.
* @param ofs Output parameter that contains an offset of *this
* inside the whole matrix.
*
* @see org.opencv.core.Mat.locateROI
*/
public void locateROI(Size wholeSize, Point ofs)
{
double[] wholeSize_out = new double[2];
double[] ofs_out = new double[2];
locateROI_0(nativeObj, wholeSize_out, ofs_out);
if(wholeSize!=null){ wholeSize.width = wholeSize_out[0]; wholeSize.height = wholeSize_out[1]; }
if(ofs!=null){ ofs.x = ofs_out[0]; ofs.y = ofs_out[1]; }
return;
}
//
// C++: Mat Mat::mul(Mat m, double scale = 1)
//
/**
* Performs an element-wise multiplication or division of the two matrices.
* *The method returns a temporary object encoding per-element array
* multiplication, with optional scale. Note that this is not a matrix
* multiplication that corresponds to a simpler "*" operator.
* Example:
// C++ code:
* *Mat C = A.mul(5/B); // equivalent to divide(A, B, C, 5)
* * @param m Another array of the same type and the same size as **this
, or a matrix expression.
* @param scale Optional scale factor.
*
* @see org.opencv.core.Mat.mul
*/
public Mat mul(Mat m, double scale)
{
Mat retVal = new Mat(n_mul(nativeObj, m.nativeObj, scale));
return retVal;
}
/**
* Performs an element-wise multiplication or division of the two matrices.
* *The method returns a temporary object encoding per-element array
* multiplication, with optional scale. Note that this is not a matrix
* multiplication that corresponds to a simpler "*" operator.
* Example:
// C++ code:
* *Mat C = A.mul(5/B); // equivalent to divide(A, B, C, 5)
* * @param m Another array of the same type and the same size as **this
, or a matrix expression.
*
* @see org.opencv.core.Mat.mul
*/
public Mat mul(Mat m)
{
Mat retVal = new Mat(n_mul(nativeObj, m.nativeObj));
return retVal;
}
//
// C++: static Mat Mat::ones(int rows, int cols, int type)
//
/**
* Returns an array of all 1's of the specified size and type.
* *The method returns a Matlab-style 1's array initializer, similarly
* to"Mat.zeros". Note that using this method you can initialize an array with
* an arbitrary value, using the following Matlab idiom:
// C++ code:
* *Mat A = Mat.ones(100, 100, CV_8U)*3; // make 100x100 matrix filled with 3.
* *The above operation does not form a 100x100 matrix of 1's and then multiply * it by 3. Instead, it just remembers the scale factor (3 in this case) and use * it when actually invoking the matrix initializer. *
* * @param rows Number of rows. * @param cols Number of columns. * @param type Created matrix type. * * @see org.opencv.core.Mat.ones */ public static Mat ones(int rows, int cols, int type) { Mat retVal = new Mat(n_ones(rows, cols, type)); return retVal; } // // C++: static Mat Mat::ones(Size size, int type) // /** *Returns an array of all 1's of the specified size and type.
* *The method returns a Matlab-style 1's array initializer, similarly
* to"Mat.zeros". Note that using this method you can initialize an array with
* an arbitrary value, using the following Matlab idiom:
// C++ code:
* *Mat A = Mat.ones(100, 100, CV_8U)*3; // make 100x100 matrix filled with 3.
* *The above operation does not form a 100x100 matrix of 1's and then multiply * it by 3. Instead, it just remembers the scale factor (3 in this case) and use * it when actually invoking the matrix initializer. *
* * @param size Alternative to the matrix size specificationSize(cols,
* rows)
.
* @param type Created matrix type.
*
* @see org.opencv.core.Mat.ones
*/
public static Mat ones(Size size, int type)
{
Mat retVal = new Mat(n_ones(size.width, size.height, type));
return retVal;
}
//
// C++: void Mat::push_back(Mat m)
//
/**
* Adds elements to the bottom of the matrix.
* *The methods add one or more elements to the bottom of the matrix. They
* emulate the corresponding method of the STL vector class. When
* elem
is Mat
, its type and the number of columns
* must be the same as in the container matrix.
Decrements the reference counter and deallocates the matrix if needed.
* *The method decrements the reference counter associated with the matrix data. * When the reference counter reaches 0, the matrix data is deallocated and the * data and the reference counter pointers are set to NULL's. If the matrix * header points to an external data set (see "Mat.Mat"), the reference counter * is NULL, and the method has no effect in this case.
* *This method can be called manually to force the matrix data deallocation. But * since this method is automatically called in the destructor, or by any other * method that changes the data pointer, it is usually not needed. The reference * counter decrement and check for 0 is an atomic operation on the platforms * that support it. Thus, it is safe to operate on the same matrices * asynchronously in different threads.
* * @see org.opencv.core.Mat.release */ public void release() { n_release(nativeObj); return; } // // C++: Mat Mat::reshape(int cn, int rows = 0) // /** *Changes the shape and/or the number of channels of a 2D matrix without * copying the data.
* *The method makes a new matrix header for *this
elements. The new
* matrix may have a different size and/or different number of channels. Any
* combination is possible if:
-
*
- No extra elements are included into the new matrix and no elements are
* excluded. Consequently, the product
rows*cols*channels()
must * stay the same after the transformation. * - No data is copied. That is, this is an O(1) operation. Consequently, * if you change the number of rows, or the operation changes the indices of * elements row in some other way, the matrix must be continuous. See * "Mat.isContinuous". *
For example, if there is a set of 3D points stored as an STL vector, and you
* want to represent the points as a 3xN
matrix, do the following:
*
// C++ code:
* *std.vector
Mat pointMat = Mat(vec). // convert vector to Mat, O(1) operation
* *reshape(1). // make Nx3 1-channel matrix out of Nx1 3-channel.
* *// Also, an O(1) operation
* *t(); // finally, transpose the Nx3 matrix.
* *// This involves copying all the elements
* * @param cn New number of channels. If the parameter is 0, the number of * channels remains the same. * @param rows New number of rows. If the parameter is 0, the number of rows * remains the same. * * @see org.opencv.core.Mat.reshape */ public Mat reshape(int cn, int rows) { Mat retVal = new Mat(n_reshape(nativeObj, cn, rows)); return retVal; } /** *Changes the shape and/or the number of channels of a 2D matrix without * copying the data.
* *The method makes a new matrix header for *this
elements. The new
* matrix may have a different size and/or different number of channels. Any
* combination is possible if:
-
*
- No extra elements are included into the new matrix and no elements are
* excluded. Consequently, the product
rows*cols*channels()
must * stay the same after the transformation. * - No data is copied. That is, this is an O(1) operation. Consequently, * if you change the number of rows, or the operation changes the indices of * elements row in some other way, the matrix must be continuous. See * "Mat.isContinuous". *
For example, if there is a set of 3D points stored as an STL vector, and you
* want to represent the points as a 3xN
matrix, do the following:
*
// C++ code:
* *std.vector
Mat pointMat = Mat(vec). // convert vector to Mat, O(1) operation
* *reshape(1). // make Nx3 1-channel matrix out of Nx1 3-channel.
* *// Also, an O(1) operation
* *t(); // finally, transpose the Nx3 matrix.
* *// This involves copying all the elements
* * @param cn New number of channels. If the parameter is 0, the number of * channels remains the same. * * @see org.opencv.core.Mat.reshape */ public Mat reshape(int cn) { Mat retVal = new Mat(n_reshape(nativeObj, cn)); return retVal; } // // C++: Mat Mat::row(int y) // /** *Creates a matrix header for the specified matrix row.
* *The method makes a new header for the specified matrix row and returns it.
* This is an O(1) operation, regardless of the matrix size. The underlying data
* of the new matrix is shared with the original matrix. Here is the example of
* one of the classical basic matrix processing operations, axpy
,
* used by LU and many other algorithms:
// C++ code:
* *inline void matrix_axpy(Mat& A, int i, int j, double alpha)
* * *A.row(i) += A.row(j)*alpha;
* * *Note:
* *In the current implementation, the following code does not work as expected:
*
// C++ code:
* *Mat A;...
* *A.row(i) = A.row(j); // will not work
* *This happens because A.row(i)
forms a temporary header that is
* further assigned to another header. Remember that each of these operations is
* O(1), that is, no data is copied. Thus, the above assignment is not true if
* you may have expected the j-th row to be copied to the i-th row. To achieve
* that, you should either turn this simple assignment into an expression or use
* the "Mat.copyTo" method:
Mat A;...
* *// works, but looks a bit obscure.
* *A.row(i) = A.row(j) + 0;
* *// this is a bit longer, but the recommended method.
* *A.row(j).copyTo(A.row(i));
* * @param y A 0-based row index. * * @see org.opencv.core.Mat.row */ public Mat row(int y) { Mat retVal = new Mat(n_row(nativeObj, y)); return retVal; } // // C++: Mat Mat::rowRange(int startrow, int endrow) // /** *Creates a matrix header for the specified row span.
* *The method makes a new header for the specified row span of the matrix. * Similarly to "Mat.row" and "Mat.col", this is an O(1) operation.
* * @param startrow An inclusive 0-based start index of the row span. * @param endrow An exclusive 0-based ending index of the row span. * * @see org.opencv.core.Mat.rowRange */ public Mat rowRange(int startrow, int endrow) { Mat retVal = new Mat(n_rowRange(nativeObj, startrow, endrow)); return retVal; } // // C++: Mat Mat::rowRange(Range r) // /** *Creates a matrix header for the specified row span.
* *The method makes a new header for the specified row span of the matrix. * Similarly to "Mat.row" and "Mat.col", this is an O(1) operation.
* * @param r "Range" structure containing both the start and the end indices. * * @see org.opencv.core.Mat.rowRange */ public Mat rowRange(Range r) { Mat retVal = new Mat(n_rowRange(nativeObj, r.start, r.end)); return retVal; } // // C++: int Mat::rows() // public int rows() { int retVal = n_rows(nativeObj); return retVal; } // // C++: Mat Mat::operator =(Scalar s) // public Mat setTo(Scalar s) { Mat retVal = new Mat(n_setTo(nativeObj, s.val[0], s.val[1], s.val[2], s.val[3])); return retVal; } // // C++: Mat Mat::setTo(Scalar value, Mat mask = Mat()) // /** *Sets all or some of the array elements to the specified value.
* * @param value Assigned scalar converted to the actual array type. * @param mask Operation mask of the same size as*this
. This is an
* advanced variant of the Mat.operator=(const Scalar& s)
* operator.
*
* @see org.opencv.core.Mat.setTo
*/
public Mat setTo(Scalar value, Mat mask)
{
Mat retVal = new Mat(n_setTo(nativeObj, value.val[0], value.val[1], value.val[2], value.val[3], mask.nativeObj));
return retVal;
}
//
// C++: Mat Mat::setTo(Mat value, Mat mask = Mat())
//
/**
* Sets all or some of the array elements to the specified value.
* * @param value Assigned scalar converted to the actual array type. * @param mask Operation mask of the same size as*this
. This is an
* advanced variant of the Mat.operator=(const Scalar& s)
* operator.
*
* @see org.opencv.core.Mat.setTo
*/
public Mat setTo(Mat value, Mat mask)
{
Mat retVal = new Mat(n_setTo(nativeObj, value.nativeObj, mask.nativeObj));
return retVal;
}
/**
* Sets all or some of the array elements to the specified value.
* * @param value Assigned scalar converted to the actual array type. * * @see org.opencv.core.Mat.setTo */ public Mat setTo(Mat value) { Mat retVal = new Mat(n_setTo(nativeObj, value.nativeObj)); return retVal; } // // C++: Size Mat::size() // /** *Returns a matrix size.
* *The method returns a matrix size: Size(cols, rows)
. When the
* matrix is more than 2-dimensional, the returned size is (-1, -1).
Returns a normalized step.
* *The method returns a matrix step divided by "Mat.elemSize1()". It can be * useful to quickly access an arbitrary matrix element.
* * @param i a i * * @see org.opencv.core.Mat.step1 */ public long step1(int i) { long retVal = n_step1(nativeObj, i); return retVal; } /** *Returns a normalized step.
* *The method returns a matrix step divided by "Mat.elemSize1()". It can be * useful to quickly access an arbitrary matrix element.
* * @see org.opencv.core.Mat.step1 */ public long step1() { long retVal = n_step1(nativeObj); return retVal; } // // C++: Mat Mat::operator()(int rowStart, int rowEnd, int colStart, int // colEnd) // /** *Extracts a rectangular submatrix.
* *The operators make a new header for the specified sub-array of
* *this
. They are the most generalized forms of "Mat.row",
* "Mat.col", "Mat.rowRange", and "Mat.colRange". For example,
* A(Range(0, 10), Range.all())
is equivalent to A.rowRange(0,
* 10)
. Similarly to all of the above, the operators are O(1) operations,
* that is, no matrix data is copied.
Extracts a rectangular submatrix.
* *The operators make a new header for the specified sub-array of
* *this
. They are the most generalized forms of "Mat.row",
* "Mat.col", "Mat.rowRange", and "Mat.colRange". For example,
* A(Range(0, 10), Range.all())
is equivalent to A.rowRange(0,
* 10)
. Similarly to all of the above, the operators are O(1) operations,
* that is, no matrix data is copied.
Range.all()
.
* @param colRange Start and end column of the extracted submatrix. The upper
* boundary is not included. To select all the columns, use Range.all()
.
*
* @see org.opencv.core.Mat.operator()
*/
public Mat submat(Range rowRange, Range colRange)
{
Mat retVal = new Mat(n_submat_rr(nativeObj, rowRange.start, rowRange.end, colRange.start, colRange.end));
return retVal;
}
//
// C++: Mat Mat::operator()(Rect roi)
//
/**
* Extracts a rectangular submatrix.
* *The operators make a new header for the specified sub-array of
* *this
. They are the most generalized forms of "Mat.row",
* "Mat.col", "Mat.rowRange", and "Mat.colRange". For example,
* A(Range(0, 10), Range.all())
is equivalent to A.rowRange(0,
* 10)
. Similarly to all of the above, the operators are O(1) operations,
* that is, no matrix data is copied.
Transposes a matrix.
* *The method performs matrix transposition by means of matrix expressions. It
* does not perform the actual transposition but returns a temporary matrix
* transposition object that can be further used as a part of more complex
* matrix expressions or can be assigned to a matrix:
// C++ code:
* *Mat A1 = A + Mat.eye(A.size(), A.type())*lambda;
* *Mat C = A1.t()*A1; // compute (A + lambda*I)^t * (A + lamda*I)
* * @see org.opencv.core.Mat.t */ public Mat t() { Mat retVal = new Mat(n_t(nativeObj)); return retVal; } // // C++: size_t Mat::total() // /** *Returns the total number of array elements.
* *The method returns the number of array elements (a number of pixels if the * array represents an image).
* * @see org.opencv.core.Mat.total */ public long total() { long retVal = n_total(nativeObj); return retVal; } // // C++: int Mat::type() // /** *Returns the type of a matrix element.
* *The method returns a matrix element type. This is an identifier compatible
* with the CvMat
type system, like CV_16SC3
or 16-bit
* signed 3-channel array, and so on.
Returns a zero array of the specified size and type.
* *The method returns a Matlab-style zero array initializer. It can be used to
* quickly form a constant array as a function parameter, part of a matrix
* expression, or as a matrix initializer.
*
// C++ code:
* *Mat A;
* *A = Mat.zeros(3, 3, CV_32F);
* *In the example above, a new matrix is allocated only if A
is not
* a 3x3 floating-point matrix. Otherwise, the existing matrix A
is
* filled with zeros.
*
Returns a zero array of the specified size and type.
* *The method returns a Matlab-style zero array initializer. It can be used to
* quickly form a constant array as a function parameter, part of a matrix
* expression, or as a matrix initializer.
*
// C++ code:
* *Mat A;
* *A = Mat.zeros(3, 3, CV_32F);
* *In the example above, a new matrix is allocated only if A
is not
* a 3x3 floating-point matrix. Otherwise, the existing matrix A
is
* filled with zeros.
*
Size(cols,
* rows)
.
* @param type Created matrix type.
*
* @see org.opencv.core.Mat.zeros
*/
public static Mat zeros(Size size, int type)
{
Mat retVal = new Mat(n_zeros(size.width, size.height, type));
return retVal;
}
@Override
protected void finalize() throws Throwable {
n_delete(nativeObj);
super.finalize();
}
@Override
public String toString() {
return "Mat [ " +
rows() + "*" + cols() + "*" + CvType.typeToString(type()) +
", isCont=" + isContinuous() + ", isSubmat=" + isSubmatrix() +
", nativeObj=0x" + Long.toHexString(nativeObj) +
", dataAddr=0x" + Long.toHexString(dataAddr()) +
" ]";
}
public String dump() {
return nDump(nativeObj);
}
public int put(int row, int col, double... data) {
int t = type();
if (data == null || data.length % CvType.channels(t) != 0)
throw new java.lang.UnsupportedOperationException(
"Provided data element number (" +
(data == null ? 0 : data.length) +
") should be multiple of the Mat channels count (" +
CvType.channels(t) + ")");
return nPutD(nativeObj, row, col, data.length, data);
}
public int put(int row, int col, float[] data) {
int t = type();
if (data == null || data.length % CvType.channels(t) != 0)
throw new java.lang.UnsupportedOperationException(
"Provided data element number (" +
(data == null ? 0 : data.length) +
") should be multiple of the Mat channels count (" +
CvType.channels(t) + ")");
if (CvType.depth(t) == CvType.CV_32F) {
return nPutF(nativeObj, row, col, data.length, data);
}
throw new java.lang.UnsupportedOperationException("Mat data type is not compatible: " + t);
}
public int put(int row, int col, int[] data) {
int t = type();
if (data == null || data.length % CvType.channels(t) != 0)
throw new java.lang.UnsupportedOperationException(
"Provided data element number (" +
(data == null ? 0 : data.length) +
") should be multiple of the Mat channels count (" +
CvType.channels(t) + ")");
if (CvType.depth(t) == CvType.CV_32S) {
return nPutI(nativeObj, row, col, data.length, data);
}
throw new java.lang.UnsupportedOperationException("Mat data type is not compatible: " + t);
}
public int put(int row, int col, short[] data) {
int t = type();
if (data == null || data.length % CvType.channels(t) != 0)
throw new java.lang.UnsupportedOperationException(
"Provided data element number (" +
(data == null ? 0 : data.length) +
") should be multiple of the Mat channels count (" +
CvType.channels(t) + ")");
if (CvType.depth(t) == CvType.CV_16U || CvType.depth(t) == CvType.CV_16S) {
return nPutS(nativeObj, row, col, data.length, data);
}
throw new java.lang.UnsupportedOperationException("Mat data type is not compatible: " + t);
}
public int put(int row, int col, byte[] data) {
int t = type();
if (data == null || data.length % CvType.channels(t) != 0)
throw new java.lang.UnsupportedOperationException(
"Provided data element number (" +
(data == null ? 0 : data.length) +
") should be multiple of the Mat channels count (" +
CvType.channels(t) + ")");
if (CvType.depth(t) == CvType.CV_8U || CvType.depth(t) == CvType.CV_8S) {
return nPutB(nativeObj, row, col, data.length, data);
}
throw new java.lang.UnsupportedOperationException("Mat data type is not compatible: " + t);
}
public int get(int row, int col, byte[] data) {
int t = type();
if (data == null || data.length % CvType.channels(t) != 0)
throw new java.lang.UnsupportedOperationException(
"Provided data element number (" +
(data == null ? 0 : data.length) +
") should be multiple of the Mat channels count (" +
CvType.channels(t) + ")");
if (CvType.depth(t) == CvType.CV_8U || CvType.depth(t) == CvType.CV_8S) {
return nGetB(nativeObj, row, col, data.length, data);
}
throw new java.lang.UnsupportedOperationException("Mat data type is not compatible: " + t);
}
public int get(int row, int col, short[] data) {
int t = type();
if (data == null || data.length % CvType.channels(t) != 0)
throw new java.lang.UnsupportedOperationException(
"Provided data element number (" +
(data == null ? 0 : data.length) +
") should be multiple of the Mat channels count (" +
CvType.channels(t) + ")");
if (CvType.depth(t) == CvType.CV_16U || CvType.depth(t) == CvType.CV_16S) {
return nGetS(nativeObj, row, col, data.length, data);
}
throw new java.lang.UnsupportedOperationException("Mat data type is not compatible: " + t);
}
public int get(int row, int col, int[] data) {
int t = type();
if (data == null || data.length % CvType.channels(t) != 0)
throw new java.lang.UnsupportedOperationException(
"Provided data element number (" +
(data == null ? 0 : data.length) +
") should be multiple of the Mat channels count (" +
CvType.channels(t) + ")");
if (CvType.depth(t) == CvType.CV_32S) {
return nGetI(nativeObj, row, col, data.length, data);
}
throw new java.lang.UnsupportedOperationException("Mat data type is not compatible: " + t);
}
public int get(int row, int col, float[] data) {
int t = type();
if (data == null || data.length % CvType.channels(t) != 0)
throw new java.lang.UnsupportedOperationException(
"Provided data element number (" +
(data == null ? 0 : data.length) +
") should be multiple of the Mat channels count (" +
CvType.channels(t) + ")");
if (CvType.depth(t) == CvType.CV_32F) {
return nGetF(nativeObj, row, col, data.length, data);
}
throw new java.lang.UnsupportedOperationException("Mat data type is not compatible: " + t);
}
public int get(int row, int col, double[] data) {
int t = type();
if (data == null || data.length % CvType.channels(t) != 0)
throw new java.lang.UnsupportedOperationException(
"Provided data element number (" +
(data == null ? 0 : data.length) +
") should be multiple of the Mat channels count (" +
CvType.channels(t) + ")");
if (CvType.depth(t) == CvType.CV_64F) {
return nGetD(nativeObj, row, col, data.length, data);
}
throw new java.lang.UnsupportedOperationException("Mat data type is not compatible: " + t);
}
public double[] get(int row, int col) {
return nGet(nativeObj, row, col);
}
public int height() {
return rows();
}
public int width() {
return cols();
}
public long getNativeObjAddr() {
return nativeObj;
}
// C++: Mat::Mat()
private static native long n_Mat();
// C++: Mat::Mat(int rows, int cols, int type)
private static native long n_Mat(int rows, int cols, int type);
// C++: Mat::Mat(Size size, int type)
private static native long n_Mat(double size_width, double size_height, int type);
// C++: Mat::Mat(int rows, int cols, int type, Scalar s)
private static native long n_Mat(int rows, int cols, int type, double s_val0, double s_val1, double s_val2, double s_val3);
// C++: Mat::Mat(Size size, int type, Scalar s)
private static native long n_Mat(double size_width, double size_height, int type, double s_val0, double s_val1, double s_val2, double s_val3);
// C++: Mat::Mat(Mat m, Range rowRange, Range colRange = Range::all())
private static native long n_Mat(long m_nativeObj, int rowRange_start, int rowRange_end, int colRange_start, int colRange_end);
private static native long n_Mat(long m_nativeObj, int rowRange_start, int rowRange_end);
// C++: Mat Mat::adjustROI(int dtop, int dbottom, int dleft, int dright)
private static native long n_adjustROI(long nativeObj, int dtop, int dbottom, int dleft, int dright);
// C++: void Mat::assignTo(Mat m, int type = -1)
private static native void n_assignTo(long nativeObj, long m_nativeObj, int type);
private static native void n_assignTo(long nativeObj, long m_nativeObj);
// C++: int Mat::channels()
private static native int n_channels(long nativeObj);
// C++: int Mat::checkVector(int elemChannels, int depth = -1, bool
// requireContinuous = true)
private static native int n_checkVector(long nativeObj, int elemChannels, int depth, boolean requireContinuous);
private static native int n_checkVector(long nativeObj, int elemChannels, int depth);
private static native int n_checkVector(long nativeObj, int elemChannels);
// C++: Mat Mat::clone()
private static native long n_clone(long nativeObj);
// C++: Mat Mat::col(int x)
private static native long n_col(long nativeObj, int x);
// C++: Mat Mat::colRange(int startcol, int endcol)
private static native long n_colRange(long nativeObj, int startcol, int endcol);
// C++: int Mat::dims()
private static native int n_dims(long nativeObj);
// C++: int Mat::cols()
private static native int n_cols(long nativeObj);
// C++: void Mat::convertTo(Mat& m, int rtype, double alpha = 1, double beta
// = 0)
private static native void n_convertTo(long nativeObj, long m_nativeObj, int rtype, double alpha, double beta);
private static native void n_convertTo(long nativeObj, long m_nativeObj, int rtype, double alpha);
private static native void n_convertTo(long nativeObj, long m_nativeObj, int rtype);
// C++: void Mat::copyTo(Mat& m)
private static native void n_copyTo(long nativeObj, long m_nativeObj);
// C++: void Mat::copyTo(Mat& m, Mat mask)
private static native void n_copyTo(long nativeObj, long m_nativeObj, long mask_nativeObj);
// C++: void Mat::create(int rows, int cols, int type)
private static native void n_create(long nativeObj, int rows, int cols, int type);
// C++: void Mat::create(Size size, int type)
private static native void n_create(long nativeObj, double size_width, double size_height, int type);
// C++: Mat Mat::cross(Mat m)
private static native long n_cross(long nativeObj, long m_nativeObj);
// C++: long Mat::dataAddr()
private static native long n_dataAddr(long nativeObj);
// C++: int Mat::depth()
private static native int n_depth(long nativeObj);
// C++: Mat Mat::diag(int d = 0)
private static native long n_diag(long nativeObj, int d);
// C++: static Mat Mat::diag(Mat d)
private static native long n_diag(long d_nativeObj);
// C++: double Mat::dot(Mat m)
private static native double n_dot(long nativeObj, long m_nativeObj);
// C++: size_t Mat::elemSize()
private static native long n_elemSize(long nativeObj);
// C++: size_t Mat::elemSize1()
private static native long n_elemSize1(long nativeObj);
// C++: bool Mat::empty()
private static native boolean n_empty(long nativeObj);
// C++: static Mat Mat::eye(int rows, int cols, int type)
private static native long n_eye(int rows, int cols, int type);
// C++: static Mat Mat::eye(Size size, int type)
private static native long n_eye(double size_width, double size_height, int type);
// C++: Mat Mat::inv(int method = DECOMP_LU)
private static native long n_inv(long nativeObj, int method);
private static native long n_inv(long nativeObj);
// C++: bool Mat::isContinuous()
private static native boolean n_isContinuous(long nativeObj);
// C++: bool Mat::isSubmatrix()
private static native boolean n_isSubmatrix(long nativeObj);
// C++: void Mat::locateROI(Size wholeSize, Point ofs)
private static native void locateROI_0(long nativeObj, double[] wholeSize_out, double[] ofs_out);
// C++: Mat Mat::mul(Mat m, double scale = 1)
private static native long n_mul(long nativeObj, long m_nativeObj, double scale);
private static native long n_mul(long nativeObj, long m_nativeObj);
// C++: static Mat Mat::ones(int rows, int cols, int type)
private static native long n_ones(int rows, int cols, int type);
// C++: static Mat Mat::ones(Size size, int type)
private static native long n_ones(double size_width, double size_height, int type);
// C++: void Mat::push_back(Mat m)
private static native void n_push_back(long nativeObj, long m_nativeObj);
// C++: void Mat::release()
private static native void n_release(long nativeObj);
// C++: Mat Mat::reshape(int cn, int rows = 0)
private static native long n_reshape(long nativeObj, int cn, int rows);
private static native long n_reshape(long nativeObj, int cn);
// C++: Mat Mat::row(int y)
private static native long n_row(long nativeObj, int y);
// C++: Mat Mat::rowRange(int startrow, int endrow)
private static native long n_rowRange(long nativeObj, int startrow, int endrow);
// C++: int Mat::rows()
private static native int n_rows(long nativeObj);
// C++: Mat Mat::operator =(Scalar s)
private static native long n_setTo(long nativeObj, double s_val0, double s_val1, double s_val2, double s_val3);
// C++: Mat Mat::setTo(Scalar value, Mat mask = Mat())
private static native long n_setTo(long nativeObj, double s_val0, double s_val1, double s_val2, double s_val3, long mask_nativeObj);
// C++: Mat Mat::setTo(Mat value, Mat mask = Mat())
private static native long n_setTo(long nativeObj, long value_nativeObj, long mask_nativeObj);
private static native long n_setTo(long nativeObj, long value_nativeObj);
// C++: Size Mat::size()
private static native double[] n_size(long nativeObj);
// C++: size_t Mat::step1(int i = 0)
private static native long n_step1(long nativeObj, int i);
private static native long n_step1(long nativeObj);
// C++: Mat Mat::operator()(Range rowRange, Range colRange)
private static native long n_submat_rr(long nativeObj, int rowRange_start, int rowRange_end, int colRange_start, int colRange_end);
// C++: Mat Mat::operator()(Rect roi)
private static native long n_submat(long nativeObj, int roi_x, int roi_y, int roi_width, int roi_height);
// C++: Mat Mat::t()
private static native long n_t(long nativeObj);
// C++: size_t Mat::total()
private static native long n_total(long nativeObj);
// C++: int Mat::type()
private static native int n_type(long nativeObj);
// C++: static Mat Mat::zeros(int rows, int cols, int type)
private static native long n_zeros(int rows, int cols, int type);
// C++: static Mat Mat::zeros(Size size, int type)
private static native long n_zeros(double size_width, double size_height, int type);
// native support for java finalize()
private static native void n_delete(long nativeObj);
private static native int nPutD(long self, int row, int col, int count, double[] data);
private static native int nPutF(long self, int row, int col, int count, float[] data);
private static native int nPutI(long self, int row, int col, int count, int[] data);
private static native int nPutS(long self, int row, int col, int count, short[] data);
private static native int nPutB(long self, int row, int col, int count, byte[] data);
private static native int nGetB(long self, int row, int col, int count, byte[] vals);
private static native int nGetS(long self, int row, int col, int count, short[] vals);
private static native int nGetI(long self, int row, int col, int count, int[] vals);
private static native int nGetF(long self, int row, int col, int count, float[] vals);
private static native int nGetD(long self, int row, int col, int count, double[] vals);
private static native double[] nGet(long self, int row, int col);
private static native String nDump(long self);
}