Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Image stitching camera translation

Hello,

I need some help with image stitching aerial images from UAV. Since OpenCV natively does not support translation, just rotation, I'd like to extend structrure CalcRotation from modules/stitching/src/motion_estimators.cpp (or, better, write a new structure) to support rotation.

The original CalcRotation structure is:

struct CalcRotation
{
    CalcRotation(int _num_images, const std::vector<MatchesInfo> &_pairwise_matches, std::vector<CameraParams> &_cameras)
    : num_images(_num_images), pairwise_matches(&_pairwise_matches[0]), cameras(&_cameras[0]) {}

void operator ()(const GraphEdge &edge)
{
    int pair_idx = edge.from * num_images + edge.to;

    Mat_<double> K_from = Mat::eye(3, 3, CV_64F);
    K_from(0,0) = cameras[edge.from].focal;
    K_from(1,1) = cameras[edge.from].focal * cameras[edge.from].aspect;
    K_from(0,2) = cameras[edge.from].ppx;
    K_from(1,2) = cameras[edge.from].ppy;

    Mat_<double> K_to = Mat::eye(3, 3, CV_64F);
    K_to(0,0) = cameras[edge.to].focal;
    K_to(1,1) = cameras[edge.to].focal * cameras[edge.to].aspect;
    K_to(0,2) = cameras[edge.to].ppx;
    K_to(1,2) = cameras[edge.to].ppy;

    Mat R = K_from.inv() * pairwise_matches[pair_idx].H.inv() * K_to;
    cameras[edge.to].R = cameras[edge.from].R * R;
}

int num_images;
const MatchesInfo* pairwise_matches;
CameraParams* cameras;
};

I'd like to make something like:

Mat t = // translation formula here
cameras[edge.to].t  = cameras[edge.from].t + t; // or something different if this is not correct

Of course, if any of you thinks this way of achieveing translation is bad idea, feel free to post your ideas.

Thanks in advance!