我在视频帧中使用以下代码来设置某些范围的矩阵值:
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”循环之外都为零。你有什么想法?非常感谢你。
答案 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初始化为零