Jump to content
Compvision.ru

Smorodov

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

    3,829
  • Joined

  • Last visited

  • Days Won

    342

Everything posted by Smorodov

  1. Объединение контуров в один

    Не знаю как в шарпе это будет выглядеть, но вообще надо перебрать все контуры, а в контурах перебрать все точки. Двухуровневый цикл. Может тут что интересное найдете: https://csharp.hotexamples.com/ru/examples/Emgu.CV.Util/VectorOfVectorOfPoint/-/php-vectorofvectorofpoint-class-examples.html
  2. Еще ссылка в тему: https://github.com/RaubCamaioni/OpenCV_Position И статья к проекту: https://medium.com/analytics-vidhya/using-homography-for-pose-estimation-in-opencv-a7215f260fdd
  3. Набрел недавно на прикольный набор инструментов для обработки текстов на русском языке: https://github.com/natasha Просто чтобы не забыть ) Хочу в перспективе соединить со зрением, (другими датчиками) слухом и голосом :)
  4. d=w-(xc2-xc1) d - перекрытие w - ширина xc1 , xc2 - координаты центров \\\\\\\\\\\о////////// \\\\\\\\\\o/////////// -- без перекрытия \\\\\\\\\\\о//////XXXX\\\\\\o/////////// - с перекрытием
  5. Поздравляю ! Да, я не знал как это называется ) Но все равно сводится к треугольнику ))
  6. Ну так угол зрения камеры знаете, высоту съемки тоже, треугольник вам в помощь )
  7. Построить граф в виде матрицы

    Да не, все вроде верно, просто не внимательно прочитал. Я думал вы в сторону hungarian-algorithm клоните )
  8. Построить граф в виде матрицы

    Только расстояние между дескрипторами обратно пропорционально схожести точек.
  9. Построить граф в виде матрицы

    Ну код крафтить мне лень ) Чтобы добыть ключевые точки, можно заюзать что то такое: import numpy as np import cv2 from matplotlib import pyplot as plt img1 = cv2.imread('box.png',0) # queryImage img2 = cv2.imread('box_in_scene.png',0) # trainImage # Initiate SIFT detector sift = cv2.SIFT() # find the keypoints and descriptors with SIFT kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) Есть 2 набора точек, у которых есть дескрипторы (многомерные точки), так вот, делаем двойной вложенный цикл. И заполняем матрицу NxM, где N - количество точек первого изображения, а M - второго. Элемент матрицы D[i,j] будет равен расстоянию между i-той и j-той точками (точнее их дескрипторами).
  10. Построить граф в виде матрицы

    По горизонтали точки левого изображения, по вертикали правого, если соединяются то в пересечении 1 если нет, 0. Получите матрицу смежности. Если есть качество сопоставления, можно сделать взвешенный граф, вместо 0 и 1 задавать вес.
  11. Можно применить автокорреляцию, не обязательно на сырых изображений. Можно предварительно прогнать через что ни будь типа OpenPose. По автокорреляции прикинуть полный период. А дальше выделить фазы. Ну и по вашему плану.
  12. А стандартный пример из исходников OpenCV пробовали ? https://github.com/opencv/opencv/blob/master/samples/cpp/calibration.cpp
  13. Если только смещение, без поворота то попробуйте, phaseCorrelate() . Можно еще вырезать шаблон и использовать templateMatching, Есть и более продвинутые способы, например : https://www.sicara.ai/blog/2019-07-16-image-registration-deep-learning
  14. Если изображения трансформированы сдвигом, масштабом и поворотом, можно попробовать estimateRigidTransform . Если только смещение, без поворота то, как альтернатива - phaseCorrelate() . Для того чтобы np.stack работала, изображения должны быть одинакового размера и типа, то есть придется их как-то привести к стандартному формату. Вначале посчитать среднее смещение, и принять эту точку за начало отсчета, затем создать пустое изображение для каждого слоя и вклеить в них со смещением, поворотом исходные изображения. Можно использовать warpAffine (попробовать можно здесь.
  15. А что должно получиться ? Насколько я помню, stack сделает 6 слойное изображение. Вы этого добиваетесь? Или нужно просто визуальное наложение с прозрачностью ?
  16. Я на шарпе не пишу, на C++ это было бы так, конвертировать матрицы в тип float при помощи convertTo, затем просто суммировать S=S+m и в конце разделить на количество кадров S=S/n. Или применить addWeighted beta = ( 1.0 - alpha ); addWeighted( src1, alpha, src2, beta, 0.0, dst); alpha в вашем случае 1/n src2=dst , src1 - новое изображение с камеры. dst - буфер где будет вычисляться среднее.
  17. Классически делается при помощи взвешенной суммы addWeigted с коэффициентом 1/n , где n - количество усредняемых кадров. Можно использовать как усреднение в видеопотоке. Описание тут: http://www.emgu.com/wiki/files/3.1.0/document/html/180ae243-ff3c-f59c-7e3a-a8e474583e8e.htm
  18. Ну если знаем 2 точки то alpha=atan2(dy,dx)
  19. Коррекция кадров видео

    Поздно но наткнулся на пакет для решения подобных задач: https://github.com/cruxopen/openISP
  20. Извиняюсь что запоздал с ответом, был в отъезде. Сишный пример из стандартного набора: #include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src, dst, color_dst; if( argc != 2 || !(src=imread(argv[1], 0)).data) return -1; Canny( src, dst, 50, 200, 3 ); cvtColor( dst, color_dst, COLOR_GRAY2BGR ); vector<Vec4i> lines; HoughLinesP( dst, lines, 1, CV_PI/180, 80, 30, 10 ); for( size_t i = 0; i < lines.size(); i++ ) { line( color_dst, Point(lines[i][0], lines[i][1]), Point( lines[i][2], lines[i][3]), Scalar(0,0,255), 3, 8 ); } namedWindow( "Source", 1 ); imshow( "Source", src ); namedWindow( "Detected Lines", 1 ); imshow( "Detected Lines", color_dst ); waitKey(0); return 0; } По поводу морфологических операций, cv::dilate затем cv::erode. Для детектора линий, нужно белое изображение на черном фоне.
  21. dilate - утолщит все с сольет в блоки. Структурный элемент взять высотой с символ, шириной примерно в 1.5 - 2.5 от ширины символа. после него erode с тем же ядром, чтобы вернуть размеры блоков. Повторить поиск контуров.
  22. На английском конечно, но по теме ) : https://www.pyimagesearch.com/2014/09/01/build-kick-ass-mobile-document-scanner-just-5-minutes/ GetStructuringElement создает структурный элемент для морфологических операций (эрозия, дилатация, открытие, закрытие .... ) элемент представляет собой маленький шаблончик в виде прямоугольника заполненного единицами, реже используется эллипс, крест, и т.д. Посмотрите про морфологические операции и все станет ясно. https://ru.wikipedia.org/wiki/Математическая_морфология
  23. На CPP это cv::resize , на шарпе не знаю. Ну если все получилось, поздравляю! ))
  24. Может там фильтр по минимальной площади текста стоит, попробуйте увеличить размер изображения, или посмотрите параметры тессеракта, помнится таи их огромная куча была. Вот, кстати: https://www.sk-spell.sk.cx/tesseract-ocr-parameters-in-302-version
×