- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
Mat a = (Mat_(3,3) << 1, 0, 0, 0, 1, 0, 0, 0, 1);
cv::Mat b=a.row(1);
cv::Mat
有一个名为 data
的字段,它是一个指针,指向 Mat 的实际内存。
我知道这是浅拷贝,不会为 b
分配新内存来存储 a.row(1)
中的元素。a
和 b
将共享同一 block 内存。b
的 data
字段将与 a
的 data
字段相同。
我的问题是:
如果 b
的 data
字段与 a
的 data
字段相同,那么有什么区别a
和 b
?
它们的data
字段是一样的,但是其他函数知道a
和b
是不同的!!
他们怎么知道的?
最佳答案
我的假设是错误的!
虽然没有分配新的内存,但是a
和b
的data
字段是不一样的!!
这是 mat.hpp
中 header 的片段代码,其中 cv::Mat
定义如下:
class CV_EXPORTS Mat
{
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;
uchar* data;
//! pointer to the reference counter;
// when array points to user-allocated data, the pointer is NULL
int* refcount;
// other members
...
};
当你进行浅拷贝时,只有指针,data
(不是data
指向的东西)会被复制。
不会分配新内存。
例如,我们有一个名为 a
的 cv::Mat
。
cv::Mat b=a;
b
的 data
字段将与 a
的相同。不会为 b
分配新内存。
但是下面的代码呢:
cv::Mat b=a.col(1);
这是 matrix.cpp
的一段代码,其中包括 cv::Mat 函数的实现:
Mat::Mat(const Mat& m, const Range* ranges)
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
datalimit(0), allocator(0), u(0), size(&rows)
{
int i, d = m.dims;
CV_Assert(ranges);
for( i = 0; i < d; i++ )
{
Range r = ranges[i];
CV_Assert( r == Range::all() || (0 <= r.start && r.start < r.end && r.end <= m.size[i]) );
}
*this = m;
for( i = 0; i < d; i++ )
{
Range r = ranges[i];
if( r != Range::all() && r != Range(0, size.p[i]))
{
size.p[i] = r.end - r.start;
data += r.start*step.p[i];
flags |= SUBMATRIX_FLAG;
}
}
updateContinuityFlag(*this);
}
cv::Mat::col()
会返回一个新的cv::Mat
,它需要调用一个构造函数。
上面的构造函数用于构造一个 cv::Mat
和另一个 cv::Mat
引用,以及一个 cv::Range
。
请注意,data
字段不是 m
的 data
字段的拷贝(m
是参数传递给构造函数)data
。
所以,对于我的问题..
a
和b
的data
字段不一样!
关于c++ - 如果 a 是 cv::Mat 和 cv::Mat b=a.row(1),那么这两个 cv::Mat 实例有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25990849/
我是一名优秀的程序员,十分优秀!