8
votes

Comment se détendre des points dans les coordonnées de tir de l'appareil photo et obtenez des coordonnées d'image non déclarées correspondantes?

J'utilise opencv pour détester des points de points après l'étalonnage de la caméra. Le code suit.

cvUndistort2( srcImage, dstImage, &camera1, &dist_coeffs1 );


2 commentaires

Êtes-vous sûr que la caméra1 et la caméra sont les mêmes?


Oui, la même chose - j'ai une question fixe. Merci d'avoir souligné. De plus, je reçois un tel comportement à EmguCv puis essayé de déterminer où un tel comportement est introduit: dans OpenCV ou Emgucv elle-même. Il est apparu dans OpenCV.


3 Réponses :


1
votes

Ce peut être votre taille de matrice :)

OpenCV attend un vecteur de points - une colonne ou une matrice de ligne avec deux canaux. Mais comme votre matrice d'entrée n'est que 2 pts et que le nombre de canaux est également 1, il ne peut pas déterminer quelle est l'entrée, la rangée ou la colonne.

donc, remplissez un tapis d'entrée plus long avec des valeurs de body et Ne gardez que le premier: xxx

edit

tandis que OpenCV spécifie des points non déclenchées n'accepte que des entrées à 2 canaux, en réalité, elle accepte.

  • 1-colonne, tapis à 2 canaux, à plusieurs lignes ou (et ce cas n'est pas documenté)
  • 2 colonne, multinatre, tapis à 1 canal ou
  • Multi-colonne, 1 rangée, tapis à 2 canaux

    (comme on le voit dans tandistorT.cpp, la ligne 390)

    mais un bogue à l'intérieur (ou un manque d'informations disponibles), le permet de mélanger à tort le second avec le troisième, quand Le nombre de colonnes est 2. Ainsi, vos données sont considérées comme une colonne 2-rangées, 1-canaux.


2 commentaires

Que voulez-vous dire quand vous dites 1 canal? J'utilise constante CV_32FC2 dans CVCreatemat, ce qui signifie 2 canaux. Merci.


J'ai examiné le code source du FUNC () et la documentation est fausse. Regardez la modification ci-dessus pour plus de détails, s'il vous plaît



14
votes

Les points doivent être «non-formés» à l'aide de la matrice de caméra.

Plus spécifiquement, après l'appel de CVundistortPoints code> La transformation suivante doit être ajoutée: p>

std::vector<cv::Point2f> inputDistortedPoints = ...
std::vector<cv::Point2f> outputUndistortedPoints;
cv::Mat cameraMatrix = ...
cv::Mat distCoeffs = ...

cv::undistortPoints(inputDistortedPoints, outputUndistortedPoints, cameraMatrix, distCoeffs, cv::noArray(), cameraMatrix);


0 commentaires

0
votes

J'atteigne également ces problèmes et je prends un peu de temps pour rechercher enfin à bien comprendre. de
Entrez la description de l'image ici

formule Vous voyez la formule ci-dessus, dans le système ouvert, l'opération de déformation est avant la matrice de la caméra, la commande de processus est donc la suivante: de
image_distorded -> caméra_matrix -> Fonction de non-déformation-> caméra_matrix-> Retour à image_undistorded.

Vous avez donc besoin d'une petite solution et de caméra1 à nouveau. de
Mat Eye3 = Tapis :: Eye (3, 3, CV_64F); de
CvundistortPoints (SRC, DST, DST, & CAMERA1, & DISCOEFFFS1, & Eye3, & Caméra1 );

Sinon, si les deux derniers paramètres sont vides, il serait projeté à une coordonnée d'image normalisée.

Voir Codes: OPENCV-3.4.0-SRC \ Modules \ imgProc \ src \ Undistort.CPP: 297 cvundistortPointSinternal ()


0 commentaires