【Opencv源码剖析】⼀、create函数
1.
inlineMat::Mat(int_rows,int_cols,int_type):size(&rows)
{
initEmpty();//将data、cols、rows等初始化为0
create(_rows,_cols,_type);
}
2.
inlineMat::Mat(int_rows,int_cols,int_type,constScalar&_s):size(&rows)
{
initEmpty();
create(_rows,_cols,_type);
*this=_s;//给矩阵像素赋值为_s
}
3.
inlinevoidMat::create(int_rows,int_cols,int_type)
{
_type&=TYPE_MASK;
if(dims<=2&&rows==_rows&&cols==_cols&&type()==_type&&data)//如果colsrowsdata已经存在,则返回,什么都不⽤做
return;
intsz[]={_rows,_cols};
create(2,sz,_type);
}
4.
voidMat::create(intd,constint*_sizes,int_type)
{
inti;
CV_Asrt(0<=d&&_sizes&&d<=CV_MAX_DIM&&_sizes);
_type=CV_MAT_TYPE(_type);
if(data&&(d==dims||(d==1&&dims<=2))&&_type==type())
{
if(d==2&&rows==_sizes[0]&&cols==_sizes[1])
return;
for(i=0;i
if(size[i]!=_sizes[i])
break;
if(i==d&&(d>1||size[1]==1))
return;
}
relea();
if(d==0)
return;
flags=(_type&CV_MAT_TYPE_MASK)|MAGIC_VAL;
tSize(*this,d,_sizes,0,true);
if(total()>0)
{
#ifdefHAVE_TGPU
if(!allocator||allocator==tegra::getAllocator())allocator=tegra::getAllocator(d,_sizes,_type);
#endif
if(!allocator)//如果没有分配内存,则去分配,否则则⽤allocate把指针指向data就⾏了,不⽤重复分配
{
size_ttotalsize=alignSize(step.p[0]*size.p[0],(int)sizeof(*refcount));
data=datastart=(uchar*)fastMalloc(totalsize+(int)sizeof(*refcount));
refcount=(int*)(data+totalsize);
*refcount=1;//引⽤计数
}
el
{
#ifdefHAVE_TGPU
try
{
allocator->allocate(dims,size,_type,refcount,datastart,data,step.p);
CV_Asrt(step[dims-1]==(size_t)CV_ELEM_SIZE(flags));
}catch(...)
{
allocator=0;
size_ttotalSize=alignSize(step.p[0]*size.p[0],(int)sizeof(*refcount));
data=datastart=(uchar*)fastMalloc(totalSize+(int)sizeof(*refcount));
refcount=(int*)(data+totalSize);
*refcount=1;
}
#el
allocator->allocate(dims,size,_type,refcount,datastart,data,step.p);
CV_Asrt(step[dims-1]==(size_t)CV_ELEM_SIZE(flags));
#endif
}
}
finalizeHdr(*this);
}
Mat的拷贝构造函数
inlineMat::Mat(constMat&m)
:flags(),dims(),rows(),cols(),data(),
refcount(nt),datastart(art),dataend(d),
datalimit(mit),allocator(tor),size(&rows)
{
if(refcount)
CV_XADD(refcount,1);
if(<=2)
{
step[0]=[0];step[1]=[1];
}
el
{
dims=0;
copySize(m);
}
}
本文发布于:2023-01-20 13:40:30,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/101526.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |