-
Количество публикаций
3 873 -
Зарегистрирован
-
Посещение
-
Days Won
346
Все публикации пользователя Smorodov
-
Как я понял из описания: Функция возвращает ROI с корректными пикселями в параметре validPixROI . Alpha -задает порог по используемым пикселям, допустим пиксели ценные (сильные угловые точки), то они пройдут высокий порог, а на однотонном гладком участке точки будут малоценными и будут давать большую погрешность при сопоставлении, их ценность близка к 0. Вот из alpha и отсечет в зависимости от значения.
- 1 reply
-
- 1
-
- opencv
- cameramatrix
- (и ещё %d)
-
Не знаю как в шарпе это будет выглядеть, но вообще надо перебрать все контуры, а в контурах перебрать все точки. Двухуровневый цикл. Может тут что интересное найдете: https://csharp.hotexamples.com/ru/examples/Emgu.CV.Util/VectorOfVectorOfPoint/-/php-vectorofvectorofpoint-class-examples.html
-
Еще ссылка в тему: https://github.com/RaubCamaioni/OpenCV_Position И статья к проекту: https://medium.com/analytics-vidhya/using-homography-for-pose-estimation-in-opencv-a7215f260fdd
-
d=w-(xc2-xc1) d - перекрытие w - ширина xc1 , xc2 - координаты центров \\\\\\\\\\\о////////// \\\\\\\\\\o/////////// -- без перекрытия \\\\\\\\\\\о//////XXXX\\\\\\o/////////// - с перекрытием
-
Поздравляю ! Да, я не знал как это называется ) Но все равно сводится к треугольнику ))
-
Ну так угол зрения камеры знаете, высоту съемки тоже, треугольник вам в помощь )
-
Да не, все вроде верно, просто не внимательно прочитал. Я думал вы в сторону hungarian-algorithm клоните )
-
Только расстояние между дескрипторами обратно пропорционально схожести точек.
-
Ну код крафтить мне лень ) Чтобы добыть ключевые точки, можно заюзать что то такое: 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 если нет, 0. Получите матрицу смежности. Если есть качество сопоставления, можно сделать взвешенный граф, вместо 0 и 1 задавать вес.
-
Можно применить автокорреляцию, не обязательно на сырых изображений. Можно предварительно прогнать через что ни будь типа OpenPose. По автокорреляции прикинуть полный период. А дальше выделить фазы. Ну и по вашему плану.
- 2 replies
-
- neural net
- opencv
-
(и ещё %d)
Теги:
-
Если только смещение, без поворота то попробуйте, 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)
-
Поздно но наткнулся на пакет для решения подобных задач: https://github.com/cruxopen/openISP
-
Извиняюсь что запоздал с ответом, был в отъезде. Сишный пример из стандартного набора: #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