이것은 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());
}
}
老 铁, 为什么想不开 要 手 寫 呢?
想 完备 实现 的 话, 可是 一个 烧 脑 的 任务.
刚把 碟