Search code examples
homography

OpenCV perspectiveTransform broken function


Im trying to use perspectiveTransform but I keep getting error. I tried to follow the solution from this thread http://answers.opencv.org/question/18252/opencv-assertion-failed-for-perspective-transform/

_players[i].getCoordinates() is of type Point

_homography_matrix is a 3 x 3 Mat

    Mat temp_Mat = Mat::zeros(2, 1, CV_32FC2);

    for (int i = 0; i < _players.size(); i++)
    {
        cout << Mat(_players[i].get_Coordinates()) << endl;
        perspectiveTransform(Mat(_players[i].get_Coordinates()), temp_Mat, _homography_matrix);
    }

Also, how do I convert temp_Mat into type Point ?

OpenCV Error: Assertion failed (scn + 1 == m.cols) in cv::perspectiveTransform


Solution

  • Basically you just need to correct from

    Mat(_players[i].get_Coordinates()) ... 
    

    to

    Mat2f(_players[i].get_Coordinates()) ... 
    

    In the first case you are creating a 2x1, 1 channel float matrix, in the second case (correct) you create a 1x1, 2 channel float matrix.

    You also don't need to initialize temp_Mat.

    You can also use template Mat_ to better control the types of your Mats. E.g. creating a Mat of type CV_32FC2 is equivalent to create a Mat2f.

    This sample code will show you also how to convert back and forth between Mat and Point:

    #include <opencv2\opencv.hpp>
    #include <vector>
    using namespace std;
    using namespace cv;
    
    int main()
    {
        // Some random points
        vector<Point2f> pts = {Point2f(1,2), Point2f(5,10)};
    
        // Some random transform matrix
        Mat1f m(3,3, float(0.1));
    
        for (int i = 0; i < pts.size(); ++i)
        {
            cout << "Point: " << pts[i] << endl;
    
            Mat2f dst;
            perspectiveTransform(Mat2f(pts[i]), dst, m);
    
            cout << "Dst mat: " << dst << endl;
    
            Point2f p(dst(0));
            cout << "Dst point: " << p << endl;
        }
        return 0;
    }