-
Количество публикаций
3 873 -
Зарегистрирован
-
Посещение
-
Days Won
346
Сообщения, опубликованные пользователем Smorodov
-
-
Только расстояние между дескрипторами обратно пропорционально схожести точек.
- 1
-
Ну код крафтить мне лень )
Чтобы добыть ключевые точки, можно заюзать что то такое:
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-той точками (точнее их дескрипторами).
- 1
-
По горизонтали точки левого изображения, по вертикали правого, если соединяются то в пересечении 1 если нет, 0.
Получите матрицу смежности. Если есть качество сопоставления, можно сделать взвешенный граф, вместо 0 и 1 задавать вес.
- 1
-
Можно применить автокорреляцию, не обязательно на сырых изображений. Можно предварительно прогнать через что ни будь типа OpenPose.
По автокорреляции прикинуть полный период. А дальше выделить фазы. Ну и по вашему плану.
-
А стандартный пример из исходников OpenCV пробовали ?
https://github.com/opencv/opencv/blob/master/samples/cpp/calibration.cpp -
Если только смещение, без поворота то попробуйте, phaseCorrelate() .
Можно еще вырезать шаблон и использовать templateMatching,
Есть и более продвинутые способы, например : https://www.sicara.ai/blog/2019-07-16-image-registration-deep-learning
-
Если изображения трансформированы сдвигом, масштабом и поворотом, можно попробовать estimateRigidTransform .
Если только смещение, без поворота то, как альтернатива - phaseCorrelate() .
Для того чтобы np.stack работала, изображения должны быть одинакового размера и типа, то есть придется их как-то привести к стандартному формату.
Вначале посчитать среднее смещение, и принять эту точку за начало отсчета, затем создать пустое изображение для каждого слоя и вклеить в них со смещением, поворотом исходные изображения. Можно использовать warpAffine (попробовать можно здесь.
-
А что должно получиться ? Насколько я помню, stack сделает 6 слойное изображение.
Вы этого добиваетесь? Или нужно просто визуальное наложение с прозрачностью ?
-
Я на шарпе не пишу, на 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 - буфер где будет вычисляться среднее. -
Классически делается при помощи взвешенной суммы addWeigted с коэффициентом 1/n , где n - количество усредняемых кадров.
Можно использовать как усреднение в видеопотоке. Описание тут: http://www.emgu.com/wiki/files/3.1.0/document/html/180ae243-ff3c-f59c-7e3a-a8e474583e8e.htm
-
-
Ну если знаем 2 точки то alpha=atan2(dy,dx)
- 1
-
-
Извиняюсь что запоздал с ответом, был в отъезде.
Сишный пример из стандартного набора:
#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.
Для детектора линий, нужно белое изображение на черном фоне.
-
dilate - утолщит все с сольет в блоки. Структурный элемент взять высотой с символ, шириной примерно в 1.5 - 2.5 от ширины символа.
после него erode с тем же ядром, чтобы вернуть размеры блоков.
Повторить поиск контуров.
-
На английском конечно, но по теме ) : https://www.pyimagesearch.com/2014/09/01/build-kick-ass-mobile-document-scanner-just-5-minutes/
GetStructuringElement создает структурный элемент для морфологических операций (эрозия, дилатация, открытие, закрытие .... ) элемент представляет собой маленький шаблончик в виде прямоугольника заполненного единицами, реже используется эллипс, крест, и т.д. Посмотрите про морфологические операции и все станет ясно.
https://ru.wikipedia.org/wiki/Математическая_морфология
-
На CPP это cv::resize , на шарпе не знаю.
Ну если все получилось, поздравляю! ))
-
Может там фильтр по минимальной площади текста стоит, попробуйте увеличить размер изображения, или посмотрите параметры тессеракта, помнится таи их огромная куча была.
Вот, кстати:
https://www.sk-spell.sk.cx/tesseract-ocr-parameters-in-302-version
- 1
-
Ну сетка это слишком жестко )
Под видео ссылка на гитхаб.
- 1
- 1
-
В OpenCv ecть встроенные детекторы текста, гляньте здесь: https://www.pyimagesearch.com/2018/08/20/opencv-text-detection-east-text-detector/
- 1
-
Прислушайтесь к тому, что советует Nuzhny, начните с tesseract-ocr, есть даже бинды под шарп https://github.com/charlesw/tesseract например.
Пример применения : https://github.com/charlesw/tesseract-samples
Но если есть много энергии и желание повозиться, пишите, посоветуем по шагам, но это длинный путь )
- 1
-
-
переводить в hsv и выделять цвет, можно было бы, если бы изображение листа было без цвета, но так не бывает в реальном мире лист не белый и не серый, он тоже цветной.
-
Нет, снимаем любые изображения.
Сейчас подумал, что способ будет работать при аддитивной модели искажения i=i_0+i_noise.
А здесь, похоже мультипликативная:
i=i_0*i_v
Так как черное изображение остается черным.
PCA пожалуй не разделит в этом случае.
Видимо надо сильно размыть изображение белого листа, нормализовать цвет в каждой точке (r=r/norm(rgb), g=g/norm(rgb),b=b/norm(rgb)).
Ну и разделить попиксельно исходное изображение на полученные коэффициенты.
Построить граф в виде матрицы
в OpenCV
Опубликовано · Report reply
Да не, все вроде верно, просто не внимательно прочитал.
Я думал вы в сторону hungarian-algorithm клоните )