これはOpenCVソースのMat::Mat(const Mat& m, const Rect& roi)
の実装です。自分で書き直したい場合は、それを参照してください。
Mat::Mat(const Mat& m, const Rect& roi)
: flags(m.flags), dims(2), rows(roi.height), cols(roi.width),
data(m.data + roi.y*m.step[0]),
datastart(m.datastart), dataend(m.dataend), datalimit(m.datalimit),
allocator(m.allocator), u(m.u), size(&rows)
{
CV_Assert(m.dims <= 2);
flags &= roi.width < m.cols ? ~CONTINUOUS_FLAG : -1;
flags |= roi.height == 1 ? CONTINUOUS_FLAG : 0;
size_t esz = CV_ELEM_SIZE(flags);
data += roi.x*esz;
CV_Assert(0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols &&
0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows);
if(u)
CV_XADD(&u->refcount, 1);
if(roi.width < m.cols || roi.height < m.rows)
flags |= SUBMATRIX_FLAG;
step[0] = m.step[0]; step[1] = esz;
if(rows <= 0 || cols <= 0)
{
release();
rows = cols = 0;
}
}
そして、正直に言うと、ちょうどROIの定義された上、しないように、操作のすべての種類に複数のリンクを関連:
MatExpr MatExpr::operator()(const Rect& roi) const
MatExpr MatExpr::operator()(const Rect& roi) const
{
MatExpr e;
op->roi(*this, Range(roi.y, roi.y + roi.height), Range(roi.x, roi.x + roi.width), e);
return e;
}
MatOp::roi
void MatOp::roi(const MatExpr& expr, const Range& rowRange, const Range& colRange, MatExpr& e) const
{
if(elementWise(expr))
{
e = MatExpr(expr.op, expr.flags, Mat(), Mat(), Mat(),
expr.alpha, expr.beta, expr.s);
if(expr.a.data)
e.a = expr.a(rowRange, colRange);
if(expr.b.data)
e.b = expr.b(rowRange, colRange);
if(expr.c.data)
e.c = expr.c(rowRange, colRange);
}
else
{
Mat m;
expr.op->assign(expr, m);
e = MatExpr(&g_MatOp_Identity, 0, m(rowRange, colRange), Mat(), Mat());
}
}
老铁、为什么想不开要手写呢?
想完备实现的话、可是一个烧脑的任务。
刚把碟