2009-12-24 5 views
1

Je construis une application de traitement d'image en boucle fermée en temps réel. Je gaspille au moins 3ms en utilisant cvSmooth():Accélérer cvSmooth?

cvSmooth(Obj->ImgOrig,Obj->ImgSmooth,CV_GAUSSIAN,Params->GaussSize*2+1); 

Cela finit par être l'opération la plus lente seule dans mon code entier. Je veux être en mesure de brouiller mon image à des quantités variables en fonction de l'entrée de l'utilisateur avant de seuillage et de traitement de mon image plus loin. Y a-t-il un moyen plus rapide de faire cela?

Il existe other options pour CvSmooth au-delà d'un gaussien. Y a-t-il une raison de croire qu'ils vont faire mieux? J'utilise OpenCV 1.1 avec les primitives Intel installées.

Répondre

1

Je ne pense pas que vous puissiez faire trop.

Tout d'abord, oui, CV_BLUR au lieu de CV_GAUSSIAN va certainement fonctionner plus vite. Lors du lissage avec Gaussian, la moyenne pondérée est calculée avec des poids gaussiens, mais en utilisant CV_BLUR, tous les pixels dans le rayon reçoivent le même poids. C'est une opération plus simple et peut donc être faite beaucoup plus rapidement que le flou gaussien. Le moyen le plus rapide de faire un flou gaussien est d'utiliser la convolution, qui est beaucoup plus computationnelle.

Peut-être aussi essayer OpenCV 2.0 si ce n'est pas trop de problèmes. Il utilise SSE et OpenMP, qui permettent tous deux le traitement parallèle. Ce n'est pas sûr que ce sera plus rapide.