【问题标题】:OpenCV: set matrix values with rangesOpenCV:使用范围设置矩阵值
【发布时间】:2012-08-16 14:09:24
【问题描述】:

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

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”循环之外全为零。你有什么想法?非常感谢你。

【问题讨论】:

  • 你到底想做什么?范围很可能会在每次调用时检查边界 - 如果您编写您尝试设置像素的内容,我们可能会更快地编写一些东西
  • 我编辑了我的问题,谢谢。

标签: loops opencv matrix


【解决方案1】:

有点像

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

【讨论】:

  • 亲爱的马丁,我试过你的代码,它似乎工作得非常完美。但唯一的事情是,我将“uchar* pDest = medianMat.prt (row)”更改为“uchar* pDest = dstMat.prt (row)”,因为“dstMat”是存储新值的地方。然后它崩溃了。正如你所说,我用零创建了“dstMat”。你可以帮帮我吗?非常感谢。
  • @ederman,抱歉错字。 1,2,3 等是来自中位数 - 还是字面意思是 1,2,3 ....?该代码假定 dest 已经创建并且大小正确。 ps什么是src?
  • 顺便说一句,在这段代码中我们在哪里使用“i”?而且我的 medianMat 来自一个通道,但我的 dstMat 是三个通道,所以在这种情况下,“dstMat”的大小是 (5 * 3) = 是 medianMat 的 15 倍。为了对三个通道重复此操作,我认为我只需要为三个迭代编写一个循环。但在此之前,此代码会崩溃。拜托,我需要你的帮助。非常感谢。
  • 顺便说一下,我的 srcMat 和 medianMat 是一样的,其实我应该写 mediumMat 代替。我的 medianMat 大小为 600x800=480000,即来自视频帧,而我的 dstMat 大小为 7200000,这是因为 480000x5x3。我在之前的回答中解释了这一点。谢谢。
  • i 是您问题的复制/粘贴。做小循环通常是不好的——只需将它们展开到上面的 3 个操作中。崩溃只是意味着您需要一个调试器 - 或者在您的脑海中逐步了解计数/指向的内容。
猜你喜欢
  • 2015-06-17
  • 2012-09-12
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多