2017-12-16 6 views
1

roi = img(rect)と同じ関数を手作業で手伝ってもらえますか?私は1つを試しましたが、それは返すものは大きな画像とは関係がありません。私がroi_imgを変更すると、大きな画像の同じ位置はまったく変わりません!誰も私を助けることができますか?opencv2で手作業でRoi関数を書くには

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; 
} 

答えて

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

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

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

刚把碟

関連する問題