2015-08-18 4 views
-1

Я пытаюсь использовать перспективу Transform, но я все время получаю ошибку. Я пытался следовать решению из этого потока http://answers.opencv.org/question/18252/opencv-assertion-failed-for-perspective-transform/OpenCV перспективаTransform сломанная функция

_players [я] .getCoordinates() имеет тип точки

_homography_matrix является 3 х 3 Мат

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); 
    } 

Кроме того, как конвертировать temp_Mat в тип Point?

OpenCV Ошибка: не удалось Assertion (SCN + 1 == m.cols) в резюме :: perspectiveTransform

ответ

1

В основном вам просто нужно исправить с

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

в

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

В первом случае вы создаете 2x1, 1-канальную плавучую матрицу, во втором случае (правильно) вы создаете матрицу с плавающей точкой 1x1, 2 канала.

Вам также не нужно инициализировать temp_Mat.

Вы также можете использовать шаблон Mat_, чтобы лучше контролировать типы ваших Mat s. Например. создание Mat типа CV_32FC2 эквивалентно созданию Mat2f.

Этот пример кода покажет вам, также как конвертировать туда и обратно между Mat и 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; 
} 
+0

спасибо, что сделал это слишком :) – RuiQi

Смежные вопросы