À l'aide de estimateRigidTransform au lieu de findHomography
L'exemple dans le lien ci-dessous à l'aide de findHomography
pour obtenir la transformation entre deux ensembles de points. Je veux limiter les degrés de liberté utilisés dans la transformation veux donc remplacer findHomography
avec estimateRigidTransform
.
Ci-dessous-je utiliser estimateRigidTransform
pour obtenir la transformation entre l'objet et la scène de points. objPoints
et scePoints
sont représentés par vector <Point2f>
.
Mat H = estimateRigidTransform(objPoints, scePoints, false);
Suivant la méthode utilisée dans le tutoriel ci-dessus, j'ai envie de transformer le coin des valeurs à l'aide de la transformation H
. Le tutoriel utilise perspectiveTransform
avec la matrice de 3x3 retourné par findHomography
. Avec la rigide transformer il ne renvoie une Matrice 2x3 donc cette méthode ne peut pas être utilisé.
Comment transformer les valeurs des angles, représentée comme vector <Point2f>
avec cette Matrice 2x3. Je suis juste à la recherche à effectuer les mêmes fonctions que le tuto mais avec moins de degrés de liberté pour la transformation. J'ai regardé d'autres méthodes telles que la warpAffine
et getPerspectiveTransform
aussi bien, mais jusqu'à présent pas trouvé une solution.
EDIT:
J'ai essayé la suggestion de David Nilosek. Ci-dessous j'ai ajouté les lignes de la matrice.
Mat row = (Mat_<double>(1,3) << 0, 0, 1);
H.push_back(row);
Cependant cela donne cette erreur lors de l'utilisation de perspectiveTransform.
OpenCV Error: Assertion failed (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0)) in create, file /Users/cgray/Downloads/opencv-2.4.6/modules/core/src/matrix.cpp, line 1486
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /Users/cgray/Downloads/opencv-2.4.6/modules/core/src/matrix.cpp:1486: error: (-215) mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0) in function create
ChronoTrigger a suggéré d'utiliser warpAffine
. Je suis l'appel de la warpAffine
méthode ci-dessous, la taille de 1 x 5 est la taille de objCorners
et sceCorners
.
warpAffine(objCorners, sceCorners, H, Size(1,4));
Cela donne l'erreur ci-dessous, ce qui suggère le mauvais type. objCorners
et sceCorners
sont vector <Point2f>
représentant les 4 coins. J'ai pensé warpAffine
accepterait Mat
images qui peut expliquer l'erreur.
OpenCV Error: Assertion failed ((M0.type() == CV_32F || M0.type() == CV_64F) && M0.rows == 2 && M0.cols == 3) in warpAffine, file /Users/cgray/Downloads/opencv-2.4.6/modules/imgproc/src/imgwarp.cpp, line 3280
OriginalL'auteur Tom smith | 2014-04-29
Vous devez vous connecter pour publier un commentaire.
Je l'ai fait de cette façon dans le passé:
qui est le même que David Nilosek suggéré: ajouter un 0 0 1 ligne à la fin de la matrice
ce code déforme les IMAGES avec une transformation rigide.
Je veux que vous warp/transformer les points, vous devez utiliser
perspectiveTransform
fonction avec une matrice de 3x3 ( http://docs.opencv.org/modules/core/doc/operations_on_arrays.html?highlight=perspectivetransform#perspectivetransform )tutoriel ici:
http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html
ou vous pouvez le faire manuellement en faisant une boucle au-dessus de votre vecteur et
espère que ça aide.
remarque: ne pas tester le code manuel, mais devrait fonctionner. Pas de PerspectiveTransform conversion nécessaire!
edit: c'est le plein (testé) code:
qui donne de sortie comme prévu:
ah ok, désolé. vous pouvez multipliez simplement manuellement:
result.x = a.x*transf.at<double>(0,0) + a.y*transf.at<double>(0,1) + transf.at<double>(0,3); result.y = ...
standard de multiplication de matrice. Je trouve c'est moins sujette aux erreurs que certains point-à-tapis de conversions.ajouté
tested
code pour l'utilisation deperspectiveTransform
sur éparses vecteur de Point2f avec un rigide transformerJ'ai de travailler avec le manuel de code, mais je vais aussi essayer de le modifier vous faites, merci!
OriginalL'auteur Micka
Les transformations affines (le résultat de
cv::estimateRigidTransform
) sont appliqués à l'image avec la fonctioncv::warpAffine
.OriginalL'auteur ChronoTrigger
Le 3x3 homographie forme d'un semi-rigide de transformation est:
Donc, lorsque vous utilisez
estimateRigidTransform
vous pouvez ajouter [0 0 1] comme la troisième ligne, si vous voulez la matrice de 3x3.L'idée de l'exception qu'il est en train de lancer, les matrices ne sont pas du même type. Cette fonction est simplement une multiplication de matrice suivi par une division, vous pourriez le code si vous ne savez pas comment utiliser la fonction.
Je ne suis pas à l'aide de matrices pour perspectiveTransform il est les deux vecteurs de Point2f qui sont du même type. Ce sont les mêmes vecteurs qui sont utilisés dans le tutoriel lien, juste avec une autre matrice de transformation.
OriginalL'auteur David Nilosek