OpenCV前景检测速度慢

时间:2010-09-06 23:38:44

标签: c++ optimization opencv computer-vision background-subtraction

我正在尝试在学习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 个答案:

答案 0 :(得分:0)

无论您如何实施,对图像中每个像素的操作都会变慢。