OpenCV: wrapPerspective en una image completa

Estoy detectando marcadores en imágenes capturadas por mi iPad. Debido a esto, quiero calcular las traducciones y las rotaciones entre ellas, quiero cambiar la perspectiva de cambio en las imágenes de estas imágenes, por lo que parece que las estoy capturando directamente por encima de los marcadores.

En este momento estoy usando

points2D.push_back(cv::Point2f(0, 0)); points2D.push_back(cv::Point2f(50, 0)); points2D.push_back(cv::Point2f(50, 50)); points2D.push_back(cv::Point2f(0, 50)); Mat perspectiveMat = cv::getPerspectiveTransform(points2D, imagePoints); cv::warpPerspective(*_image, *_undistortedImage, M, cv::Size(_image->cols, _image->rows)); 

Lo que me da estos resultados (mira la esquina inferior derecha para el resultado de warpPerspective ):

foto 1foto 2foto 3

Como es probable que vea la image del resultado contiene un marcador reconocido en la esquina superior izquierda de la image de resultado. Mi problema es que quiero capturar la image completa (sin recortar) para poder detectar otros marcadores en esa image más tarde.

¿Cómo puedo hacer eso? ¿Quizás debería usar vectores de rotation / traducción de la function solvePnP ?

EDITAR:

Desafortunadamente, cambiar el tamaño de la image combada no ayuda mucho, porque la image aún se traduce, por lo que la esquina superior izquierda del marcador está en la esquina superior izquierda de la image.

Por ejemplo, cuando doblé el tamaño con:

 cv::warpPerspective(*_image, *_undistortedImage, M, cv::Size(2*_image->cols, 2*_image->rows)); 

Recibí estas imágenes:

foto 4foto 5

Su código no parece estar completo, por lo que es difícil decir cuál es el problema.

En cualquier caso, la image combada puede tener dimensiones completamente diferentes en comparación con la image de input, por lo que deberá ajustar el parámetro de tamaño que está utilizando para warpPerspective.

Por ejemplo, trate de duplicar el tamaño:

 cv::warpPerspective(*_image, *_undistortedImage, M, 2*cv::Size(_image->cols, _image->rows)); 

Editar:

Para asegurarse de que toda la image se encuentre dentro de esta image, todas las esquinas de su image original deben deformarse para estar dentro de la image resultante. Simplemente calcule el destino deformado para cada uno de los puntos de la esquina y ajuste los puntos de destino en consecuencia.

Para que quede más claro algún código de ejemplo:

 // calculate transformation cv::Matx33f M = cv::getPerspectiveTransform(points2D, imagePoints); // calculate warped position of all corners cv::Point3f a = M.inv() * cv::Point3f(0, 0, 1); a = a * (1.0/az); cv::Point3f b = M.inv() * cv::Point3f(0, _image->rows, 1); b = b * (1.0/bz); cv::Point3f c = M.inv() * cv::Point3f(_image->cols, _image->rows, 1); c = c * (1.0/cz); cv::Point3f d = M.inv() * cv::Point3f(_image->cols, 0, 1); d = d * (1.0/dz); // to make sure all corners are in the image, every position must be > (0, 0) float x = ceil(abs(min(min(ax, bx), min(cx, dx)))); float y = ceil(abs(min(min(ay, by), min(cy, dy)))); // and also < (width, height) float width = ceil(abs(max(max(ax, bx), max(cx, dx)))) + x; float height = ceil(abs(max(max(ay, by), max(cy, dy)))) + y; // adjust target points accordingly for (int i=0; i<4; i++) { points2D[i] += cv::Point2f(x,y); } // recalculate transformation M = cv::getPerspectiveTransform(points2D, imagePoints); // get result cv::Mat result; cv::warpPerspective(*_image, result, M, cv::Size(width, height), cv::WARP_INVERSE_MAP);