OpenCV 前景检测慢

Posted

技术标签:

【中文标题】OpenCV 前景检测慢【英文标题】:OpenCV Foreground Detection slow 【发布时间】:2010-09-06 23:38:43 【问题描述】:

我正在尝试实现 Learning OpenCV 一书中概述的码本前景检测算法here。

该算法仅针对图片的每个像素描述了一种基于码本的方法。所以我采用了想到的最简单的方法——拥有一组码本,每个像素一个,很像 IplImage 的矩阵结构。数组的长度等于图像中的像素数。

我写了以下两个循环来学习背景和分割前景。它利用了我对 src 图像内部矩阵结构的有限理解,并使用指针算法来遍历像素。

  void foreground(IplImage* src, IplImage* dst, codeBook* c, int* minMod, int* maxMod)

 int height = src->height;
 int width = src->width;

 uchar* srcCurrent = (uchar*) src->imageData;
 uchar* srcRowHead = srcCurrent;
 int srcChannels = src->nChannels;
 int srcRowWidth = src->widthStep;

 uchar* dstCurrent = (uchar*) dst->imageData;
 uchar* dstRowHead = dstCurrent;
 // dst has 1 channel
 int dstRowWidth = dst->widthStep;

 for(int row = 0; row < height; row++)
  for(int column = 0; column < width; column++)
   (*dstCurrent) = find_foreground(srcCurrent, (*c), srcChannels, minMod, maxMod);
   dstCurrent++;
   c++;
   srcCurrent += srcChannels;
  
  srcCurrent = srcRowHead + srcRowWidth;
  srcRowHead = srcCurrent;
  dstCurrent = dstRowHead + dstRowWidth;
  dstRowHead = dstCurrent;
 


void background(IplImage* src, codeBook* c, unsigned* learnBounds)

 int height = src->height;
 int width = src->width;

 uchar* srcCurrent = (uchar*) src->imageData;
 uchar* srcRowHead = srcCurrent;
 int srcChannels = src->nChannels;
 int srcRowWidth = src->widthStep;

 for(int row = 0; row < height; row++)
  for(int column = 0; column < width; column++)
   update_codebook(srcCurrent, c[row*column], learnBounds, srcChannels);
   srcCurrent += srcChannels;
  
  srcCurrent = srcRowHead + srcRowWidth;
  srcRowHead = srcCurrent;
 

该程序可以运行,但速度很慢。有什么明显的东西在减慢速度吗?还是简单实现中的固有问题?我有什么办法可以加快速度吗?每个码本都没有按特定顺序排序,因此处理每个像素确实需要线性时间。因此,将背景样本加倍,程序对每个像素运行慢 2,然后将其放大像素数。但就实现而言,我看不到任何清晰、合乎逻辑的方式来对代码元素条目进行排序。

我知道在 opencv 示例中有相同算法的示例实现。然而,这种结构似乎要复杂得多。我希望更多地了解这种方法背后的原因,我知道我可以修改示例以用于现实生活中的应用程序。

谢谢

【问题讨论】:

【参考方案1】:

无论您如何实现,对图像中的每个像素进行操作都会很慢。

【讨论】:

但是这个实现有什么重要的事情会减慢它的速度吗?示例部分中的示例代码运行得更快,但实现了我认为基本相同的想法...... 没有。循环之外的任何内容对于速度优化都可以忽略不计。

以上是关于OpenCV 前景检测慢的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenCV 中实现颜色分割和前景检测?

[综]前景检测GMM

OpenCV(26)图像分割 -- 距离变换与分水岭算法(硬币检测扑克牌检测车道检测)

OpenCV2帧间差分检测运动目标

OpenCV - 滑动拼图验证码自动识别与匹配

OpenCV直线拟合检测