Jump to content
Compvision.ru

All Activity

This stream auto-updates     

  1. Last week
  2. Earlier
  3. Один раз решив PnP, имеем матрицу поворота / переноса. Если добавленное смещение мало, можно взять любой треугольник и его проекцию, и по ним вычислить новый базис. И можно не городить огород )
  4. Дело в том, что сначала solvePnP вычисляю положение на кадре с камеры без изменений. При дальнейшей работе кадр уже подвергается трансформации что бы "выровнять" кадр относительно объекта - для удобства пользователя. И пользователь уже на трансформированном кадре задаёт интересующие точки. Так вот, что бы дальнейшие расчёты работали правильно приходится эти точки сначала трансформировать с инвертированной матрицей трансформации, потом обработать, а потом снова трансформировать обратно для вывода. Хочу избежать этих лишних трансформаций, и работать с rVec и tVec как будто они получены были уже с кадра со всеми трансформациями. Возможности сразу вычислить solvePnP на кадре со всеми трансформациями нет, т.к. они могут добавиться позже и вообще поменяться.
  5. Проверил несколько камер, и действительно оказалось, что поведение при изменении разрешения достаточно сильно отличается. Особо не углублялся как именно обрабатывают зум каждая, но получилось, что матрицы при разных разрешениях сильнее отличаются, нежели просто пропорцией.
  6. И вновь здравствуйте! Подскажите, пожалуйста, можно ли и как именно применить матрицу, полученную после findHomography к rVec и tVec, которые получены после solvePnP ?
  7. Здравствуйте, в стандартном комплекте есть пример 3D калибровки, у меня это f:\Documents\opencv\samples\cpp\3calibration.cpp По поводе положения доски, нужно сделать снимки под разными углами к плоскости камеры. Фотки для примера (тоже из стандартного набора) 0.ZIP
  8. Убрать шумы с изображения

    Как варианты: 1. Найти 2д ключевые точки, и TPS сплайном выровнять по ним кадры, усреднить, дальше как обычно. 2. Найти 3д модель руки, содрать текстуру, дальше как обычно. Ссылки по теме: https://github.com/xinghaochen/awesome-hand-pose-estimation
  9. Тут, скорее всего подойдет тот же метод, что и при анализе отпечатков пальцев. Только предварительная обработка будет отличаться, хотя, может быть через банк фильтров Габора пропустить и не помешает. Для начала бинаризация, затем поиск скелета, поиск точек ветвления, трассировкой по скелету, можно определить веса ребер графа. Много методов бинаризации здесь: DOXA Получить скелет можно при помощи: https://github.com/LingDong-/skeleton-tracing или мой пост здесь: Skeleton Кстати, при помощи скелета силуэта руки можно делать выравнивание. Ну и можно посмотреть в сторону алгоритма A*, для восстановления связности графа.
  10. Убрать шумы с изображения

    Ищи контуры и закрашивай те, площадь которых меньше некоторого порога
  11. Добрый день, в общем то рисунок тот же, что и в соседней теме, но уже иная задача Планируется идентифицировать пользователя по рисунку вен его руки Для этого, по логике вещей, требуется составить полный шаблон венозной структуры Но рисунок на потоке непостоянный, основные вены, да, постоянны, но есть тонкие, и их отражение то появляется, то убыывает В связи с этим вопрос Как можно составить шаблон, в который будут входить вены? По сути, нужно взять несколько изображений и наложить друг на друга, удаляя сегменты, которые встречаются единожды Но вопрос, как это сделать, если рука не зафиксирована в одной точке? Прикрепляю два изображения однйо руки
  12. Добрый день Видеопоток обрабатывается в реальном времени и путем манипуляций получается следующее изображение Каким способом можно убрать точки, которые, по сути своей, являются шумом Основные линии в процессе работы остаются, а точки просто рандомизируются повсюду Erode/Dilate уже используется, ровно как и размытие изображения
  13. Друзья, доброго дня! Хочу найти дистанцию до объекта и его местонахождение. В первую очередь всё таки дистанцию. У меня есть жестко закрепленные 2 камеры, шахматная доска (7 на 6, и размер квадрата 10см). В течении нескольких дней я пробовала выполнить калибровку стерео следующими действиями - снимала кадры(50 изображений на каждую камеру), потом каждую камеру отдельно калибровала и на имеющихся данных с каждой камеры калибровала стерео(для калибровки стандартные методы OpenCV). Далее используя параметры стереокалибровки пыталась рассчитать дистанцию, однако данные по расчету дистанции каждый раз были неверными. Можете направить на путь истинный? Чувствую, что где-то всё-таки делаю неверно. Также интересуют следующее: 1. Всё-таки в каком порядке лучше всего выполнять калибровку, как далеко шахматка должна находиться и в каких позициях? (я снимала примерно на 1.5 метрах, шахматка в основном была в одной позиции). "RMS" показывает значения больше 2.3 2. Влияет ли разрешение изображения? У меня на вход подается изображения 1280х1024, дальше и в процессе поиска шахматки и во время калибровки при помощи cv::resize я уменьшаю изображение в 3 раза. Если "RMS" с разрешением 1280x1024 показывает 2.3, то после cv::resize становится 0.14 Свои файлы прикрепила. Заранее благодарю за ответы. calibrate_one_cam.cpp calibrate_stereo.cpp depth.cpp
  14. 7 Изменить размер гораздопроще чем Вы думаете. Чип сенсора как стоял в плоскости физического фокуса так и стоит. Просто отключаются не используются пиксели с края сенсора. Это сделать просто изменив приделы счётчика который перебирает пиксели камеры во время чтения. Когда как масштабирование требует заблюрить соседние пиксели и произвести децимацию оставив к примеру через один каждый второй пиксель. Вот только обычно масштабирование идёт не кратно 2 а через дробные значения к 3/2. Что требует уже усложнения чипов камеры. Так вот при изменении используемой области камеры меняется угол обзора. В математической модели это приводит к изменению математического фокуса. Известно что бочкообразые и подушкообразные искажения определяются параметрами линзы k1, k3 (внутренние параметры камеры) а они в свою очередь зависят от математического фокуса камеры, то они тоже уплывут.
  15. Интересно, я имел ввиду чисто цифровое масштабирование драйвером камеры. Ведь мы используем одну и ту же камеру. Как меняется размер сенсора? Ну я могу представить, что можно извратиться, и сфокусировать его на меньший участок сенсора, тогда да, но не думал что так делают ...
  16. А вот ничего подобного. Там два случая. Изменени плотности и изменение размера матрицы. Как правило задействуется последний что вносит геометрические искажения. В зависимости от формы линзы(рыбий глаз) мы ещё и зум можем поиметь(полу цифровой зум)
  17. Спасибо. Да, нужно менять ещё cx и cy, я думал достаточно только fx fy.
  18. Ну, оптика тут остается та же, меняется только плотность пикселей, поэтому думается достаточно будет поменять fx, fy, cx, cy. Дальше все как с исходной матрицей.
  19. Здравствуйте. Допустим, откалибровал камеру при разрешении 1280х1024, получил матрицу внутренних параметров и коэффициенты. Теперь, вывожу видео в разрешении 800х600. Документацию https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html читал. Поэтому несколько вопросов: 1. Насколько я понял, нужно маштабировать только матрицу внутренних параметров, не трогать коэффициенты? 2. Как маштабировать? Достаточно ли просто сделать fx` = fx * (w`/w) и аналогично для fy, где w` - новая ширина кадра, а w - ширина кадра, когда создавалась матрица. 3. Как потом быть с getOptimalNewCameraMatrix ? Подставлять в неё уже отмаштабированную матрицу? Или оригинальную, а потом маштабировать обе?
  20. Разобрался >>> im.shape (204, 512, 512) >>> cropped= im[:,374:274, 406:309] >>> tifffile.imsave('1.tiff',cropped) >>> cropped= im[:,274:374, 309:406] >>> cropped.shape (204, 100, 97)
  21. Всем привет! Есть изображение, на нем отрисовываются фигуры. В данном примере прямоугольник. Как с помощью numpy вырезать выделенную область изображения? Координаты, по которым строится прямоугольник "all_x": [ 274, 374 ], "all_y": [ 309, 406
  22. Как раз лучше когда не в одной плоскости. По поводу PnP есть неплохой пример здесь: https://learnopencv.com/head-pose-estimation-using-opencv-and-dlib/ Для плоских объектов лучше использовать что то вроде: https://github.com/arthur1026/RobustPlanarPose Вот, как то делал что то такое: MarkerTracker.rar
  23. Предназначение getoptimalnewcameramatrix

    Как я понял из описания: Функция возвращает ROI с корректными пикселями в параметре validPixROI . Alpha -задает порог по используемым пикселям, допустим пиксели ценные (сильные угловые точки), то они пройдут высокий порог, а на однотонном гладком участке точки будут малоценными и будут давать большую погрешность при сопоставлении, их ценность близка к 0. Вот из alpha и отсечет в зависимости от значения.
  24. И снова здравствуйте. Поясните, пожалуйста, предназначение функции и где её использовать? getoptimalnewcameramatrix После прочтения документации по ссылке - как в анекдоте "дошло, но не понял". Что именно она делает, и чем эта матрица отличается от cameraMatrix, полученной из calibrateCamera ? Для каких вычислений она "оптимальная" ? Я правильно понимаю, что при обычной cameraMatrix после undistort из-за искажений, пиксели, которые не возможно "выправить" будут чёрными, а благодаря newCameraMatrix они всё же будут исправлены, но с большими ошибками? И её не стоит применять, если нужна точность вычислений, к примеру для solvePnP. Как можно получить через известную cameraMatrix прямоугольник cv::Rect, который бы соответствовал области, в которой ошибки будут минимальны?
  25. Приветствую! Нужно с точностью хотя бы в десятые градуса найти поворот объекта относительно оригинала на изображении. Что бы исключить влияние вешней среды все изображения для опытов создаю в Blender`е (разумеется рендер с одинаковыми настройками и положением камеры, размер кадра 1600х1200). Из него же взял и cameraMatrix. На всякий случай так же пробовал в нём же рендерить шаблон шахматной доски под разными ракурсами, потом cameraCalibrate для получения cameraMatrix и distortionCoefficient в общем всё как по примерам OpenCV. Проверял perViewErrors - для каждого изображения доски в пределах 0.1-0.2 пикселя. Для начала рендерю изображение просто квадрата, который будет использоваться как оригинальный, под неким углом наклона камеры, в OpenCV нахожу положение 4 углов на изображении - imagePoints. Знаю, размер стороны квадрата и задаю координаты 3D точек, к примеру: std::vector<cv::Point3d> objectPoints; objectPoints.push_back(cv::Point3d(0.0f, 0.0f, 0.0f)); objectPoints.push_back(cv::Point3d(50.0f, 0.0f, 0.0f)); objectPoints.push_back(cv::Point3d(50.0f, 50.0f, 0.0f)); objectPoints.push_back(cv::Point3d(0.0f, 50.0f, 0.0f)); Дальше загоняю это в solvePnP: cv::solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs, rvec, tvec, false, cv::SOLVEPNP_ITERATIVE); Я правильно понимаю, что при расчёте все методы solvePnP исходят из того, что все 4 точки objectPoints то же должны оказаться лежащими на одной 3D плоскости? Я пытался вникнуть хотя бы в метод ITERATIVE, но трудновато. Получаю rvec, tvec. Пробовал разные методы (более лучший результат даёт AP3P). Теперь, я так понимаю, если применить rvec (точнее, получить матрицу трансформации из вектора сначала) и tvec к objectPoints я получу их 3D положение в системе координат камеры? А как быть, в случае, если точки imagePoints вычисляются с какими-либо погрешностями? К примеру, в 2-5 пикселей? Имею ввиду, что можно предпринять, что бы скорректировать результаты solvePnP до более правильных? Может увеличить количество точек до 5-6 ? Пробовал solve RANSAC, результат то же неоднозначный, но, возможно, нужно ещё больше точек? Может быть в сами координаты точек на изображение заложить какую-либо информацию? Имею ввиду, к примеру, угол между ними должен быть 90 градусов, либо расстояния определённые... В общем, ищется способ повышения точности rvec (в особенности) и tvec, когда уже невозможно точнее вычислить положение imagePoints. Либо какая-либо отдельная библиотека для solvePnP, что бы можно было задать дополнительные ограничения, из разряда - угол между 3D точками на плоскости после применения rvec и tvec должны быть 90 градусов и т.д.
  1. Load more activity
×