在OpenCV中拆分/合并矩阵

时间:2014-03-17 00:38:02

标签: c++ opencv matrix

我正在尝试将Matrix拆分成段,对段进行一些操作,然后再将段合并为一个完整的矩阵。

分裂,我正在做:

for(int j = 0; j < segments; ++j)
        {
            Rect r;
            if(j == lastSegment)
            {
                r = Rect(j * segmentWidth, 0, lastWidth, origHei);
            }
            else
            {
                r = Rect(j * segmentWidth, 0, segmentWidth - 1, origHei);
            }

            tmpFrame(r).copyTo(segmentMats[j]);
}

然后合并它们我尝试:

Mat fullFrame;
for(int i = 0; i < maxSegments; ++i)
{
    int segNum = i % segments;
    Rect r;

    if( segNum == 0)  // 1st segment of frame
    {
        fullFrame.create(origWid, origHei, segmentMats[i].type());
        r = Rect(0, 0, segmentWidth - 1, origHei); 
    }
    else if (segNum == lastSegment)
    {
        r = Rect((i * segmentWidth), 0, lastWidth, origHei);
    }
    else
    {
        r = Rect((i * segmentWidth), 0, segmentWidth - 1, origHei); 
    }

    segmentMats[i].copyTo(fullFrame(r));
}

但我一直在断言失败,

  

OpenCV错误:断言失败(0&lt; = roi.x&amp;&amp; 0&lt; = roi.width&amp;&amp; roi.x   + roi.width&lt; = m.cols&amp;&amp; 0&lt; = roi.y&amp;&amp; 0&lt; = roi.height&amp;&amp; Mat中的roi.y + roi.height&lt; = m.rows)

我没有看到此代码如何在断言值之外设置边框。有人能看到我的错误吗?

感谢。

修改

感谢您的回复。为了澄清我的变量,我已经列出了它们的计算方法。

origWid和origHei是整个框架的高度和宽度

segments =帧被分成的垂直段数。所以segment = 2意味着帧被垂直分成两半。

lastSegment = segments - 1;因为它们是0-inclusive索引的,所以最后一个段具有该索引

segmentWidth = origWid / segments;如果origWid不能被段整除,则此楼层

lastWidth = origWid - (lastSegment * segmentWidth);这样可以解决origWid不能被段整除的问题,并捕获最后一段剩余的列数

segmentMats是细分 Mats

的数组

segNum =细分的顺序。因此,如果segment == 2,则segNum == 0是帧的左半部分,segNum == 1是帧的右半部分

0 个答案:

没有答案