fotomer
-
Количество публикаций
98 -
Зарегистрирован
-
Посещение
-
Days Won
14
Сообщения, опубликованные пользователем fotomer
-
-
26 минут назад, Vitalii сказал:Благодарю!
Пробовал. Получаются разные результаты.
Значения матрицы M1, полученные в Matlab:
M1 = 7986.2559620260, 0.0000000000, 524.7794558939, 0.0000000000, 7603.3099586941, 765.6466654278, 0.0000000000, 0.0000000000, 1.0000000000);
M1 = 3.4296806178638740e+03, 0., 1.2727552031201496e+03, 0., 3.3866798437426000e+03, 6.9065925391676274e+02, 0., 0., 1.
Фокусные расстояния, полученные в OpenCV в 2,3 раза меньше, чем в Matlab.
Вообще именно фокус никогда точно не угадывается, его я на контрольном отрезке точно выставлял. Если интересно в свое время писал программку http://xn--e1anfamim.xn--p1ai/index.php/novosti/iphotomeasure
здесь процесс калибровки http://xn--e1anfamim.xn--p1ai/index.php/novosti/kalibrovka-kamery
Только снимки должны быть пестрые и не однообразные, шахматные доски не подходят. Даже дешевые смартфоны потом точно измеряют
- 1
-
Вы хотите по 2 снимкам с такой малой базой получить премлимую 3-d карту местности? Ничего не получится, возьмите какой-нибудь софт типа Agisoft или 3DF Zephyr Free (он бесплатен) и поэксперементируте там. Кстати 3DF Zephyr Free может делать калибровку по набору произвольных фоток (штук 30) и по опыту лучше чем с шахматной доской.
Если просто нужно измерять расстояния можно использовать Aruco с 4 точками, которое выдаст координаты и направление камер. Еще Aruco нельзя в лоб снимать, точно резко падает, нужно чтоб квадрат на снимках был типа трапеции
- 1
- 1
-
Я в свое время тоже в этой математике разбирался, потом понял что проще найти готовое решение и в нем разобраться, типа такого https://www.opensfm.org/
Летал на дроне и вполне хорошие модели получались http://фотомер.рф/index.php/novosti
-
Еще можно попробовать антибликовый спрей, он реально улучшает картину.
-
А что вы собираетесь делать с полученной cv::Мат картинкой? Многие алгоритмы вообще онлайн не работают на обычном железе.
-
Собрал 4.0.1 с флагом WITH_OPENM , теперь все нормально, ошибок нет.
-
15 часов назад, Nuzhny сказал:Только что скачал свежую версию, скомпилировал с WITH_OPENMP и твой пример отработал без ошибок. Возможно, оно проявляется только у тебя или нужна именно твоя картинка.
Не, с любой картинкой, и падает только с CORNER_REFINE_APRILTAG, остальные работают.
Еще cvtColor без помарок работает? А то с флагом WITH_OPENM в консоль это пишется "User Error 1001: argument to num_threads clause must be positive". Как понимаю где-то внутри указывается отрицательное кол-во потоков. Компилятор Visual Studio 2015 x64.
Mat mat, mat2; mat = imread("1.jpg"); cvtColor(mat, mat2, COLOR_BGR2GRAY);
Upd Сейчас собрал на чистой Win7 с компилятором VS 2014, результат тот же.
Upd2 Пересобрал отдельно либу opencv_core сняв для него использование openmp, остальные не трогал. И теперь все нормально работает. O как.
-
В 14.12.2018 at 13:28, Nuzhny сказал:А пример можешь выслать? Я тоже использую openmp, но она в Windows не развивается (поддерживает стандарт 2.0 при существующем 5.0). Поэтому разработчики OpenCV традиционно делают упор на TBB.
int main() { try { float kd[5] = { 0.106, 0, 0, 0, 0 }; float cm[9] = { 5765, 0.0000000000000000e+00, 2592, 0.0000000000000000e+00, 5765, 1728, 0.0000000000000000e+00, 0.0000000000000000e+00, 1.0000000000000000e+00 }; Mat cameraMatrix(3, 3, CV_32F, cm); Mat distK(1, 5, CV_32F, kd); Mat mat; mat = imread("1.jpg"); Ptr<aruco::Dictionary> dictionary{ aruco::getPredefinedDictionary(aruco::DICT_4X4_1000) }; Ptr< aruco::DetectorParameters > detectorParams{ aruco::DetectorParameters::create() }; detectorParams->cornerRefinementMethod = aruco::CORNER_REFINE_SUBPIX; //detectorParams->cornerRefinementMethod = aruco::CORNER_REFINE_APRILTAG; vector<vector<Point2f> > corners1, rejectedCorners1; vector<int> ids1; aruco::detectMarkers(mat, dictionary, corners1, ids1, detectorParams, rejectedCorners1, cameraMatrix, distK); } catch (cv::Exception ex) { cout << ex.what() << endl; } return 0; }
Вот простенький код. OpenCV 4.0.0. собранный без флага WITH_OPENMP - все работает, углы aruco корректно определяются. Сборка с флагом WITH_OPENMP, флаг в коде aruco::CORNER_REFINE_SUBPIX работает, но в консольку пишется "User Error 1001: argument to num_threads clause must be positive", это внутри aruco::detectMarkers прилетает из функции _convertToGrey. А с флагом aruco::CORNER_REFINE_APRILTAG выкидывается исключение "OpenCV(4.0.0) c:\opencv\opencv_contrib-master\modules\aruco\src\zarray.hpp:109: error: (-215:Assertion failed) idx >= 0 in function 'cv::aruco::_zarray_get'"
На версиях 3.х с WITH_OPENMP все работало нормально.
-
14 минуты назад, Nuzhny сказал:Хм. Это не так просто повторить. можешь подсказать с каким-нибудь стандартным примером из поставки? Какие параметра подавать в тот же example_aruco_detect_markers, например.
Я просто удалил сборку 4.0 с openmp, на SDD мало места. Потом тогда опять соберу и попробую ошибку воспроизвести.
-
30 минут назад, Nuzhny сказал:А пример можешь выслать? Я тоже использую openmp, но она в Windows не развивается (поддерживает стандарт 2.0 при существующем 5.0).
Эта функция aruco::detectMarkers с флагом aruco::CORNER_REFINE_APRILTAG. На 3.4.1 все работало с WITH_OPENMP, собрал 4.0 с WITH_OPENMP, падает. Без все работает.
-
В 16.05.2018 at 15:51, Nuzhny сказал:На счёт protobuf ответ простой - всё меняется, оазвивается opencv_dnn, которая его и требует (ещё из contrib).
Не в курсе, про 4.0 написано Our parallel_for can now use the pool of std::threads as the backend. Я собрал традиционно с флагом WITH_OPENMP, как и на предыдущих 3.х. И далее с 4.0 распознавалка Aruco падает где-то внутри либы на потоках. Если собрать без этого флага, то все работает нормально.
В 15.05.2018 at 23:37, Tlya сказал:Народ подскажите, с чем это может быть связано?
Судя по картинке Винда, как писали, там с Cmake-Gui все отлично собирается.
-
3 часа назад, DenisN03 сказал:Что скажете по поводу этой(https://market.yandex.ru/product/8279754?nid=55350) камеры? Угол обзора объектива 120 градусов + наличие HD.
Это же обычная дешевая вебка, широкий угол из-за искажений не есть хорошо для 3D реконструкции.
-
17 минут назад, Nuzhny сказал:Если недорогие, то можно у Hikvision найти ip-камеры, которые умеют смотреть на 90 градусов. Только я слабо представляю полезность такого подхода.
IP все жмут не по детски, и на максимальных настройках тоже.
5 часов назад, DenisN03 сказал:Попробовать дорогую вебку типа http://www.pleer.ru/product_418896_Logitech_Webcam_Brio_960_001106.html
Или поискать на Али камеру с ключевым словом Global Shutter. https://www.aliexpress.com/popular/camera-global-shutter.html
-
Вебки шумят и разрешение не особое. Вот хороший вариант, правда дорогой https://www.baslerweb.com/ru/
Еще у бастлера глобальный затвор, все jpg из видео будут без смазов.
- 1
-
А что за девайс на картинке?
-
9 минут назад, Nuzhny сказал:Если будет что-то интересное в плане результата, то я с удовольствием бы посмотрел. У самого из-за загруженности не хватает времени интегрировать это в проект трекинга.
OK. Еще буду пробовать фотограмметрию притянуть, предполагая что человек идет параллельно полу.
-
11 час назад, Nuzhny сказал:Я так понимаю, что сначала тебе надо все детекции людей на разных камерах перевести в единую для них систему координат относительно магазина. А потом применить что-то типа такого dctracking. Там есть и статьи, и видео, и код на Матлабе.
Спасибо, посмотрю.
-
В магазине есть несколько одиночных камер, их взаимное расположение известно, зона видимости перекрывается. В магазин входит несколько или больше человек, и нужно произвести трекинг отдельных людей по магазину. Распознавание лиц не подходит т.к. человек в камере может быть боком, спиной или сразу несколько человек в разных вариациях. Где-то в зарубежных статьях проскакивало про EM-алгоритм кластеризации для трекинга людей в толпе, но без какой-либо конкретики. Выделять сеткой голову и плечи вне зависимости от ракурса получается, но как применять к ним ЕМ-алгоритм не совсем понятно. Может у кого есть какие идеи?
-
-
2 часа назад, mrgloom сказал:т.е. affine transform правильный не совпадает только по масштабу?
В openMVG_main_geodesy_registration_to_gps_position я сразу запрограммировал на разворот в соответствии с Север-Югом, я брал самую западную GPS точку съемки и самую восточную, рассчитывал угол линии между ними и на этот же угол доворачивал SFM модель
2 постами выше ортофото и ссылка на Яндекс-карты, там видно что развернуто верно. Т.е. в моем случае нужен только масштаб.
Верность geoTiff проверяю в gdalinfo и в QGIS, в последней сразу видно изменение координат под курсором. Но до конца у меня пока не получилось, координаты косячные в QGIS. Ну и определением UTM зоны остается вопрос, поиском ничего пока не нашел. Я на гео-форуме темку создал, но геологи ничего толкового не сказали ))) http://gis-lab.info/forum/viewtopic.php?t=23007
2 часа назад, mrgloom сказал:У GDAL есть бинарники gdal-bin и еще python-gdal хотя там помоему другой функционал или частично пересечкающийся, на С/C++ наверно API пошире.
Потом через API буду пробовать XYZ сетку подсовывать чтоб карта высот получилась.
Update
WidthResolution = MapWidth/pixelWidth; HeightResolution = MapHeight/pixelHeight; double adfGeoTransform[6] = { TopLeftX2, WidthResolution2, 0, TopLeftY2, 0, -HeightResolution };
Вот так работает, QGIS расстояния правильно измеряет, совпадает с Яндекс-картами. MapWidth, MapHeight в метрах.
-
Вот примерный код tiff -> geoTiff . Единственно не понятно как определить UTM зону и как размер ортофото на местности допустим 200х200м добавить к UTM. Сам UTM в метрах, но там есть какой-то масштабный коэффициент 0.9996.
string pszFilename("Scene_dense_mesh_texture_orthomap.tif"); GDALDataset *poSrcDS; GDALAllRegister(); poSrcDS = (GDALDataset *)GDALOpen(pszFilename.c_str(), GA_ReadOnly); ..... double adfGeoTransform[6] = { TopLeftX, WidthResolution, 0, TopLeftY, 0, HeightResolution }; const char *pszFormat = "GTiff"; GDALDriver *poDriver; GDALDataset *dstDataset; GDALAllRegister(); poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat); dstDataset = poDriver->CreateCopy("Scene_dense_mesh_texture_orthomap_gdal2.tif", poSrcDS, false, NULL, NULL, NULL); OGRSpatialReference geographicRef; geographicRef.SetWellKnownGeogCS("WGS84"); // standard WGS84 coordinate system geographicRef.SetUTM( 37, TRUE ); char *pszDstWkt; geographicRef.exportToWkt(&pszDstWkt); dstDataset->SetProjection(pszDstWkt); cout << pszDstWkt; GDALSetGeoTransform(dstDataset, adfGeoTransform); if (dstDataset != NULL) GDALClose((GDALDatasetH)dstDataset); if (poSrcDS != NULL) GDALClose((GDALDatasetH)dstDataset);
-
Я OpenDroneMap не собирал, т.к. на Винде пишу. А будет ортофото без gps инфы делать сложно сказать, т.к. точки GPS дают плоскость в пространстве от которой можно плясать. Я ортофото сам закодил, вначале ищу gps точки с равной высотой, потом эти же точки, но полученные через SFM, апроксимирую плоскостью, потом нахожу матрицу вращения которая развернет эту плоскость перпендикулярно оси Z, и после openMVS делает хорошее ортофото, также рассчитываю GPS координаты углов картинки. По идее картинку с координатами углов нужно всунуть в GDAL и получить geoTiff. Но как это сделать конкретно я до сих пор не асилил, в GDAL столько параметров и координат что черт ногу сломит.
Такое ортофото пирамиды из первого поста в этой теме, Яндекс-карта https://yandex.ru/maps/?ll=37.066042%2C55.783674&z=17&l=sat%2Cskl
-
2 часа назад, mrgloom сказал:В Photoscan кстати есть генерация DEM / Orthophoto from Dense cloud, не знаю как по поводу качества, но по памяти это должно быть экономнее чем из меша.
По качеству будет явно хуже. Чуть выше кривоватое ортофото произв.базы 30000х25000 точек, при увеличении можно надпись на капоте легковушки рассмотреть, в плотном облаке эта надпись непонятное пятнышко. Интересно что Pix4D все надписи сильно мажет в отличие от MVS.
Еще интересно посмотреть как реализован алгоритм ортофото, там ведь кривизну Земли надо учитывать.
-
Продолжаю копаться в ортофото. В openMVG пересчет координат из локальных в глобальные делается просто, берутся центры снимков локальные и глобальные из EXIF и передаются в Eigen::umeyama. Функция высчитывает R, T и S между подобными облаками точек. Пробовал на нескольких полетах, но точного вида сверху ни разу не вышло. Придется вручную считать нормаль, что-то типа перепендикулярная плоскость к высотам gps точек съемки.
Камеры Basler
в OpenCV
Опубликовано · Report reply
Кто-нибудь Basler или аналогами в последнее время закупался? Если да, то можно ссылку.