Есть вот такая интересная функция, я стащил её у китайцев и адаптировал к opencv Картинка для неё: motion_fuzzy_lena.bmp Подозреваю что для других картинок надо настраивать параметры ( int A = 80;int B = 10; и Общее расстояние сдвига const int nTotLen=10; ). Но как пока не разобрался. В пояснениях было написано, что устраняет размытие от прямолинейного равномерного движения. Результат работы:
bool cvMotionRestore(IplImage* Src,IplImage* Dst)
{
BYTE * lpSrc;
//Размеры изображения
LONG lWidth=Src->width;
LONG lHeight=Src->height;
// Изображение количество байтов в строке
LONG lLineBytes=Src->widthStep;
LPBYTE lpDIBBits;
lpDIBBits=(LPBYTE)Src->imageData;
//Переменная цикла
long iColumn;
long jRow;
int i,n,m;
//Временные переменные
int temp1,temp2,totalq,q1,q2,z;
double p,q;
// Назначение коэффициентов
int A = 80;
int B = 10;
//Общее расстояние сдвига
const int nTotLen=10;
// Ширина изображения содержит число длин сдвига ntotlen
int K=((float)lLineBytes/(float)nTotLen);
int error[nTotLen];
for (jRow = 0; jRow < lHeight; jRow++)
{
// Вычислить error[i]
for(i = 0; i < nTotLen; i++)
{
error[i] = 0;
for(n = 0; n < K; n++)
for(m = 0; m <= n; m++)
{
// пиксель начале строки
if(i == 0 && m == 0)
{
temp1=temp2=0;
}
// дифференциальный оператор
else
{
lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + m*nTotLen+i;
temp1=*lpSrc;

lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + m*nTotLen+i-1;
temp2 = *lpSrc;
}

error[i] = error[i] + temp1 - temp2;

}
error[i] = B * error[i] / K;
}

for(iColumn = 0; iColumn < lLineBytes; iColumn++)
{
m = iColumn / nTotLen;
z = iColumn - m*nTotLen;

totalq = 0;
q = 0;

for(n = 0; n <= m; n++)
{
q1 = iColumn - nTotLen*n;

if(q1 == 0) {q = 0;}

// дифференциальный оператор
else
{
q2 = q1 - 1;

lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + q1;
temp1 = *lpSrc;

lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + q2;
temp2 = *lpSrc;

q = (temp1 - temp2) * B;
}

totalq = totalq + q;
}

p = error[z];

// Получить значения f(x,y)
temp1 = totalq + A - p;

// Результат к диапазону 0-255
if(temp1 < 0)
temp1 = 0;

if(temp1 > 255)
temp1 = 255;

Dst->imageData[lLineBytes*jRow + iColumn] = temp1;
}
}
return true;
}
[/code]