opencv: convertir Scalaire de type float ou double type
Quelqu'un peut m'aider dans la conversion de type scalaire de openCV de base de type float ou double?
Scalar Sum1=sum(arg1),Sum2=sum(arg2);
theta.at<float>(i,j)=0.5*atan(Sum1/Sum2);
J'ai de la somme de tous les éléments de Mat objets arg1
et arg2
(quartier de la somme), puis-je effectuer leur division pour trouver l'orientation du champ à chaque pixels. J'ai effectué en somme, mais depuis que je suis à appliquer la fonction arctan, type scalaire ne correspond pas. Quelqu'un peut-il m'aider dans la conversion de type scalaire de types de base?
en fait j'essaye d'appliquer log-gabor filtre et le code que j'ai fait jusqu'à présent est:
//function to enhance fingerprint by log-gabor filter
void filter(Mat src, Mat finalImage)
{
//Sobel derivatives for orientation estimation
Mat grad_x,grad_y,grad2_x,grad2_y,fImage;
src.convertTo(fImage, CV_32F);
//1st and second order gradient
Sobel(fImage,grad_x,CV_32F,1,0,3);
Sobel(fImage,grad_y,CV_32F,0,1,3);
Sobel(fImage,grad2_x,CV_32F,2,0,3);
Sobel(fImage,grad2_y,CV_32F,0,2,3);
//orientation estimation
Mat theta=Mat::zeros(fImage.size(),CV_32F);
Size block=Size(12,12);
copyMakeBorder(grad_x, grad_x, block.height/2, block.height/2,
block.width/2,block.width/2 , BORDER_CONSTANT, Scalar::all(0));
copyMakeBorder(grad2_x, grad2_x, block.height/2, block.height/2,
block.width/2,block.width/2 , BORDER_CONSTANT, Scalar::all(0));
copyMakeBorder(grad_y, grad_y, block.height/2, block.height/2,
block.width/2,block.width/2 , BORDER_CONSTANT, Scalar::all(0));
copyMakeBorder(grad2_y, grad2_y, block.height/2, block.height/2,
block.width/2,block.width/2 , BORDER_CONSTANT, Scalar::all(0));
Size imgSz=grad_x.size();
for(int i=block.width/2;i<imgSz.width-block.width/2;++i)
for(int j=block.height/2;j<imgSz.height-block.height/2;++j)
{
Mat roi_gradX=grad_x(Range(i-block.width/2,i+block.width/2),
Range(j-block.width/2,j+block.width/2));
Mat roi_gradY=grad_y(Range(i-block.width/2,i+block.width/2),
Range(j-block.width/2,j+block.width/2));
Mat roi_gradX2=grad2_x(Range(i-block.width/2,i+block.width/2),
Range(j-block.width/2,j+block.width/2));
Mat roi_gradY2=grad2_y(Range(i-block.width/2,i+block.width/2),
Range(j-block.width/2,j+block.width/2));
Mat arg1,arg2;
multiply(roi_gradX,roi_gradY,arg1);
arg1*=2;
subtract(roi_gradX2,roi_gradY2,arg2);
Scalar Sum1=sum(arg1),Sum2=sum(arg2);
theta.at<float>(i,j)=0.5*atan(Sum1/Sum2);
}
}
je suis en train d'appliquer de log-gabor filtre pour les empreintes digitales de l'amélioration.....j'ai édité mon post et ajouté le code.....
OriginalL'auteur bistaumanga | 2012-06-17
Vous devez vous connecter pour publier un commentaire.
MODIFIER
De la OpenCV docs:
Les images de sortie qui Sobel génère sont des images binaires avec un canal, comme votre
Sum1
etSum2
Scalaires résultat de la vous avez besoin d'utiliseratan(Sum1[0]/Sum2[0])
pour calculer la valeur principale de l'arc tangente.MAL comme Log-Gabor filtre doit être appliqué ...
Semble que vous essayez de faire beaucoup de choses qui pourraient être pris en charge par
cv::filter2D()
... Si vous souhaitez appliquer un filtre de Gabor à votre image, puis jetez un oeil à ce que j'ai trouvé ici:Jetez un oeil à mon montage. J'espère que c'est correct
OriginalL'auteur dom
- Je utiliser
OriginalL'auteur Bobbi Bennett
Scalaire est un 4-élément vecteur de double dérivée de Vec, comme indiqué dans le opencv documentation (http://docs.opencv.org/2.4.9/modules/core/doc/basic_structures.html#scalar)
La fonction cv::somme à la somme des éléments de chaque canal séparément, si la matrice a plus qu'un seul canal, et les stocke sur le Scalaire Vec. Ainsi, pour accéder au double pour chaque canal, vous devez accéder à la position sur le vecteur. (documentation: http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#sum)
OriginalL'auteur ericvm