0

我正在使用以下视频帧代码来设置一定范围内的矩阵值:

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" 循环之外都是零。你有什么想法吗?非常感谢。

4

1 回答 1

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 初始化为零

于 2012-08-16T14:29:29.420 回答