Jump to content
Compvision.ru

All Activity

This stream auto-updates     

  1. Today
  2. Yesterday
  3. Last week
  4. Доброго времени суток, товарищи! Имеются изображения. Не могу приложить к теме, позволяет только 80кб файл. Их нужно наложить одно на другое. Но они со "сдвигом". Как правильно их наложить, учитывая сдвиг? Чтоб всё совпало Накладываю изображения с помощью функции numpy.stack() Благодарю!
  5. Earlier
  6. Я использую opencv.js и в try-catch блоке иногда ловится ошибка не в виде текста, а в виде одного числа без комментариев, например, 6586736. Числа в рзаных случаях разные. Что это значит?
  7. Спасибо за советы. Получилось!
  8. Я на шарпе не пишу, на 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 - буфер где будет вычисляться среднее.
  9. Спасибо. Не очень понятен метод AddWeighted. Может быть, есть примеры суммирования n-изображений?
  10. Классически делается при помощи взвешенной суммы addWeigted с коэффициентом 1/n , где n - количество усредняемых кадров. Можно использовать как усреднение в видеопотоке. Описание тут: http://www.emgu.com/wiki/files/3.1.0/document/html/180ae243-ff3c-f59c-7e3a-a8e474583e8e.htm
  11. Как можно сделать усреднение n-кадров видеопотока (EmguCV)? Есть простая идея. Как правильно суммировать? int n = 10; Mat img_sum = new Mat(); Mat img_m = new Mat(); for (int i = 1; i <= 10; ++i) { capture.SetCaptureProperty(Emgu.CV.CvEnum.CapProp.PosFrames, i); capture.Read(m); //нужно подсчитать сумму } img_m = img_sum / n;
  12. Премного благодарен, уважаемый, получилось выровнить изображение.
  13. @Smorodov, премного благодарен. Как я понял, параметры dy, dx - разность координат точек отрезка (линии) ?
  14. Ну если знаем 2 точки то alpha=atan2(dy,dx)
  15. Прописал вот такой код: var lines = Cv2.HoughLinesP(thresh_img, 1, Math.PI / 180, 200, 150, 30); LineSegmentPoint max_line = new LineSegmentPoint(); for (int i = 0; i < lines.Length; i++) { // получаем максимальную длинную прямую if (lines[i].Length() > max_line.Length()) { max_line = lines[i]; } Cv2.Line(original_img, lines[i].P1, lines[i].P2, new Scalar(0, 0, 250), 2); } // выводим линию максимальной длины Cv2.Line(original_img, max_line.P1, max_line.P2, new Scalar(255, 0, 0), 3); отображает вот в таком виде (синяя линия - это максимально прямая линия) Как теперь определить угол поворота по синей линии ? Это необходимо для выравнивания скана документа. Как я понял, угол можно получить с помощью HoughLines(), можно ли как-то получит угол по LineSegmentPoint ?
  16. Да, спасибо, я уже понял методом "тыка" что представляют эти методы Хорошо, попробую. Просто я линии, которые нашел с помощью HoughLines(), выводил на оригинал изображения. С вашим примером обязательно попробую.
  17. Коррекция кадров видео

    Спасибо. Нашёл
  18. Коррекция кадров видео

    Большое спасибо. Совсем даже не поздно. У нас всё очень неспешно происходит... Но не совсем понял, по какой книге это сделано, вроде ссылка на книгу есть, но что-то не переходит...
  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. Все-таки видимо нужно идти другим путем. Убрать все прямые вертикальные и горизонтальные линии, т.к. они мешают для утолщения. Написал (поправил чужой код) вот такой код для поиска и отображения прямых линий: Mat original_img = new Mat(PathToImage); Mat gray_img = original_img.CvtColor(ColorConversionCodes.BGR2GRAY); Mat thresh_img = gray_img.Threshold(0, 255, ThresholdTypes.Otsu | ThresholdTypes.BinaryInv); var lines = Cv2.HoughLines(thresh_img, 200, Math.PI/180, 2); for(int x = 0; x < lines.Count(); x++) { float rho = lines[x].Rho; float theta = lines[x].Theta; double a = Math.Cos(theta); double b = Math.Sin(theta); double x0 = a * rho; double y0 = b * rho; LineSegmentPoint point = new LineSegmentPoint(); point.P1.X = (int)Math.Round(x0 + (1000 * (-b))); point.P1.Y = (int)Math.Round(y0 + (1000 * (a))); point.P2.X = (int)Math.Round(x0 - (1000 * (-b))); point.P2.Y = (int)Math.Round(y0 - (1000 * (a))); Cv2.Line(original_img, point.P1, point.P2, new Scalar(0, 200, 20)); } Но линии рисуются вообще не правильно (рисуются диагоналями, под углом), я так понимаю, что накосячил где-то в преобразовании координат ? И что это за магические числа в виде 1000 ?
  22. @Smorodov, Приветствую, уважаемый! А можно пример в виде используемых функций ? Простите уж за такое наглое пожелание
  23. dilate - утолщит все с сольет в блоки. Структурный элемент взять высотой с символ, шириной примерно в 1.5 - 2.5 от ширины символа. после него erode с тем же ядром, чтобы вернуть размеры блоков. Повторить поиск контуров.
  24. Вот я обработал контуры, с помощью чего можно их объединить?
  25. Это просто жуть, тут не то что бутылка нужна, нужно заново родиться, и впитывать это с молоком матери
  26. На английском конечно, но по теме ) : https://www.pyimagesearch.com/2014/09/01/build-kick-ass-mobile-document-scanner-just-5-minutes/ GetStructuringElement создает структурный элемент для морфологических операций (эрозия, дилатация, открытие, закрытие .... ) элемент представляет собой маленький шаблончик в виде прямоугольника заполненного единицами, реже используется эллипс, крест, и т.д. Посмотрите про морфологические операции и все станет ясно. https://ru.wikipedia.org/wiki/Математическая_морфология
  27. За что отвечает функция GetStructuringElement() и что за параметры используются ?
  28. Все-таки рано радовался. На "эталонном" документе все отрабатывает как нужно, т.к. я распознаю заранее фиксированные области Но предстоит работать со сканированными изображениями, причем, сама форма документа может отличаться от "эталонного" в визуальном плане. Поэтому работа с OpenCV, думаю, все-таки предстоит. Нужно как-то определять границы текста, далее его "вырезать" и скармливать tesseract-у. Походу возвращаюсь к сообщению. Как корректно распознать области(границы) с текстом ?
  1. Load more activity
×