return out << "[" << rect.width << " x " << rect.height << " from (" << rect.x << ", " << rect.y << ")]";
}
+static inline std::ostream& operator << (std::ostream& out, const MatSize& msize)
+{
+ int i, dims = msize.p[-1];
+ for( i = 0; i < dims; i++ )
+ {
+ out << msize.p[i];
+ if( i < dims-1 )
+ out << " x ";
+ }
+ return out;
+}
#endif // OPENCV_NOSTL
} // cv
/** @overload */
Mat reshape(int cn, int newndims, const int* newsz) const;
+ /** @overload */
+ Mat reshape(int cn, const std::vector<int>& newshape) const;
+
/** @brief Transposes a matrix.
The method performs matrix transposition by means of matrix expressions. It does not perform the
*/
size_t total() const;
+ /** @brief Returns the total number of array elements.
+
+ The method returns the number of elements within a certain sub-array slice with startDim <= dim < endDim
+ */
+ size_t total(int startDim, int endDim=INT_MAX) const;
+
//! returns N if the matrix is 1-channel (N x ptdim) or ptdim-channel (1 x N) or (N x 1); negative number otherwise
int checkVector(int elemChannels, int depth=-1, bool requireContinuous=true) const;
}
inline
+size_t Mat::total(int startDim, int endDim) const
+{
+ CV_Assert( 0 <= startDim && startDim <= endDim);
+ size_t p = 1;
+ int endDim_ = endDim <= dims ? endDim : dims;
+ for( int i = startDim; i < endDim_; i++ )
+ p *= size[i];
+ return p;
+}
+
+inline
uchar* Mat::ptr(int y)
{
CV_DbgAssert( y == 0 || (data && dims >= 1 && (unsigned)y < (unsigned)size.p[0]) );
int cn = channels();
Mat hdr = *this;
- if( dims > 2 && new_rows == 0 && new_cn != 0 && size[dims-1]*cn % new_cn == 0 )
+ if( dims > 2 )
{
- hdr.flags = (hdr.flags & ~CV_MAT_CN_MASK) | ((new_cn-1) << CV_CN_SHIFT);
- hdr.step[dims-1] = CV_ELEM_SIZE(hdr.flags);
- hdr.size[dims-1] = hdr.size[dims-1]*cn / new_cn;
- return hdr;
+ if( new_rows == 0 && new_cn != 0 && size[dims-1]*cn % new_cn == 0 )
+ {
+ hdr.flags = (hdr.flags & ~CV_MAT_CN_MASK) | ((new_cn-1) << CV_CN_SHIFT);
+ hdr.step[dims-1] = CV_ELEM_SIZE(hdr.flags);
+ hdr.size[dims-1] = hdr.size[dims-1]*cn / new_cn;
+ return hdr;
+ }
+ if( new_rows > 0 )
+ {
+ int sz[] = { new_rows, (int)(total()/new_rows) };
+ return reshape(new_cn, 2, sz);
+ }
}
CV_Assert( dims <= 2 );
return Mat();
}
+Mat Mat::reshape(int _cn, const std::vector<int>& _newshape) const
+{
+ if(_newshape.empty())
+ {
+ CV_Assert(empty());
+ return *this;
+ }
+
+ return reshape(_cn, (int)_newshape.size(), &_newshape[0]);
+}
+
+
NAryMatIterator::NAryMatIterator()
: arrays(0), planes(0), ptrs(0), narrays(0), nplanes(0), size(0), iterdepth(0), idx(0)
{