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

FreeGOD

Пользователи
  • Количество публикаций

    24
  • Зарегистрирован

  • Посещение

Все публикации пользователя FreeGOD

  1. Dr.Hell В демках OpenCV должен быть пример работы с шахматной доской, вот только с одной камерой. Используйте справочник OpenCV
  2. Да) Second Edition. Только теперь полная версия)
  3. Я как-то писал: Так вот... При любых позициях все работает, но проблема в самих точках. Они должны быть на одной плоскости. Чем больше отклонение от плоскости, тем хуже находит эпиполярные линии. До того как я это узнал, прошло много времени. Потом я попытался всё сделать по-другому, составил громадную систему уравнений, там остаются неизвестные. Недавно нашел одну хорошую книгу на Английском, пробежался по картинкам, но еще не читал. На этом пока остановился. Не хватает времени и идей.
  4. Извините, но я только сейчас увидел ваше сообщение, с файлом. Сейчас не могу посмотреть, только вечером.
  5. С эпиполярными линиями все понятно, все работает почти при любых позициях камер. Но все-же не могу найти координаты камер Пробовал по разному: cvFindHomography вроде что-то возвращает, но не знаю как использовать дальше. int out=cvStereoRectifyUncalibrated(&points_1,&points_2,&fund_mat,cvSize(640,480),&H1,&H2); Здесь H1 полностью равен H2. out=1; Извините что надоедаю, но КАК МНЕ НАЙТИ КООРДИНАТЫ КАМЕР?
  6. Спасибо за ссылки! Вот бы с самого начала они у меня были. Скоро пойму как работают матрицы хомографии, потом можно будет править миром
  7. Получилось, Спасибо! Я расставил камеры по прямым углом, Эпиполярные линии рисует точно ! Наверное в первый раз не получилось из-за не правильного расположения камер, надо проверить по разным положениям камер (Вечером сделаю). Если есть эпиполярные линии и эпиполярные точки, как мне найти координаты камер? Может это тоже OpenCV сможет сделать?
  8. Да я знаю. Некоторые точки рисует правильно, например 1 точка. Если нарисовать вторую линию : -0.166,0.986,27.682 , (394,78) Y=(0.166*394-27.682)/0.986; Y равно 38.25, а не 78 !
  9. Написал на Delphi, чтобы не заморачиватся на C++. <code class='no-highlight'>function getY(x:Integer; a,b,c:Double):Integer; Begin //уравнение прямой ax+by+c=0, подставляю X, и получаю Y. result:=Round((-a*x-c)/B); end; procedure DrawLines; //Линии которые возвращает cvComputeCorrespondEpilines const arr:Array [0..7,0..2] of Double=((-0.132,0.991,-15.688),(-0.166,0.986,27.682), (-0.031,1.000,-141.481),(-0.005,1.000,-173.332),(-0.025,1.000,-149.178), (0.013,1.000,-195.933),(0.033,0.999,-220.192), (0.062,0.998,-255.926)); //точки на изображении const pts:Array [0..7,0..1] of double =( (337,61), (394,78),(264,155),(502,174), (336,158),(311,184),(195,212),(408,240)); var i,j:Integer; begin image1.Canvas.Pen.Color:=clRed; for j:=0 to 7 do Begin image1.Canvas.Ellipse(Round(pts[j][0]-3),Round(pts[j][1])-3,Round(pts[j][0])+3,Round(pts[j][1])+3);//Здесь рисуем точки for i:=1 to 100 do Begin image1.Canvas.MoveTo((i-1)*10, getY((i-1)*10, arr[j][0], arr[j][1], arr[j][2])); image1.Canvas.LineTo(i*10, getY(i*10, arr[j][0], arr[j][1], arr[j][2])); end; end; end;
  10. Спасибо!! Вроде получилось, НО не правильно. Как мне задавать координаты точек? Там даже не передаются размеры изображения. Где находится начало координат? Вот скрин как получилось :
  11. void printmat(CvMat &mat) { int i,j; for (i=0; i<mat.rows; i++) { for (j=0; j<mat.cols; j++) { printf("%.3f ",cvmGet(&mat,i,j)); } printf("\n"); } } int main( int argc, char** argv ) { int n=8; double pts1[]={126,120, 331,116, 153,217, 192,236, 69,245, 301,216, 215,273, 270,280}; double pts2[]={337,61, 394,78, 264,155, 502,174, 336,158, 311,184, 195,212, 408,240}; CvMat points_a=cvMat(n, 2, CV_32F,pts1); CvMat points_b=cvMat(n, 2, CV_32F,pts2); for (int i=0; i<8; i++) { cvmSet(&points_a,i,0,pts1[i*2]); cvmSet(&points_a,i,1,pts1[i*2+1]); } for (int i=0; i<8; i++) { cvmSet(&points_b,i,0,pts2[i*2]); cvmSet(&points_b,i,1,pts2[i*2+1]); } vector<uchar> status; double pixel_tolerance = 3; double confidence = 0.96; double mt[]={0,0,0, 0,0,0, 0,0,0}; CvMat fund_mat=cvMat(3, 3, CV_32F,mt); int out = cvFindFundamentalMat(&points_a, &points_b, &fund_mat, CV_FM_RANSAC,pixel_tolerance, confidence); double lines_[]={0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0, 0,0,0}; CvMat lines1=cvMat(n, 3, CV_32F,lines_); CvMat lines2=cvMat(n, 3, CV_32F,lines_); cvComputeCorrespondEpilines(&points_a,1,&fund_mat,&lines1); cvComputeCorrespondEpilines(&points_b,2,&fund_mat,&lines2); printf("\nlines1:\n"); printmat(lines1); printf("\nlines2:\n"); printmat(lines2); getch(); return 0; } После выполнения кода fund_mat выглядит так: 0.000 0.000 -0.002 -0.000 0.000 0.007 0.001 -0.010 1.000 lines1: 0.042 -0.999 114.858 0.017 -1.000 127.623 -0.238 -0.971 253.277 -0.292 -0.956 278.934 -0.242 -0.970 255.143 -0.332 -0.943 297.160 -0.417 -0.909 335.667 -0.551 -0.835 393.708 lines2: 0.042 -0.999 114.858 0.017 -1.000 127.623 -0.238 -0.971 253.277 -0.292 -0.956 278.934 -0.242 -0.970 255.143 -0.332 -0.943 297.160 -0.417 -0.909 335.667 -0.551 -0.835 393.708 Думаю это не правильно. Где я ошибся?
  12. Как мне вызвать cvFindFundamentalMat? Делаю вот так: int main( int argc, char** argv ) { int n=8; double pts1[]={0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0}; double pts2[]={0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0}; CvMat points_a=cvMat(n, 2, CV_32F,pts1); CvMat points_b=cvMat(n, 2, CV_32F,pts2); vector<uchar> status; double pixel_tolerance = 3; double confidence = 0.96; CvMat fund_mat=cvMat(3, 3, CV_32F); int out = cvFindFundamentalMat(&points_a, &points_b, &fund_mat, CV_FM_RANSAC,pixel_tolerance, confidence); // Здесь происходит ошибка. return 0; } Заускается и появляется ошибка: OpenCV Error: Internal error (Assertion: CV_IS_MAT(fmatrix) && fmatrix->cols == 3 && (fmatrix->rows == 3 || (fmatrix->rows == 9 && method == CV_FM_7POINT)) fail ed) in cvFindFundamentalMat, file ..\..\..\OpenCV\src\cv\cvfundam.cpp, line 600 Проблема решена)) Надо было написать так: double elements[]={0,0,0, 0,0,0, 0,0,0}; CvMat fund_mat=cvMat(3, 3, CV_32F,elements);
  13. А что такое матрицы гомографии? Как можно их использовать? Я не пойму одного. Если у нас есть эпиполярные линии, значит известны координаты камер? По-моему если не известны расположения камер, эпиполярные линии нельзя найти.
  14. Не могу разобраться. Почитал еще пару статей. На счет OpenCV пара вопросов: FindFundamentalMat - это возвращает фун. матрицу, но там даже не надо передавать размеры изображения. Там написано, что полученную матрицу можно использовать в двух функциях: 1) - cvComputeCorrespondEpilines(const CvMat* points, int whichImage, const CvMat* F, CvMat* lines) points - это 2D точки. whichImage - что это определяет? lines - это эпиполярные линии? 2) - StereoRectifyUncalibrated(points1,points2,F,imageSize, CvMat* H1, CvMat* H2, double threshold=5) Что такое H1,H2 (homography) ,threshold ?
  15. Прикольный клип))
  16. Только, что посмотрел этот сайт, перед тем как зайти сюда ))) Но так и не посмотрел клип.
  17. Весит эта прога 187 метров. Спасибо за ссылки. Про фундаментальную матрицу, я нашел статью и на русском)) Допустим я нашел эту матрицу через OpenCV, и что с ним делать дальше? Что из себя представляет эта матрица? Где-то говорилось что из этой матрицы можно взять положение и поворот камеры.
  18. Спасибо за труды и потраченное время! Я тут поискал, кароч нашел прогу, которая запросто решает данную проблему. Здесь статья как им пользоваться: http://www.render.ru/books/show_book.php?book_id=638 Я знаю, что это возможно, поэтому буду искать)). ЗЫ: Если что-то найду, первым делом напишу здесь. Если и вы что-то найдете, дайте знать кароч.
  19. Вот 2 изображения. До калибровки, просто проводятся лучи через точки на экранной плоскости. Потом находятся положения камер, при которых соответствующие лучи пересекаются. (Собственно в этом и задача) Началой системы координат может быть что угодно, например первая камера. Если точек >= 6, то можно найти 100% правильный результат. Это есть в статьях про "PnP problem" - Проблема PnP. Но там нет реализации, нашел только теорию.
  20. Допустим известно 7 точек на двух камерах. Проводим лучи для всех точек проходящие чарез экранную плоскость, теперь находим координаты и вращения камер так, чтобы соответствующие лучи пересекались. А их точками пересечения будут 3D координаты точек. Вроде как-то так))
  21. Да. Но это наверное не важно, т.к. Калибровка происходит в определенном кадре на двух изображениях. (Но можно и по нескольким кадрам). Это не важно. У меня есть соответствующие 2D координаты точек на всех изобр. То есть, напр. я знаю координаты точки на первом изображении, и координаты этой же точки на втором. Точки у меня не путаются.
  22. Спасибо за ответ! У меня есть только двумерные координаты точек. Я знаю, что по этим данным можно найти координаты камеры, после чего координаты точек в пространстве. Какая-то программа делала такие махинации, но я не помню названия программы. Если известны 2D координаты, то можно провести лучи от центра камеры проходящие через точки на экранной плоскости (для всех камер). Потом найти точки пересечения соответствующих лучей, это и будут 3D координаты точек. Но для всего этого нужно знать координаты, и направления камер. В этом и проблема. (( Напоминаю, что заранее информация о 3D сцене отсутсвует!
  23. Хорошо код писать не надо. В OpenCV есть функция cvCalibrateCamera и cvCalibrateCamera2. Я не до конца понял что они делают. Это же калибровка по точкам? Функция выглядит так: void cvCalibrateCamera( int numImages, int* numPoints, CvSize imageSize, CvPoint2D32f* imagePoints32f, CvPoint3D32f* objectPoints32f, CvVect32f distortion32f, CvMatr32f cameraMatrix32f, CvVect32f transVects32f, CvMatr32f rotMatrs32f, int useIntrinsicGuess ); numImages - количество изображений = кол-во камер numPoints - Array of the number of points in each image. (Количество точек для каждого изображения) imageSize - Size of the image. (Размер изображения (ширина/высота)) imagePoints32f - Pointer to the images. (Это не совсем понятно, CvPoint2D32f* - массив координат точек?) objectPoints32f - Pointer to the pattern. (Здесь тоже не понятно, Это CvPoint3D32f, у меня нет трехмерных координат точек! Или функция сама возвратит мне эти данные?) distortion32f - Array of four distortion coefficients found. (Массив четырех коэффициентов искажения, где мне его взять?) cameraMatrix32f - Camera matrix found. (Матрица камеры, это мне не известно) transVects32f - Array of translate vectors for each pattern position in the image. (Как найти?) rotMatrs32f - Array of the rotation matrix for each pattern position in the image. (Как найти?) useIntrinsicGuess - Intrinsic guess. If equal to 1, intrinsic guess is needed. (Как найти?) Наверное я где-то ошибся, т.к. переводил через translate.google.ru Если я првильно понял это и есть функция для калибровки без шахматной доски? Если да, скажите пжлста, как найти эти неизвестные параметры?
  24. Доброго времени суток. Нужно откалибровать 2 (или более) камеры не по доске. Я долго искал в интернете, скачал очень много книг, большинство на Англ. Нашел только калибровку по шахматной доске. У меня есть 2D координаты точек на двух камерах, допусти 5 точек. Надо найти положение 1-й камеры относительно 2-й, и положение точек в 3D пространстве. Изначальна у меня нет информации вращения и положения камер. Напишите пжлста код функции, как это реализовать. Заранее благодарен.
×