【发布时间】:2012-03-23 10:37:50
【问题描述】:
我正在处理视频中的帧并实时(实时)显示。该算法很快,但我想知道是否可以进行任何优化以使其更加无缝。我不知道我的算法中哪些函数占用的时间最多,我猜是 sqrt() 函数,因为它显然做了一些查找,但我不确定。
这是我的算法:
IplImage *videoFrame = cvCreateImage(cvSize(bufferWidth, bufferHeight), IPL_DEPTH_8U, 4);
videoFrame->imageData = (char*)bufferBaseAddress;
int channels = videoFrame->nChannels;
int widthStep = videoFrame->widthStep;
int width = videoFrame->width;
int height = videoFrame->height;
for(int i=0;i<height;i++){
uchar *col = ((uchar *)(videoFrame->imageData + i*widthStep));
for(int j=0;j<width;j++){
double pRed = col[j*channels + 0];
double pGreen = col[j*channels + 1];
double pBlue = col[j*channels + 2];
double dRed = green.val[0] - pRed;
double dGreen = green.val[1] - pGreen;
double dBlue = green.val[2] - pBlue;
double sDRed = dRed * dRed;
double sDGreen = dGreen * dGreen;
double sDBlue = dBlue * dBlue;
double sum = sDRed + sDGreen + sDBlue;
double euc = sqrt(sum);
//NSLog(@"%f %f %f", pRed, pGreen, pBlue);
if (euc < threshold) {
col[j*channels + 0] = white.val[0];
col[j*channels + 1] = white.val[1];
col[j*channels + 2] = white.val[2];
}
}
}
谢谢!
更新 好的,它的作用是遍历图像中的每个像素,并计算像素颜色和绿色之间的欧几里得距离。所以,总的来说这是一个绿屏算法。
我做了一些基准测试,没有使用这个算法的 fps 是 30.0fps。使用这个算法,它下降到大约 8fps。但是,大部分 for drop 来自 col[j*channels + 0]; 如果算法不做任何其他事情并使用数组选择的访问,它会下降到大约 10fps。
更新 2 好的,这很有趣,我正在从双循环内的内容中删除随机行,以查看导致更大开销的原因,这就是我发现的:在堆栈上创建变量会导致 FPS 大幅下降。考虑这个例子:
for(int i=0;i<height;i++){
uchar *col = ((uchar *)(data + i*widthStep));
for(int j=0;j<width;j++){
double pRed = col[j*channels + 0];
double pGreen = col[j*channels + 1];
double pBlue = col[j*channels + 2];
}
}
这会将 fps 降至 11-ish。
另一方面,现在:
for(int i=0;i<height;i++){
uchar *col = ((uchar *)(data + i*widthStep));
for(int j=0;j<width;j++){
col[j*channels + 0];
col[j*channels + 1];
col[j*channels + 2];
}
}
根本不会降低 FPS! FPS 保持在 30.0 左右。认为我应该更新这个,让你们知道这是真正的瓶颈,使变量不是他的堆栈。我想知道我是否内联了所有可能获得纯 30.0fps 的内容。
Nvm...也许没有分配给 var 的表达式甚至没有被计算。
【问题讨论】:
-
您在自行分析之前问这个问题有什么原因吗?
-
在网上搜索“数据驱动设计”;一些文章讲述了如何优化处理器的数据和指令缓存。
-
-
第二次更新...发现了一些有趣的东西...
-
@PragmaOnce:这些表达式没有被评估,因为它们没有副作用。
标签: c++ c algorithm image-processing opencv