如何在opencv2中手动编写Roi函数

问题描述 投票:1回答:1

任何人都可以帮我手动编写一个与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;
}
c++ opencv computer-vision
1个回答
1
投票

这是在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());
    }
}

老铁,为什么想不开要手写呢?

想完备实现的话,可是一个烧脑的任务。

刚把碟

© www.soinside.com 2019 - 2024. All rights reserved.