Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops OpenCV:使用范围设置矩阵值_Loops_Opencv_Matrix - Fatal编程技术网

Loops OpenCV:使用范围设置矩阵值

Loops OpenCV:使用范围设置矩阵值,loops,opencv,matrix,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,

我使用以下视频帧代码设置具有一定范围的矩阵值:

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++;
   }
}
for(int行=0,i=0;行
我需要将*p复制到dstMat的三个连续值,并在它们之前和之后留下一个零空间。也就是说,如果我的dstMat都是零,*p值是“1,2,3”,那么我的目标是使dstMat看起来像“01110 02220 03330”,等等。我希望我能使它易于理解。 我的问题是:一个帧大约需要70到80毫秒,这对我来说太慢了。一个帧最多需要30毫秒。有没有更有效的方法? 此外,“dstMat”值在“for”循环之外都是零。您有什么想法吗?非常感谢。

诸如此类

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'
   }
}
for(int行=0;行

你可以使用cv::zeros初始化一个新的cv::mat归零

你到底想做什么?很可能每次调用时,范围都在检查边界-如果你写下你想设置的像素,我们可能可以写一些东西快速我编辑了我的问题,谢谢。亲爱的Martin,我试过你的代码,它似乎工作得非常完美。但唯一的问题是,我将“uchar*pDest=medianMat.prt(行)”更改为“uchar*pDest=dstMat.prt(行)”,因为“dstMat”是存储新值的。然后它崩溃了。我创建了“dstMat”“如你所说,用零。你能帮我吗?非常感谢。@ederman,对不起,输入错误。1,2,3等是来自中位数,还是字面意思是1,2,3。。。。?代码假定dest已经创建并且大小正确。什么是src?顺便问一下,在代码中我们在哪里使用“i”?我的medianMat来自一个通道,但我的dstMat有三个通道,因此在本例中,“dstMat”的大小是(5*3)=medianMat的15倍。为了对三个通道重复这一点,我认为我只需要为三次迭代编写一个循环。但在此之前,此代码崩溃。拜托,我需要你的帮助。非常感谢。顺便说一下,我的srcMat和medianMat是一样的,实际上我应该写medianMat。我的medianMat大小是600x800=480000,这是来自视频帧,而我的dstMat大小是7200000,这是因为48000x5x3。我在先前的回答中解释了这一点。谢谢。
i
是你问题的复制/粘贴。执行小循环通常是不好的-只需将它们展开到上述3个操作中即可。崩溃只是意味着你需要一个调试器——或者在你的脑海中逐步了解什么是计数/指向。