OpenCV:设置带范围的矩阵值

时间:2012-08-16 14:09:24

标签: loops opencv matrix

我在视频帧中使用以下代码来设置某些范围的矩阵值:

for ( int row = 0, i = 0; row < srcMat.rows; ++row, i ++ )
{
   uchar* p = medianMat.ptr ( row );
   for ( int col = 0, j = 0; col < srcMat.cols; ++ col, j ++ )
   {
     dstMat ( cv::Range::all(), cv::Range ( i * 5 +1, i * 5 + 4 )).setTo ( *p );
     data++;
   }
}

我需要将* p复制到dstMat的三个连续值,并在它们之前和之后留下一个零空格。也就是说,如果我的dstMat全部为零,并且* p值为“1,2,3”,那么我的目标是使dstMat看起来像“”01110 02220 03330“等等。我希望我这很容易理解。 我的问题是:一帧使用大约70到80毫秒,这对我的情况来说太慢了。对于单帧,我最多只有30毫秒。有没有更有效的方法来做到这一点? 此外,“dstMat”值在“for”循环之外都为零。你有什么想法?非常感谢你。

1 个答案:

答案 0 :(得分:2)

类似

for ( int row = 0; row < dstMat.rows; ++row ){
   uchar* pMed = medianMat.ptr ( row );
   uchar* pDest = dstMat.ptr ( row );  // resulting image
   pDest++; // skip the first place '0'

   for ( int col = 0; col < dstMat.cols; col+=5 )    {
     // copy the value from median into the destination in 3 consecutive values
     *pDest++ = *pMed; // copy 1 to dest
     *pDest++ = *pMed; // copy 1 to dest
     *pDest++ = *pMed; // copy 1 to dest

     pDest+=2; // skip the two zeros
     pMed++; // move to the '2'
   }
}

您可以使用cv :: zeros将新的cv :: mat初始化为零