Я обрабатываю кадры в видео и показываю его в реальном времени (в режиме реального времени).Алгоритм быстрый, но мне интересно, есть ли какие-либо оптимизации, которые я могу сделать, чтобы сделать его еще более плавным.Я не знаю, какие функции в моем алгоритме занимают больше всего времени, я предполагаю, что это функция 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.Используя этот алгоритм, он падает примерно до 8 кадров в секунду.Но большая часть отбрасывания происходит от col[j*channels + 0];
Если алгоритм ничего не делает и использует доступ к массиву, он падает примерно до 10 кадров в секунду.
ОБНОВЛЕНИЕ 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];
}
}
Это уменьшает число кадров в секунду до 11-ти.
Теперь это с другой стороны:
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 ... возможно, выражения, которые не назначены для переменной, даже не оцениваются.