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 前景检测慢的主要内容,如果未能解决你的问题,请参考以下文章