DEV 0 Жалоба Опубликовано September 27, 2010 Здравствуйте! Такой вопрос: Как найти матрицу внутренней калибровки камеры, т.е. фокусное расстояние и размер пикселя? Можно ли сделать это с помощью фундаментальной матрицы или как-то так? Допустим я нашел 2d координаты точек на двух изображениях (пары точек). Они не лежат на одной плоскости, т.е. хаотично разбросаны. Можно ли найти по этим данным матрицу внутренней калибровки? Может кто нибудь решал данную задачу? З.Ы. Я в интернете искал. Решение проблемы я не нашел. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано September 27, 2010 Здравствуйте! Такой вопрос: Как найти матрицу внутренней калибровки камеры, т.е. фокусное расстояние и размер пикселя? Можно ли сделать это с помощью фундаментальной матрицы или как-то так? Допустим я нашел 2d координаты точек на двух изображениях (пары точек). Они не лежат на одной плоскости, т.е. хаотично разбросаны. Можно ли найти по этим данным матрицу внутренней калибровки? Может кто нибудь решал данную задачу? З.Ы. Я в интернете искал. Решение проблемы я не нашел. Здесь обсуждалась похожая проблема: http://www.compvision.ru/forum/index.php?showtopic=325 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
DEV 0 Жалоба Опубликовано September 27, 2010 Эта тема похожа, но там не обсуждается, как найти матрицу внутренней калибровки. Посмотрел некоторые ссылки, там по-моему тоже нету. Матрица гомографии вроде полезная вещь. Но его можно найти, если точки не лежат на одной плоскости? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано September 27, 2010 Эта тема похожа, но там не обсуждается, как найти матрицу внутренней калибровки. Посмотрел некоторые ссылки, там по-моему тоже нету. Матрица гомографии вроде полезная вещь. Но его можно найти, если точки не лежат на одной плоскости? Здесь пример использования POSIT. http://opencv.willowgarage.com/wiki/Posit Если взаимное расположение точек в 3д известно то калибровать можно при помощи: cvCalibrateCamera2. (получается матрица, в которой есть фокусные расстояния по х и по у) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
DEV 0 Жалоба Опубликовано September 27, 2010 Нет, координаты точек неизвестны. Должно быть другой выход. Есть же программы, которые реконструируют объекты по нескольким изображениям?! Т.е. создается 3d модель объекта, не задавая 3d координаты, и фокусное растояние. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
DEV 0 Жалоба Опубликовано September 27, 2010 З.Ы. Я не про реконструкции домов, и прочих прямоугольных объектов. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано September 28, 2010 З.Ы. Я не про реконструкции домов, и прочих прямоугольных объектов. Почитайте вот это, может пригодится: Generation_of_a_3_D_Face_Model_from_One_Cameral.pdf http://cmp.felk.cvut.cz/~chum/Teze/Chum-PhD.pdf http://ru.wikipedia.org/wiki/RANSAC А это как найти перемещение и вращение из гомографии: #define cvM32f(Matrix,i,j) CV_MAT_ELEM(*(Matrix),float,(i),(j)) #define cvV32f(Matrix,i) Matrix->data.fl //Plane Pose Estimation void HomographyPoseEstimation(CvMat*Homography,CvMat*Intrinsic,CvMat*R,CvMat*T){ int i; float l; float cNorm,dNorm; CvMat*IntrinsicInverse=cvCreateMat(3,3,CV_32FC1); CvMat*H=cvCreateMat(3,3,CV_32FC1); CvMat*R1=cvCreateMat(3,1,CV_32FC1); CvMat*R2=cvCreateMat(3,1,CV_32FC1); CvMat*R3=cvCreateMat(3,1,CV_32FC1); CvMat*c=cvCreateMat(3,1,CV_32FC1); CvMat*p=cvCreateMat(3,1,CV_32FC1); CvMat*d=cvCreateMat(3,1,CV_32FC1); cvInvert(Intrinsic,IntrinsicInverse,CV_LU); //cvPrintMatrix(IntrinsicInverse); //H=Intrinsic^(-1) * Homography cvGEMM(IntrinsicInverse,Homography,1,NULL,1,H,0); // cvPrintMatrix(H); l=sqrt(sqrt(cvM32f(H,0,0)*cvM32f(H,0,0)+cvM32f(H,1,0)*cvM32f(H,1,0)+cvM32f(H,2,0)*cvM32f(H,2,0))*sqrt(cvM32f(H,0,1)*cvM32f(H,0,1)+cvM32f(H,1,1)*cvM32f(H,1,1)+cvM32f(H,2,1)*cvM32f(H,2,1))); //printf("l=%f\n",l); for(i=0;i<3;i++) cvM32f(R1,i,0)=cvM32f(H,i,0)/l; for(i=0;i<3;i++) cvM32f(R2,i,0)=cvM32f(H,i,1)/l; for(i=0;i<3;i++) cvM32f(T,i,0)=cvM32f(H,i,2)/l; for(i=0;i<3;i++) cvM32f(c,i,0)=cvM32f(R1,i,0)+cvM32f(R2,i,0); //c=R1 + R2 cvCrossProduct(R1,R2,p); //p=R1 x R2 cvCrossProduct(c,p,d); //d=c x p //Compute c and d Norms cNorm=cvNorm(c,NULL,CV_L2,NULL); dNorm=cvNorm(d,NULL,CV_L2,NULL); for(i=0;i<3;i++) cvM32f(R1,i,0)=1/sqrt(2)*(cvM32f(c,i,0)/cNorm + cvM32f(d,i,0)/dNorm); for(i=0;i<3;i++) cvM32f(R2,i,0)=1/sqrt(2)*(cvM32f(c,i,0)/cNorm - cvM32f(d,i,0)/dNorm); cvCrossProduct(R1,R2,R3); //R2=R1 x R2 //Get Rotation Matrix for(i=0;i<3;i++) { cvM32f(R,i,0)=cvM32f(R1,i,0); cvM32f(R,i,1)=cvM32f(R2,i,0); cvM32f(R,i,2)=cvM32f(R3,i,0); } // cvPrintMatrix(R); // cvPrintMatrix(T); cvReleaseMat(&IntrinsicInverse); cvReleaseMat(&H); cvReleaseMat(&R1); cvReleaseMat(&R2); cvReleaseMat(&R3); cvReleaseMat(&c); cvReleaseMat(&p); cvReleaseMat(&d); } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
DEV 0 Жалоба Опубликовано September 28, 2010 Спасибо! Буду смотреть! Надеюсь матрица гомографии сработает для точек, не находящихся на одной плоскости в пространстве! Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано September 28, 2010 Спасибо! Буду смотреть! Надеюсь матрица гомографии сработает для точек, не находящихся на одной плоскости в пространстве! Гомография вычисляется для экранных плоскостей кадров, то есть Вы сможете найти взаимную ориентацию камер. А зная ориентацию камер, можно найти координаты точек. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
DEV 0 Жалоба Опубликовано September 28, 2010 Спасибо! Буду экспериментировать! Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах