Vitala » 05 май 2011, 19:24
собственно имеется стереопара.
фото1 фото2система координат введена на каждом изображении, интересует как средствами OpenCV получить координаты точки А в этой системе координат.
Долго курил доку
тут, так и не разобрался до конца
Достаточно интересная функция:
- Код: Выделить всё • Развернуть
double stereoCalibrate(const vector<vector<Point3f> >& objectPoints, const vector<vector<Point2f> >& imagePoints1, const vector<vector<Point2f> >& imagePoints2, Mat& cameraMatrix1, Mat& distCoeffs1, Mat& cameraMatrix2, Mat& distCoeffs2, Size imageSize, Mat& R, Mat& T, Mat& E, Mat& F, TermCriteria term_crit = TermCriteria(TermCriteria::COUNT+ TermCriteria::EPS, 30, 1e-6), int flags=CALIB_FIX_INTRINSIC)
позволит получить матрицы внутренних(intrinsic) параметров камеры для каждого снимка
Кроме того
- Код: Выделить всё • Развернуть
void projectPoints(const Mat& objectPoints, const Mat& rvec, const Mat& tvec, const Mat& cameraMatrix, const Mat& distCoeffs, vector<Point2f>& imagePoints)
позволит перевести 3d координаты в координаты изображения - а меня вот интересует обратная задача.
Очень желателен рабочий код, ну или хотя бы направить на нужный путь...
Dr.Hell » 21 май 2011, 14:05
В OpenCV 2.2 есть функция cvTriangulatePoints, ей передаются такие параметры:
//CvMat* projPoints1 = cvCreateMat(2,N,CV_32FC1); // Массив координат точек на первом изображении в пикселях виде матрицы:
// | x1 x2 ... xN |
// | y1 y2 ... yN |, N - количество точек (скармливаем много точек в 2D, получаем сразу много точек в 3D, но в конкретном случае точка А только одна)
//CvMat* projPoints2 = cvCreateMat(2,N,CV_32FC1); // Соответствующие точки:: на втором изображении
//CvMat* projMatr1 = cvCreateMat(3,4,CV_32FC1); //Матрица проекции для первого изображения
//CvMat* projMatr2 = cvCreateMat(3,4,CV_32FC1); //Матрица проекции для второго изображения
//CvMat* points4D = cvCreateMat(4,N,CV_32FC1); // output - получаем массив координат точек в трехмерном пространстве сцены в виде матрицы:
// | X1 X2 ... XN |
// | Y1 Y2 ... YN |
// | Z1 Z2 ... ZN |
// | W1 W2 ... WN |, N - количество точек, W - масштабный множитель или как-то так он называется
projMatr1 и projMatr2 получаются так: P = K*Pcam, где К - матрица внутренних параметров камеры, а Pcam = [rmat | tvecs] размерностью 3х4.
rmat получается из rvecs при помощи cvRodrigues2, а rvecs и tvecs в свою очередь легко можно определить при помощи cvFindExtrinsicCameraParams2 для каждой камеры, поскольку мы знаем трехмерные координаты аж 5 точек на сцене. =)
Чтобы получить реальные координаты в координатной системе сцены, нужно после вызова cvTriangulatePoints для каждой полученной точки все три координаты (X, Y, Z) разделить на W.
nav3000 » 13 дек 2011, 14:40
Уважаемый Dr.Hell Вы пишите
CvMat* projMatr1 = cvCreateMat(3,4,CV_32FC1); //Матрица проекции для первого изображения
CvMat* projMatr2 = cvCreateMat(3,4,CV_32FC1); //Матрица проекции для второго изображения
Далее Вы пишите
projMatr1 и projMatr2 получаются так: P = K*Pcam, где К - матрица внутренних параметров камеры, а Pcam = [rmat | tvecs] размерностью 3х4.
Не могли бы Вы более доходчиво объяснить как же всё таки получаются projMatr1 и projMatr2 - при помощи функции cvCreateMat или при помощи произведения K и Pcam? Может я что либо упустил в Вашем объяснении?
Зараннее благодарен.
С Уважением
nav3000