我的假设错了!
虽然没有分配新内存,但a
和b
的data
字段不同!
这里的头在mat.hpp
一个代码段,其中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
指着东西)会复制。
没有新的内存将被分配。
说,我们有一个cv::Mat
叫a
。
cv :: Mat b = a;
b
的data
字段将是相同a
的。 没有新的内存将分配给b
。
但对于以下代码:
CV ::板坯B = a.col(1);
这里是matrix.cpp
一个代码段,其中包括CV ::垫函数的实现:
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
字段不是data
字段的副本m
的(m
是传递给构造函数的参数)data
。
所以,我的问题..
的a
和b
的data
场是不同的!
在这种情况下M是什么?你忘了几行以使其可以理解,但我想我知道这是怎么回事..编辑 – 2014-09-23 08:57:31
..你能告诉我在两个cv :: Mat里面发生了什么吗? – alexyangfox 2014-09-23 09:01:03
对不起,有些错别字......现在,修正了..你能帮我解决这个问题吗? – alexyangfox 2014-09-23 09:08:53