任何人都可以帮我手动编写一个与roi = img(rect)相同的函数吗?我尝试了一个,但它回归的东西与大局无关。如果我改变了roi_img,那么大图中的相同位置根本不会改变!看来这是关于记忆的事情吗?任何人都可以帮助我吗?
Mat GetRoi(const Mat &src_image, const Rect &rect){
Mat roi_img(rect.height,rect.width,CV_8UC3);
uchar* pxvec = roi_img.ptr<uchar>(0);
int i, j;
int x = rect.y;
int y = rect.x;
for (i = 0; i < roi_img.rows; i++)
{
pxvec = roi_img.ptr<uchar>(i);
//三通道数据都在第一行依次排列,按照BGR顺序
y = rect.x;
for (j = 0; j < roi_img.cols*roi_img.channels();y++ )
{
pxvec[j++] = src_image.at<Vec3b>(x,y)[0];
pxvec[j++] = src_image.at<Vec3b>(x, y)[1];
pxvec[j++] = src_image.at<Vec3b>(x, y)[2];
}
x++;
}
return roi_img;
}
这是在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;
}
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());
}
}
老铁,为什么想不开要手写呢?
想完备实现的话,可是一个烧脑的任务。
刚把碟