Jump to content
Compvision.ru

Leaderboard

  1. Smorodov

    Smorodov

    Главные администраторы


    • Points

      22

    • Content count

      3,817


  2. Nuzhny

    Nuzhny

    Пользователи


    • Points

      7

    • Content count

      1,411


  3. fotomer

    fotomer

    Пользователи


    • Points

      3

    • Content count

      97


  4. Pavia00

    Pavia00

    Пользователи


    • Points

      2

    • Content count

      104



Popular Content

Showing most liked content since 10/30/2019 in all areas

  1. 2 points
    Ну сетка это слишком жестко ) Под видео ссылка на гитхаб.
  2. 2 points
    Вы хотите по 2 снимкам с такой малой базой получить премлимую 3-d карту местности? Ничего не получится, возьмите какой-нибудь софт типа Agisoft или 3DF Zephyr Free (он бесплатен) и поэксперементируте там. Кстати 3DF Zephyr Free может делать калибровку по набору произвольных фоток (штук 30) и по опыту лучше чем с шахматной доской. Если просто нужно измерять расстояния можно использовать Aruco с 4 точками, которое выдаст координаты и направление камер. Еще Aruco нельзя в лоб снимать, точно резко падает, нужно чтоб квадрат на снимках был типа трапеции
  3. 2 points
    Наткнулся на большой склад интересных алгоритмов с кодом: https://paperswithcode.com/area/computer-vision
  4. 1 point
  5. 1 point
  6. 1 point
    Поздно но наткнулся на пакет для решения подобных задач: https://github.com/cruxopen/openISP
  7. 1 point
    Выставил в SingleBlock и все корректно распозналось
  8. 1 point
    Может там фильтр по минимальной площади текста стоит, попробуйте увеличить размер изображения, или посмотрите параметры тессеракта, помнится таи их огромная куча была. Вот, кстати: https://www.sk-spell.sk.cx/tesseract-ocr-parameters-in-302-version
  9. 1 point
    Нейронку натренировать и все дела. На джитхабе куча примеров https://github.com/beacandler/R2CNN https://github.com/yuxng/PoseCNN https://github.com/runa91/FRCNN_git https://arxiv.org/pdf/1711.09405.pdf
  10. 1 point
    В OpenCv ecть встроенные детекторы текста, гляньте здесь: https://www.pyimagesearch.com/2018/08/20/opencv-text-detection-east-text-detector/
  11. 1 point
    Прислушайтесь к тому, что советует Nuzhny, начните с tesseract-ocr, есть даже бинды под шарп https://github.com/charlesw/tesseract например. Пример применения : https://github.com/charlesw/tesseract-samples Но если есть много энергии и желание повозиться, пишите, посоветуем по шагам, но это длинный путь )
  12. 1 point
    Предлагаю начать либо с голого tesseract-ocr, либо с примеров из opencv_text. А потом по результатам.
  13. 1 point
    Готовых решений не знаю, но можно попробовать слепое разделение источников (blind source separation). Снимаете 2 кадра A и B. делаете из них 3 смеси в разных пропорциях. I1=k1*A+(1-k1)*B I2=k2*A+(1-k2)*B I3=k3*A+(1-k3)*B На самом деле это будут смеси из 3 изображений A, B, и виньетки. Раскладываем на 3 источника, затем вычисляем коэффициенты искажения цвета. Что то типа этого:
  14. 1 point
    Так это, однослойное требует Проверьте shape загруженного изображения, если слоев 3, просто отцепите один, в сером они все одинаковые.
  15. 1 point
    Вообще именно фокус никогда точно не угадывается, его я на контрольном отрезке точно выставлял. Если интересно в свое время писал программку http://xn--e1anfamim.xn--p1ai/index.php/novosti/iphotomeasure здесь процесс калибровки http://xn--e1anfamim.xn--p1ai/index.php/novosti/kalibrovka-kamery Только снимки должны быть пестрые и не однообразные, шахматные доски не подходят. Даже дешевые смартфоны потом точно измеряют
  16. 1 point
    Да, disparity как то не сошлось. Видимо картинка не подходящая, квадратики гладкие и регулярные текстуры. Не то что любят алгоритмы стерео матчинга. Посмотрите примеры здесь: https://answers.opencv.org/question/117141/triangulate-3d-points-from-a-stereo-camera-and-chessboard/ может наведет на мысли. А почему калибруете через матлаб ? OpenCv - шная тулза не подходит ? Можно попробовать откалибровать opencv-шным и сравнить коэффициенты.
  17. 1 point
    Добрый день! Сейчас пытаюсь определить расстояние до калибровочной доски (расстояние примерно 1.6 метра, размер клетки 28 мм). Левая камера Правая камера Примерное расположение доски при калибровке. Расстояние рассчитано автоматически в Matlab Stereo Camera Calibrator App. Первый алгоритм #include <iostream> #include <vector> #include <stdint.h> #include <string> #include <fstream> #include "opencv2/calib3d/calib3d.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include "opencv2/core/utility.hpp" #include <opencv2/calib3d.hpp> #include "opencv2/ximgproc.hpp" #include <stdio.h> using namespace cv; using namespace cv::ximgproc; using namespace std; int main(int argc, char *argv[]) { cv::Mat Image_Left = cv::imread("left_3.png"); cv::Mat Image_Right = cv::imread("right_3.png"); cv::Mat M1 = (cv::Mat_<double>(3, 3) << 7986.2559620260, 0.0000000000, 524.7794558939, 0.0000000000, 7603.3099586941, 765.6466654278, 0.0000000000, 0.0000000000, 1.0000000000); cv::Mat D1 = (cv::Mat_<double>(1, 5) << -0.0626244338, -23.0384673454, 0.0000000000, 0.0000000000, 0.0000000000); cv::Mat M2 = (cv::Mat_<double>(3, 3) << 7789.0835738047, 0.0000000000, 2085.4988788672, 0.0000000000, 7523.3700278846, 271.1883527428, 0.0000000000, 0.0000000000, 1.0000000000); cv::Mat D2 = (cv::Mat_<double>(1, 5) << 0.2407018952, -7.8745465803, 0.0000000000, 0.0000000000, 0.0000000000); cv::Mat Q = (cv::Mat_<double>(4, 4) << 1, 0, 0, -2.8951307125091553e+03, 0, 1, 0, -5.0271924400329590e+02, 0, 0, 0, 7.5633399932893499e+03, 0, 0, 2.0857193103842788e+00, 0); cv::Rect RectLeft=cv::Rect(1080,890, 300,290); //Доска на левом фото cv::Rect RectRight=cv::Rect(880, 890,300,290); //Доска на правом фото cv::Point3f P3f(RectLeft.x, RectRight.y, abs(RectLeft.x - RectRight.x)); std::vector<cv::Point3f> input; std::vector<cv::Point3f> output; input.push_back(P3f); cv::perspectiveTransform(input, output, Q); std::cout << output[0] <<std::endl; std::cin.get(); return 0; } Результат: XYZ: [-4.35133, 0.928411, 18.1313] Второй алгоритм: Расстояние рассчитываю по формуле: Расстояние = (Расстояние между камерами (мм) × фокусное расстояние) / карта несоответствия (disparity) Фокусное расстояние = Q[2][3] Расстояние между камерами (мм) = 1/Q[3][2] =0,5 м Для расчёта disparity (в том числе отфильтрованной) использую пример: https://docs.opencv.org/master/d3/d14/tutorial_ximgproc_disparity_filtering.html Код: #include <iostream> #include <vector> #include <stdint.h> #include <string> #include <fstream> #include "opencv2/calib3d/calib3d.hpp" #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include "opencv2/core/utility.hpp" #include <opencv2/calib3d.hpp> #include "opencv2/ximgproc.hpp" #include <stdio.h> using namespace cv; using namespace cv::ximgproc; using namespace std; //https://docs.opencv.org/master/d3/d14/tutorial_ximgproc_disparity_filtering.html int main(int argc, char** argv) { cv::Mat M1 = (cv::Mat_<double>(3, 3) << 7986.2559620260, 0.0000000000, 524.7794558939, 0.0000000000, 7603.3099586941, 765.6466654278, 0.0000000000, 0.0000000000, 1.0000000000); cv::Mat D1 = (cv::Mat_<double>(1, 5) << -0.0626244338, -23.0384673454, 0.0000000000, 0.0000000000, 0.0000000000); cv::Mat M2 = (cv::Mat_<double>(3, 3) << 7789.0835738047, 0.0000000000, 2085.4988788672, 0.0000000000, 7523.3700278846, 271.1883527428, 0.0000000000, 0.0000000000, 1.0000000000); cv::Mat D2 = (cv::Mat_<double>(1, 5) << 0.2407018952, -7.8745465803, 0.0000000000, 0.0000000000, 0.0000000000); cv::Mat Q = (cv::Mat_<double>(4, 4) << 1, 0, 0, -2.8951307125091553e+03, 0, 1, 0, -5.0271924400329590e+02, 0, 0, 0, 7.5633399932893499e+03, 0, 0, 2.0857193103842788e+00, 0); cv::Mat left = cv::imread("left_3.bmp"); cv::Mat right = cv::imread("right_3.bmp"); //Устраняем дисторсию cv::Mat tmp1, tmp2; cv::undistort(left, tmp1, M1, D1); cv::undistort(right, tmp2, M2, D2); left = tmp1; right = tmp2; cv::Mat left_for_matcher, right_for_matcher; //int numberOfDisparities = 160; int max_disp= 160; max_disp/=2; if(max_disp%16!=0) max_disp += 16-(max_disp%16); float scale = 2; resize(left ,left_for_matcher ,Size(),scale,scale, INTER_LINEAR_EXACT); resize(right,right_for_matcher,Size(),scale,scale, INTER_LINEAR_EXACT); Ptr<StereoBM> left_matcher = StereoBM::create(max_disp,5); /* left_matcher->setPreFilterCap(31); left_matcher->setBlockSize(31); left_matcher->setMinDisparity(0); left_matcher->setNumDisparities(numberOfDisparities); left_matcher->setTextureThreshold(10); left_matcher->setUniquenessRatio(15); left_matcher->setSpeckleWindowSize(100); left_matcher->setSpeckleRange(32); left_matcher->setDisp12MaxDiff(1);*/ auto wls_filter = createDisparityWLSFilter(left_matcher); Ptr<StereoMatcher> right_matcher = createRightMatcher(left_matcher); cvtColor(left_for_matcher, left_for_matcher, COLOR_BGR2GRAY); cvtColor(right_for_matcher, right_for_matcher, COLOR_BGR2GRAY); cv::Mat left_disp, right_disp, filtered_disp; left_matcher->compute(left_for_matcher, right_for_matcher,left_disp); right_matcher->compute(right_for_matcher,left_for_matcher, right_disp); wls_filter->setLambda(8000); wls_filter->setSigmaColor(1.5); wls_filter->filter(left_disp,left_for_matcher,filtered_disp,right_disp); Mat raw_disp_vis; double vis_mult = 1; cv::ximgproc::getDisparityVis(left_disp,raw_disp_vis,vis_mult); namedWindow("raw disparity", WINDOW_NORMAL); imshow("raw disparity", raw_disp_vis); Mat filtered_disp_vis; getDisparityVis(filtered_disp,filtered_disp_vis,vis_mult); namedWindow("filtered disparity", WINDOW_NORMAL); imshow("filtered disparity", filtered_disp_vis); std::cout << filtered_disp_vis.size() <<std::endl; resize(filtered_disp_vis ,filtered_disp_vis ,Size(),1/scale,1/scale, INTER_LINEAR_EXACT); std::cout << filtered_disp_vis.size() <<std::endl; cv::Point p(1200,900); //Берём произвольную точку на доске filtered_disp_vis.convertTo(filtered_disp_vis, CV_32F); float fDisp = filtered_disp_vis.at<float>(p.y, p.x); //Расчёт расстояния float distance = Q.at<double>(2, 3)*(1./ Q.at<double>(3, 2))/fDisp; std::cout << "Distance = " << distance << std::endl; cv::imwrite("filtered_disp_vis.png", filtered_disp_vis); waitKey(); return 0; } Disparity: Результат: 57.55 Расположение точки:
  18. 1 point
    А можете привести схему эксперимента? Как установлены камеры, расположение и размеры объекта. А то вы привели результат работы алгоритма, а что должно быть мы не знаем. Может быть еще минимальный запускаемый кусок кода с тестовым изображением для пощупать проблему.
  19. 1 point
    Кажется, что на сшитом уже ничего особо не сделаешь - раньше надо было делать то, что используется в stitching методах. А тут разве что классический deblocking может зайти, чтобы не попортить информацию. Debloking - это просто фильтр вдоль границ склейки по сути.
  20. 1 point
    Кажется, что на представленном рисунке не CLAHE, а простой equalizeHist. Только лучше с этим поэкспериментировать. Минимум это: RGB изображение -> split по каналам -> equalizeHist для каждого канала -> merge. Но возможно, что лучше сработает перевод картинки в другое цветовое пространство, например HSV, а там делать эквализацию не для всех каналов, а только для насыщенности. Или для насыщенности и яркости. Короче, надо экспериментировать. Но и CLAHE может зайти, потому что эквализация - это довольно жёсткое преобразование и может сильно исказить (зато без потери информации).
  21. 1 point
    В OpenCV в модуле opencv_stitching для этого есть класс ExposureCompensator. Лучше изучи, как работает пример stitching_detailed. Там весь пайплайн сшивки панорамы и все необходимые кусочки есть.
  22. 1 point
    Возможно человеку нужно вычислить оптический поток и поворот камеры относительно предыдущих снимков по z? Выделить особые точки на соседних снимках и применить cv2.estimateRigidTransform(src, dst, fullAffine)
  23. 1 point
    Кажется, что лучшее решение - это всё таки 3D реконструкция, например smf. Скормите ему все свои картинки и получите координаты камеры в 3D для каждого снимка.
  24. 1 point
    это можно, но тогда на изображениях должна быть одна и та же картинка, отличающаяся только поворотом, ну может немного смещенная. Короче, если взяв эти деве картинки вы на глаз можете определить поворот, то и комп сможет, если нет, то нет.
  25. 1 point
    У вас он даст угол между двумя изображениями. Они должны перекрываться. Если работать по последовательности кадров, то углы нужно суммировать. А тот ли это угол ? Хм... ну это вам лучше знать Задача то вами ставится.
  26. 1 point
    Если что то вроде оптической мышки получается, то есть изображения с приличным перекрытием, то попробуйте https://github.com/Smorodov/LogPolarFFTTemplateMatcher или посмотрите cv::estimateRigidTransform + какие-нибудь фичи (sift, surf, orb, ...).
  27. 1 point
    Погуглите slam, ptam, dtam, multiple view geometry, Это не маленький объем математики, и привести его здесь проблематично. Посмотрите библиотечку OpenMVG .
  28. 1 point
    Моя версия распознавание российского паспорта. При распознавании букв использовал Tesseract
  29. 1 point
    Зоопарк сеток от Wolfram : https://resources.wolframcloud.com/NeuralNetRepository/
  30. 1 point
    Прошу прощения, что я не ответил в данной теме, хотя задача давно была решена. Я подумал, что будет неправильно не отписаться здесь, так как кто-то может искать решение. Действительно, данная функция CornerSubPix, при определенных параметрах, помогла полностью устранить дрожание на камере с разрешением 2к на 1.5к. Спасибо всем.
  31. 1 point
    Кажется, что прямо на OpenCV этого из коробки нет, но в dlib есть.
  32. 1 point
    Ну прям под заказ не знаю, покопайте тут https://github.com/topics/face-recognition?l=c%2B%2B Всякого добра по теме там много.
  33. 1 point
    Я не в курсе цели трекания шахматки в вашем случае, но если это не для калибровки, то попробуйте эту либу: http://nghiaho.com/?page_id=576 Или фильтруйте уже 6D положение доски. Там все равно решается переопределенная СЛАУ и выдается решение по методу наименьших квадратов. Если делаете сглаживание для каждой точки, выглядеть будет конечно лучше, но точности вряд ли добавит. Как компромисс, используйте сглаженное 6D положение и проецируйте обратно на экран измеренные по доске точки модели.
  34. 1 point
    Точки могут дрожать, например, из-за того, что маленькое разрешение, а угол попадает между пикселями. Можно попробовать вызывать cv::findCornersSubpix. Я когда-то для лицевых точек прмкручивал оптический поток и Калмана.
  35. 1 point
    Ну да, Хааром уже не модно Сейчас всякие SSD и YOLO юзают. Вот еще из недавнего: https://github.com/facebookresearch/detectron2 Правда вряд ли реалтайм.
  36. 1 point
    OpenCV тут не помощник. Сеточками надо (Object Detection). Судя по картинке, предположу, что это YOLO3. https://github.com/aloyschen/tensorflow-yolo3
×