2013-04-18 3 views
0

У меня есть 2 кадра видеопотока, сделанные движущейся (очень медленной) камерой; после использования (через OpenCV) алгоритма SIFT и findHomography Функция OpenCv У меня есть матрица преобразования, которая описывает движение, выполняемое камерой между 2 кадрами. то, что я хотел бы сделать, это найти точку первого кадра во второй: так что мой код:Ошибка преобразования вектора через матрицу гомографии - C++ OpenCV

H = findHomography(point1, point2, CV_RANSAC); //compute the transformation matrix using the 
             // matching points (the matrix is correct, i checked it) 
Mat dstMat(3, 1, H.type());  
vector<Point3f> vec; 
Mat srcMat(3, 1, H.type()); 
vec.push_back(Point3f(Ptx,Pty,-1)); // fill the 3x1 vector with the coordinate 
             // of the interest point in frame 1 
srcMat= Mat(vec).reshape(1).t();  //conversion of vec in Mat (the vector is correct, i checked it) 
dstMat = H*srcMat;  //compute the arrival point in frame 2 // ERROR 

Но, где написано ошибка, я получаю следующее сообщение об ошибке: OpenCV Error : Assertion failed (type == B.type() & & (тип == CV_32FC1 || тип == CV_64FC1 || тип == CV_32FC2 || тип == CV_64FC2)) в gemm, file/tmp/buildd/ros- fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/core/src/matmul.cpp, строка 711 завершение вызова после вызова экземпляра 'cv :: Exception' what():/tmp/buildd/ROS-Фуерт-opencv2-2.4.2-1precise-20130312-1306/модули/ядро ​​/ SRC/matmul.cpp : 711: ошибка: (-215) type == B.type() & & (type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || тип == CV_64FC2) в функции ГЭММ

Прерванный (ядро сбрасывали)

Почему?

ответ

0

Ваш код немного запутан. В частности, он не уверен, какие записи размером reshape, а затем эффект транспонирования, так как вы также указали до размера srcMat.

Вы можете попробовать следующее:

cv::Mat srcMat(3, 1, CV_32F); // Allocate a 3x1 column vector (floating point) 

srcMat.at<float>(0,0) = Ptx; 
srcMat.at<float>(1,0) = Pty; 
srcMat.at<float>(2,0) = -1.0; 

dstMat = H * srcMat; // Perform matrix-vector multiplication 

Обратите внимание, что вы на самом деле не нужно выделять dstMat заранее; он автоматически выполняется OpenCV.
Yuu следует, возможно, проверить также для типа H, я не уверен, что cv::findHomography возвращает один или двойной точности матрицу, в этом случае вы должны заменить float на double и CV_32F по CV_64F;

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