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

iskees

Пользователи
  • Количество публикаций

    202
  • Зарегистрирован

  • Посещение

  • Days Won

    19

Сообщения, опубликованные пользователем iskees


  1. Немного не понял как связаны PCA  и AAM, там же вроде совсем другой подход. Собственно по активным моделям: я использовал   http://sourceforge.net/projects/asmlibrary/, проект довольно старый но рабочий, относительно быстро работает и что главное (для меня) не  без геморроя но переносится на .net


  2. 3.2

     

    Тебе  надо для найденных линий определить, какие из них будут границами прямоугольника.

    На первый взгляд, это можно сделать простым перебором:

    1. разделитьвсе линии на 4 группы: вертикальные слева от центра, вертикальные справа от центра, горизонтальные выше центра и горизонтальные ниже центра;

    2. перебрать все возможные варианты прямоугольников, стороны выбирать из соответствующих групп (берёшь по  линии из каждой группы, находишь точки пересечения - прямоугольник);

    3. в качестве критерия правильности нахождения прямоугольника можно использовать два критерия:

    3.1. пропорции прямоугольника должны минимально отличаться от пропорций идеального номера;

    3.2. строить гистограмму яркости внутри прямоугольника и области снаружи его: гистограммы должны максимально отличаться.

     

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

    3.2 часто бывают машины с номером на фальшрешетке радиатора и  гистограмму яркости будет  такая-же как и у номера.


  3. Всем доброго здравия

    Написал процедуру поиска по шаблону в видео с камеры

    Все работает, но есть проблема

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

     

     Как программно определиться, что шаблон найден?

    Вы бы хоть написали как вы этот поиск шаблона производите, какой функцией и т.п. Ну как выше сказано отсекать можно по значению функции отклика.

    • Like 1

  4. 1 Поиск прямоугольника сработает только в идеальных условиях при которых сработает и findContours, но второй на МНОГО быстрее и мене "капризный"

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

    Может поделитесь каскадом Хаара?

    • Like 1

  5. Здравствуйте! Для моей задачи нужно найти контур объекта по некоторым условиям, это я сделал: 

    using (MemStorage storage = new MemStorage()) // выделить память для контура 
                {
                    Contour<Point> contours = grayImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST, storage);
                    for (Contour<Point> contour = contours; contours != null; contours = contours.HNext)
                    {
                        
                        //Для сглаживания и получения более аккуратных контуров можно воспользоваться функцией 
                        Contour<Point> currentContour = contours.ApproxPoly(contours.Perimeter * 0.005, storage);
                        double ratio = currentContour.BoundingRectangle.Width / currentContour.BoundingRectangle.Height;
                        //if(ratio > 10 & ratio <15)
                        if (ratio > 3 & ratio < 6)
                        {
                            if (currentContour.BoundingRectangle.Width > sizeDown & currentContour.BoundingRectangle.Width < sizeUp)
                            {
                                //Цвет внешних контуров, Цвет внутренних контуров,Максимальный уровень для отображаемых контуров, 
                                //Толщина контура, Тип линии (смотрите описание в функции cvLine),Сдвигает все координаты точек на указанное значение. Полезно в случае, если, если контуры, найденные в некотором изображении ROI должны быть приняты во внимание для предоставления в изображении.
                                CvInvoke.cvDrawContours(colorImage, contours, new MCvScalar(255), new MCvScalar(105), -2, 1, Emgu.CV.CvEnum.LINE_TYPE.FOUR_CONNECTED, new Point(0, 0));
                                colorImage.Draw(currentContour.BoundingRectangle, new Bgr(0, 255, 0), 2);
                            }
     
                        }
                    } bgrImage = colorImage;
                } 

     

    Далее необходимо найти координаты этого контура, вырезать/скопировать в новую матрицу изображения, ну и дальше уже работать непосредственно с ней. Какие для это есть методы, функции?

     var box = contours.GetMinAreaRect(); //прямоугольник минимальный в который вписан контур

    var cutImage= image.GetSubImage(box) // вырезка этого прямоугольника в новое изображение 


  6. Задача такая: нужно декодировать   4k h.264 поток. Все завелось через  CvCapture, но проц грузит безбожно. из чего возникает два вопроса:

    1 есть ли способ стандартный CvCaptureзаставить  декодировать h.264 на карточке Nvidia

    2 используется ли в CvCapture  аппаратное ускорения новых процов intel (Intel® Quick Sync Video)

    Может кто в теме и просветит.


  7. информации мало не ясно:

    1 камера стационарна или нет

    2 конвейер один или нужно что бы работало на разных

    3 освещенность и возможность поставить свой свет

     

    И если камера стационарна то я бы попробовал:

    1 Указать область конвейер в кадре

    2 Бинаризация, бревна сильно вделаются на фоне. Если бревна не сильно выделяют то поставить лампочку. Или та же бинаризация но по цвету.

    3.0 Делаем шаблоны места "нахлеста", шаблона всего два (левое бревно сверху а правое снизу и наоборот)

    3 Проходим шаблоном вдоль области поиска и находим месте где шаблон "срабатывает"

     

    Или еще вариант

    1,2 как выше

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

    post-5717-0-48084000-1424192624_thumb.pn


  8. Попробовал тоже реализовать машинное обучение на облаке. Задача довольно простая, нужно обучать кучу нейросетей с постоянным их апргрейдом. Дело не особо хитрое, за три дне сделал. В Azure все это поднялось за пару часов без особых танцев с бубнами, первая сеть уже обучилась все как бы замечательно. Но есть огромная проблема – цена, самая слабая машинка в месяц выйдет в 2000, а что-то более-менее прилично уже в 10 000.  В целом для себя сделал вывод, что считать в облаке можно и это удобно, но очень уж дорого.

    Поэтому думаю использовать это же облако немного по-другому, само обучение запускать не в облаке, а на локальных машинах, которые будут брать с облака свободные задачи, вычислять их и отправлять обратно в облако. Такая схема выйдет уже рублей в 500 в месяц. Как то так, чисто хотел опытом поделится. 

    • Like 1

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

    Мне для распознавания символов больше всего подошел Christian, правда его нет в OpenCv.


  10. 
     if (openFileDialog1.ShowDialog() == DialogResult.OK)
    
                {
    
                    using (var image = new IplImage(openFileDialog1.FileName))
    
                    using (var hsv = new IplImage(image.Size, image.Depth, image.NChannels))
    
                    {
    
                        Cv.CvtColor(image,hsv, ColorConversion.BgrToHsv);
    
                        var splits = hsv.Split();
    
                        Cv.Threshold(splits[0], splits[0], 160, 255, ThresholdType.BinaryInv);
    
                       using( var bin = new IplImage(image.Size, image.Depth, 1))
    
                        {
    
                            Cv.Threshold(splits[2], bin, 150,255, ThresholdType.BinaryInv);
    
                            Cv.And(bin, splits[0], bin);
    
                            Cv.Smooth(bin, bin, SmoothType.Median, 3, 3 );
    
                            Cv.ShowImage("2", bin);
    
                        }
    
                        foreach (var s in splits)
    
                            s.Dispose();
    
                    }
    
    
                }
    
    

    http://www.compvision.ru/forum/uploads/monthly_08_2014/post-5717-0-20011600-1408638089_thumb.jpg

    post-5717-0-20011600-1408638089_thumb.jp

    • Like 1

  11. а в чес собственно сложность найти и распознать баркод. если код совсем крупные и не нужна скорость, то берете zxing скармливаеете ей битмап и получаете код если он там есть. Если нужно с начало найти и вырезать код, то делаете бинаризацию или любой edge благо границы контрастные, ищите квадраты (findcountur и фильтр по соотношению сторон) ну и у вслучае qr кода ищите три стоящих рядом одного размера, а в слоучае азтека два вложенных. Не знаю как в qt но на C# это выглядит так.

             
    
                    using (var emguimage = emgu.Convert<Gray, byte>())
    
                    using (var emgucanny = emguimage.ThresholdBinary(new Gray(120), new Gray(255)))
    
                    using (var memStorage = new MemStorage())
    
                    {
    
                            var rect = new List<MCvBox2D>();
    
                            emgucanny.SmoothMedian(5);
    
                            var contours = emgucanny.FindContours(CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE,RETR_TYPE.CV_RETR_CCOMP, memStorage);
    
                            for (; contours != null; contours = contours.HNext)
    
                                if ( Math.Abs(Convert.ToDouble(contours.BoundingRectangle.Width) / contours.BoundingRectangle.Height - 1) < 0.3)
    
                                {
    
                                    var numberOfChildren = GetNumberOfChildren(contours);
    
                                    if (numberOfChildren == 0) continue;
    
                                        rect.Add( contours.GetMinAreaRect());
    
                                }
    
                            rect.Sort((t1, t2) => t2.size.Width.CompareTo(t1.size.Width));
    
                            for (var i = 0; i < rect.Count - 1; i++)
    
                            {
    
                                var t = new List<MCvBox2D> {rect[i]};
    
                                for (var j = i + 1; j < rect.Count; j++)
    
                                    if (
    
                                         (Convert.ToDouble(t[t.Count - 1].MinAreaRect().Width) / rect[j].MinAreaRect().Width) >2 &&
    
                                        t[t.Count - 1].MinAreaRect().Contains(rect[j].MinAreaRect()) )
    
                                        t.Add(rect[j]);
    
                                if (t.Count == 2)
    
                                {
    
                                    var r = rect[i];
    
    
                                    var mr =r.MinAreaRect();
    
                                    var sr = new Rectangle(Convert.ToInt32(r.center.X - mr.Width*2),
    
                                        Convert.ToInt32(r.center.Y - mr.Height*2), mr.Width*4, mr.Height*4);
    
                                    if (sr.Width<emguimage.Width/5 && sr.Left >= 0 && sr.Top >= 0 && sr.Right < emguimage.Width && mr.Bottom < emguimage.Height)
    
                                    {
    
    
                                       rectange.Add(sr);
    
                                        try
    
                                        { 
    
                                         using(  var cut = emguimage.GetSubRect(sr))
    
                                        using (   var cutsize = cut.Resize(300, 300, INTER.CV_INTER_LINEAR))
    
                                        using (var bitmap = cutsize.ToBitmap())
    
                                        {
    
                                            var re = _qr.Decode(bitmap);
    
                                            if (re != null)
    
    
                                                _codes.Add(new result
    
                                                {
    
                                                    points =
    
                                                        re.ResultPoints.Select(
    
                                                            y => new PointF(sr.X + Convert.ToInt32(y.X / 300.0 *cut.Width), sr.Y + Convert.ToInt32(y.Y / 300.0* cut.Height)))
    
                                                            .ToList(),
    
                                                    text = re.Text
    
                                                });
    
                                        }
    
                                        }
    
                                        catch (Exception ex)
    
                                        {
    
    
                                        }
    
                                    }
    
    
                                }
    
                            }
    
                    }

    post-5717-0-28793900-1401820058_thumb.pn


  12. хмм помниться я делал проект на C#, который имел тип webproject или как то так, смысл всего лишь был в том, чтобы интерфейс был через браузер, а не через winforms, и мне приходилось его каждый раз компилировать чтобы запустить, хотя по идее надо было и можно было к нему обращаться по сети.

    а чем плоха та форма что вы сделали? что тогда значит клиентская часть?

    webproject нужно публиковать на IIS, по сути это просто dllка, да и asp.net приложение для azure тоже dllка. Когда вы запускали это проект в визуал студии она запускала локальный аналог iis и крутила там ваш сайт.

    Под клиентом я имел ввиду приложение под андроид( как в проекте который описан на хабре) или винду которое бы отправляло пост запрос и получало ответ.

    "а чем плоха та форма что вы сделали".Да ничем не плоха, я просто смотрел что за зверь такой azure. Облачное распознавание номеров пока никому не нужно.


  13. Смотрю я на видео этих трекеров и голове крутится мысль, что из этого можно получить карту глубины. Если принять за факт что фон статичный и скорость камеры известна то по динамике расстоянию между точками можно вычислить расстояние до них. Есть чисто практическая задача: летит квадрокоптер (видео и скорость по осям есть, управление с компа) натыкается на ветку и разбивается, собственно задача вычислить расстояние до ближайшей "ветки" что бы такого больше не проиходило.


  14. Самый просто путь это asp.net те кто с ним знакомы напишут серверную часть за пол часа. Создается control(для начало можно изменить фиолетовый)который принимает post запрос с файлом и вьюшку которая будет показывать результат. у меня все серверная часть выглядит так

      
    
    public ActionResult Index(HttpPostedFileBase file)
    
    {
    
    if (file != null && file.ContentLength > 0)
    
                    {
    
    ....вызов распознавания из .net библиотеки 
    
    передача результата во вьюшку
    
       ViewData.Add("Verification", vs);
    
                         ViewData.Add("number", text);
    
                         w.Stop();
    
                         ViewData.Add("time", w.ElapsedMilliseconds);
    
                         up = true;
    
              };
    
              ViewData.Add("upload", up);
    
                return View("Result");
    
            }

    Библиотека может быть не только на C#, а любая .net в том числе и С++ CLR. но если библиотека не .net то вместо обращения к библиотеке можно запустить любой exeшник в виде процесса передав ему фотографию. Ну или можно запустить отдельно программку которая сканируется папочку и когда находит новый файл обрабатывает его и записывает результат в тоже в файл, а asp.net просто сохраняет файл и ждет пока появится результат.

    Клиентскую часть я не делал ограничился простой вьюшкой.

    post-5717-0-18167400-1400700041_thumb.jp


  15. Для видео но наложением результатов обработки.

    и зачем растягивать методами opencv? можно же просто выделять рект в памяти и кидать на форму.
    я под .net пишу там такое можно сделать только через костыли. А ресайз средствами opencv потому что если это делать средствами самого .net то время самого ресайза вырастает до 100мс. возможно это косяк .net и в с++ такого нет.

    Мы выводили именно через Direct3D: создавали D3D surface, лочили его и копировали туда

    а какое у вас время копирования было?


  16. да я сейчас directx пробую, сам вывод при любом размере как входного так и выходного(размер окна) изображения порядка 1мс что радует. Но вот копирование из iplimage в формат directx при 720p уже порядка 7мс.


  17. Заметил что стандартный gdi+ метод вывода через picturebox жутко медленный даже если зумить или растягивать кринку методами opencv. Собственно интересно кто как выводит картинку и какой способ самый быстрый(только под винду).


  18. Тестирую Canny на OpenCL (2.4.9) и результаты никуда не годятся:

    в 4 раза медленнее cuda

    в 6 раз медленнее простой Cpu реализации при том что в варианте OpenCL грузятся все ядра.

    По начало грешил на .net врапер но проверил на с++ и результаты те же. Это opencl(конктретно Canny) в opencv настолько убог или я что то не так делаю?

×