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

fotomer

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

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

  • Посещение

  • Days Won

    14

Сообщения, опубликованные пользователем fotomer


  1. 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

    Только снимки должны быть пестрые и не однообразные, шахматные доски не подходят. Даже дешевые смартфоны потом точно измеряют

    • Thanks 1

  2. Вы хотите по 2 снимкам с такой малой базой получить премлимую 3-d карту местности? Ничего не получится, возьмите какой-нибудь  софт типа Agisoft или 3DF Zephyr Free (он бесплатен) и поэксперементируте там. Кстати 3DF Zephyr Free может делать калибровку по набору произвольных фоток (штук 30) и по опыту лучше чем с шахматной доской.

    Если просто нужно измерять расстояния можно использовать Aruco с 4 точками, которое выдаст координаты и направление камер. Еще Aruco нельзя в лоб снимать, точно резко падает, нужно чтоб квадрат на снимках был типа трапеции

    • Like 1
    • Thanks 1

  3. 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 как.


  4. В 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 все работало нормально.


  5. 14 минуты назад, Nuzhny сказал:

    Хм. Это не так просто повторить. можешь подсказать с каким-нибудь стандартным примером из поставки? Какие параметра подавать в тот же example_aruco_detect_markers, например.

    Я просто удалил сборку 4.0 с openmp, на SDD мало места. Потом тогда опять соберу и попробую ошибку воспроизвести.


  6. 30 минут назад, Nuzhny сказал:

    А пример можешь выслать? Я тоже использую openmp, но она в Windows не развивается (поддерживает стандарт 2.0 при существующем 5.0).

    Эта функция aruco::detectMarkers с флагом  aruco::CORNER_REFINE_APRILTAG. На 3.4.1 все работало с WITH_OPENMP, собрал 4.0 с WITH_OPENMP, падает. Без все работает.


  7. В 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 все отлично собирается.


  8. 3 часа назад, DenisN03 сказал:

    Что скажете по поводу этой(https://market.yandex.ru/product/8279754?nid=55350) камеры? Угол обзора объектива 120 градусов + наличие HD.

    Это же обычная дешевая вебка, широкий угол из-за искажений не есть хорошо для 3D реконструкции.


  9. 17 минут назад, Nuzhny сказал:

    Если недорогие, то можно у Hikvision найти ip-камеры, которые умеют смотреть на 90 градусов. Только я слабо представляю полезность такого подхода.

    IP все жмут не по детски, и на максимальных настройках тоже.

    5 часов назад, DenisN03 сказал:

    @iskees, @fotomer а кроме этой фирмы какие еще можете посоветовать?

    Попробовать дорогую вебку типа http://www.pleer.ru/product_418896_Logitech_Webcam_Brio_960_001106.html

    Или поискать на Али камеру с ключевым словом Global Shutter. https://www.aliexpress.com/popular/camera-global-shutter.html


  10. 9 минут назад, Nuzhny сказал:

    Если будет что-то интересное в плане результата, то я с удовольствием бы посмотрел. У самого из-за загруженности не хватает времени интегрировать это в проект трекинга.

    OK. Еще буду пробовать фотограмметрию притянуть, предполагая что человек идет параллельно полу.


  11. 11 час назад, Nuzhny сказал:

    Я так понимаю, что сначала тебе надо все детекции людей на разных камерах перевести в единую для них систему координат относительно  магазина. А потом применить что-то типа такого dctracking. Там есть и статьи, и видео, и код на Матлабе.

    Спасибо, посмотрю.


  12. В магазине есть несколько одиночных камер, их взаимное расположение известно, зона видимости перекрывается. В магазин входит несколько или больше человек, и нужно произвести трекинг отдельных людей по магазину. Распознавание лиц не подходит т.к. человек в камере может быть боком, спиной или сразу несколько человек в разных вариациях. Где-то в зарубежных статьях проскакивало про EM-алгоритм кластеризации для трекинга людей в толпе, но без какой-либо конкретики. Выделять сеткой голову и плечи вне зависимости от ракурса получается, но как применять к ним ЕМ-алгоритм не совсем понятно. Может у кого есть какие идеи?


  13. Вот примерный вид картинок geoTiff, скриншоты из QGIS, карта OSM standart, видно что привязанные картинки совпадают с рельефом местности, на первой картинке дорожки, на второй линия забора и граница участка, на третьей река.

    Snap2b.thumb.jpg.5e057f5ace92890c8ceddcb11e4c6f04.jpg

     

     

    Snap3b.jpg

    Snap4b.jpg

    • Like 1

  14. 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 в метрах.


  15. Вот примерный код 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);

     


  16. Я 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

    40278c00dec8.jpg


  17. 2 часа назад, mrgloom сказал:

    В Photoscan кстати есть генерация DEM / Orthophoto from Dense cloud, не знаю как  по поводу качества, но по памяти это должно быть экономнее чем из меша.

    http://www.agisoft.com/forum/index.php?topic=5357.0

    По качеству будет явно хуже. Чуть выше кривоватое ортофото произв.базы 30000х25000 точек, при увеличении можно надпись на капоте легковушки рассмотреть, в плотном облаке эта надпись непонятное пятнышко. Интересно что Pix4D все надписи сильно мажет в отличие от MVS.

    Еще интересно посмотреть как реализован алгоритм ортофото, там ведь кривизну Земли надо учитывать.


  18. Продолжаю копаться в ортофото. В openMVG пересчет координат из локальных в глобальные делается просто, берутся центры снимков локальные и глобальные из EXIF и передаются в Eigen::umeyama. Функция высчитывает R, T и S между подобными облаками точек. Пробовал на нескольких полетах, но точного вида сверху ни разу не вышло. Придется вручную считать нормаль, что-то типа перепендикулярная плоскость к высотам gps точек съемки.

    
    
     
×