Перейти к содержимому
Compvision.ru

Smorodov

Главные администраторы
  • Количество публикаций

    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-той точками (точнее их дескрипторами).

     

    • Thanks 1

  2. По горизонтали точки левого изображения, по вертикали правого, если соединяются то в пересечении 1 если нет, 0. 

    Получите матрицу смежности. Если есть качество сопоставления, можно сделать взвешенный граф, вместо 0 и 1 задавать вес. 

    • Thanks 1

  3. Можно применить автокорреляцию, не обязательно на сырых изображений. Можно предварительно прогнать через что ни будь типа OpenPose.

    По автокорреляции прикинуть полный период. А дальше выделить фазы. Ну и по вашему плану.

     


  4. Если изображения трансформированы сдвигом, масштабом и поворотом, можно попробовать estimateRigidTransform . 

    Если только смещение, без поворота то, как альтернатива - phaseCorrelate() . 

    Для того чтобы np.stack работала, изображения должны быть одинакового размера и типа, то есть придется их как-то привести к стандартному формату.

    Вначале посчитать среднее смещение, и принять эту точку за начало отсчета, затем создать пустое изображение для каждого слоя и вклеить в них со смещением, поворотом исходные изображения. Можно использовать warpAffine (попробовать можно здесь


  5. Я на шарпе не пишу, на 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 - буфер где будет вычисляться среднее.

  6. Классически делается при помощи взвешенной суммы addWeigted с коэффициентом 1/n , где n - количество усредняемых кадров. 

    Можно использовать как усреднение в видеопотоке.  Описание тут: http://www.emgu.com/wiki/files/3.1.0/document/html/180ae243-ff3c-f59c-7e3a-a8e474583e8e.htm 


  7. Извиняюсь что запоздал с ответом, был в отъезде. 

    Сишный пример из стандартного набора:

     

    #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. 

    Для детектора линий, нужно белое изображение на черном фоне. 


  8. dilate - утолщит все с сольет в блоки. Структурный элемент взять высотой с символ, шириной примерно в 1.5 - 2.5 от ширины символа.

    после него erode с тем же ядром, чтобы вернуть размеры блоков. 

    Повторить поиск контуров. 

     


  9. На английском конечно, но по теме ) : https://www.pyimagesearch.com/2014/09/01/build-kick-ass-mobile-document-scanner-just-5-minutes/

    GetStructuringElement создает структурный элемент для морфологических операций (эрозия, дилатация, открытие, закрытие .... ) элемент представляет собой маленький шаблончик в виде прямоугольника заполненного единицами, реже используется эллипс, крест, и т.д. Посмотрите про морфологические операции и все станет ясно. 

    https://ru.wikipedia.org/wiki/Математическая_морфология

     


  10. Может там фильтр по минимальной площади текста стоит, попробуйте увеличить размер изображения, или посмотрите параметры тессеракта, помнится таи их огромная куча была.

    Вот, кстати:

    https://www.sk-spell.sk.cx/tesseract-ocr-parameters-in-302-version

    • Like 1

  11. Прислушайтесь к тому, что советует Nuzhny, начните с tesseract-ocr, есть даже бинды под шарп https://github.com/charlesw/tesseract например. 

    Пример применения : https://github.com/charlesw/tesseract-samples

    Но если есть много энергии и желание повозиться, пишите, посоветуем по шагам, но это длинный путь )

     

    • Like 1

  12. Нет, снимаем любые изображения.

    Сейчас подумал, что способ будет работать при аддитивной модели искажения i=i_0+i_noise.

    А здесь, похоже мультипликативная: 

    i=i_0*i_v

    Так как черное изображение остается черным.

    PCA пожалуй не разделит в этом случае. 

    Видимо надо сильно размыть изображение белого листа, нормализовать цвет в каждой точке (r=r/norm(rgb), g=g/norm(rgb),b=b/norm(rgb)). 

    Ну и разделить попиксельно исходное изображение на полученные коэффициенты.

     

×