OpenCV warpperspective
Pour quelque raison que chaque fois que j'utilise OpenCV est warpPerspective fonction de (), la finale a déformé l'image ne contient pas tout dans l'image d'origine. La partie gauche de l'image semble être coupée. Je pense que la raison pour laquelle ce qui se passe est que le warped image est créé à la position la plus à gauche de la toile pour la warpPerspective(). Est-il un moyen de résoudre ce problème? Grâce
OriginalL'auteur Hien | 2011-05-22
Vous devez vous connecter pour publier un commentaire.
Le problème se produit car l'homographie de cartes d'une partie de l'image pour x négatif,les valeurs de y qui sont en dehors de la zone de l'image ne peut donc pas être tracé.
ce que nous voulons faire est de compenser le warped sortie par un certain nombre de pixels à 'shunt' l'ensemble de la déformée de l'image en positif de coordonnées(et donc à l'intérieur de la zone de l'image).
Homographies peuvent être combinées à l'aide de la matrice de multiplication (qui est pourquoi ils sont si puissants). Si A et B sont des homographies, alors AB représente l'homographie qui s'applique B, et A.
En raison de ce que tous nous devons faire pour compenser la sortie est de créer la matrice d'homographie pour une traduction par certains offset, puis pré-multiplier par notre matrice d'homographie
Une homographie 2D matrice ressemble à ceci :
où R représente une matrice de rotation, T représente une traduction, et P représente une déformation de la perspective.
Et donc purement de translation de l'homographie ressemble à ceci:
Donc, juste prémultiplier votre homographie par une matrice semblable à celle ci-dessus, et votre image de sortie sera décalée.
(Assurez-vous d'utiliser la matrice de la multiplication, pas d'élément sage multiplication!)
OriginalL'auteur Matt Freeman
Le secret est en deux parties: la matrice de transformation (homographie), et la taille de l'image résultante.
calculer une transformation adéquate à l'aide de la getPerspectiveTransform(). Prendre les 4 points de l'image d'origine, calculer leur position correcte dans la destination, les mettre dans deux vecteurs dans le même ordre, et les utiliser pour calculer la perspective de la matrice de transformation.
Assurez-vous que la destination de la taille de l'image (troisième paramètre de la warpPerspective()) est exactement ce que vous voulez. Définir la Taille(myWidth, myHeight).
OriginalL'auteur Sam
J'ai fait une méthode...
Il est de travail.
Je viens de trouver le maximum de points x et y des points, respectivement, et de le mettre sur
OriginalL'auteur Vinoj John Hosan
Essayer de le ci-dessous
homography_warp
.src
est la source de l'image.H
est votre homographie.dst
est le warped image.homography_warp
ajuster votre homographie comme décrit par https://stackoverflow.com/users/1060066/matt-freeman dans sa réponse https://stackoverflow.com/a/8229116/15485Est-ce que mon code fonctionne?
Je n'ai pas essayé. Je suis juste essayer pour voir ce que vous avez fait.
OriginalL'auteur Alessandro Jacopson
warpPerspective() fonctionne très bien. Pas besoin de le réécrire.
Vous avez probablement utilisé de manière incorrecte.
Rappelez-vous les conseils suivants:
Mat tmp; cv::resize( imageList[image1], tmp, Size(), scaleFactor, scaleFactor ); warpPerspective( tmp, transformedImage, homography, Size( 2*tmp.cols, 2*tmp.rows ) );
Je n'ai aucune idée de comment format dans les commentaires >.<. De toute façon c'est mon extrait de code qui n'utilise warpPerspective. L'homographie ont été prises à partir de la version redimensionnée de 2 images depuis que je suis en utilisant des images en haute résolution. Pouvez-vous laissez-moi savoir ce que je fais de mal? Merci
OriginalL'auteur DanielHsH
c'est ma solution
depuis le troisième paramètre dans "warpPerspective()" est une matrice de transformation,
nous pouvons faire une matrice de transformation ,
qui déplace l'image vers l'arrière en premier ,puis une rotation de l'image,enfin déplace l'image vers l'avant .
Dans mon cas,j'ai une image avec une hauteur de 160 px et la largeur de 160 px.
Je veux faire pivoter l'image autour de [80,80] au lieu de [0,0]
d'abord,déplace l'image vers l'arrière (T1)
puis fait pivoter l'image de (R)
enfin déplace l'image vers l'avant (T2)
OriginalL'auteur user3094631
Ici est un opencv-python solution pour votre problème, je l'ai mis sur github: https://github.com/Sanster/notes/blob/master/opencv/warpPerspective.md
Le point clé est que user3094631 dit, obtenir deux à la traduction de la matrice(T1, T2) et d'appliquer à la Rotation de la matrice(M)
T2*M*T1
Dans le code que je donne, T1 est à partir du point central de l'origine de l'image, et T2 est à partir de la gauche-haut point de la transformée de boundingBox. La transformée de boundingBox vient de l'origine des points d'angle:
OriginalL'auteur Sanster