Перейти к содержимому
Compvision.ru
DEV

Фокусное растояние?

Recommended Posts

Здравствуйте!

Такой вопрос:

Как найти матрицу внутренней калибровки камеры, т.е. фокусное расстояние и размер пикселя?

Можно ли сделать это с помощью фундаментальной матрицы или как-то так?

Допустим я нашел 2d координаты точек на двух изображениях (пары точек). Они не лежат на одной плоскости, т.е. хаотично разбросаны. Можно ли найти по этим данным матрицу внутренней калибровки?

Может кто нибудь решал данную задачу?

З.Ы. Я в интернете искал. Решение проблемы я не нашел.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Здравствуйте!

Такой вопрос:

Как найти матрицу внутренней калибровки камеры, т.е. фокусное расстояние и размер пикселя?

Можно ли сделать это с помощью фундаментальной матрицы или как-то так?

Допустим я нашел 2d координаты точек на двух изображениях (пары точек). Они не лежат на одной плоскости, т.е. хаотично разбросаны. Можно ли найти по этим данным матрицу внутренней калибровки?

Может кто нибудь решал данную задачу?

З.Ы. Я в интернете искал. Решение проблемы я не нашел.

Здесь обсуждалась похожая проблема:

http://www.compvision.ru/forum/index.php?showtopic=325

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Эта тема похожа, но там не обсуждается, как найти матрицу внутренней калибровки.

Посмотрел некоторые ссылки, там по-моему тоже нету.

Матрица гомографии вроде полезная вещь. Но его можно найти, если точки не лежат на одной плоскости?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Эта тема похожа, но там не обсуждается, как найти матрицу внутренней калибровки.

Посмотрел некоторые ссылки, там по-моему тоже нету.

Матрица гомографии вроде полезная вещь. Но его можно найти, если точки не лежат на одной плоскости?

Здесь пример использования POSIT.

http://opencv.willowgarage.com/wiki/Posit

Если взаимное расположение точек в 3д известно то калибровать можно при помощи: cvCalibrateCamera2. (получается матрица, в которой есть фокусные расстояния по х и по у)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нет, координаты точек неизвестны.

Должно быть другой выход. Есть же программы, которые реконструируют объекты по нескольким изображениям?!

Т.е. создается 3d модель объекта, не задавая 3d координаты, и фокусное растояние.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

З.Ы. Я не про реконструкции домов, и прочих прямоугольных объектов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
З.Ы. Я не про реконструкции домов, и прочих прямоугольных объектов.

Почитайте вот это, может пригодится:

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

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо!

Буду смотреть!

Надеюсь матрица гомографии сработает для точек, не находящихся на одной плоскости в пространстве!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Спасибо!

Буду смотреть!

Надеюсь матрица гомографии сработает для точек, не находящихся на одной плоскости в пространстве!

Гомография вычисляется для экранных плоскостей кадров, то есть Вы сможете найти взаимную ориентацию камер. А зная ориентацию камер, можно найти координаты точек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×