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

trinka

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

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

  • Посещение

  • Days Won

    1

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


  1. сейчас работаю с видео 640-480 25фпс. есть возможность заснять пару фоток на высоком разрешении (1280), для того чтобы получить более точную матрицу гомографии. саму матрицу могу полчить(на 1280). как ее следует преобразовать, чтобы она выполняла тоже преобразование, но для низкого разрешения(640)?


  2. кажется я нашел в чем проблема. эх оупнсиви какой-то глючный, во всяком случае нелогичный :(

    при использовании rowRange возвращаемый рез-т картинка - просто указатель на подматрицу исходной картинки. об этом сказано в справке. ну ок.

    при этом матрица становится "непоследовательной". т.е. ф-ия isContinuous() возвращает 0. вот тут то и глючит вывод на форму. для bitmap нужно посл-ную картинку.

    даже после копирования картинки вот так

    imageToHomography = imageToHomography.rowRange(fitoffset.y, fitoffset.y+fitoffset.height-1);

    imageToHomography непоследовательный. (хотя выглядит как нормальное копирование).

    решается примерно так

    imageToHomography = localimage.rowRange(fitoffset.y, fitoffset.y+fitoffset.height-1).clone();

    сейчас вроде бы не глючит. надеюсь я и правда нашел этот баг, а не то даже не знаю как это еще можно лечить))

    • Like 1

  3. imageToHomography = imageToHomography.rowRange(fitoffset.y, fitoffset.y+fitoffset.height-1);

    imageToHomography = imageToHomography.colRange(fitoffset.x, fitoffset.x+fitoffset.width-1);//если убрать эти 2 строки, все работает

    //параметры корректные

    this->VidArea->Height = image->rows;//VidArea это pictureBox

    this->VidArea->Width = image->cols;

    try

    {

    Bitmap^ b = gcnew Bitmap(image->cols, image->rows, image->step,

    PixelFormat::Format24bppRgb, IntPtr(image->data));//здесь бывает исключение

    this->VidArea->Image = b;

    }


  4. предлагаю закрепить тему.

    как правильно копировать часть изображения? использую Mat. я использую rowRange, colRange, но есть проблема: картинки, полученные таким образом, не всегда хотят отображаться (вывожу на форму clr.net). то есть часть картинок показывается, часть нет (исключение при вызове конструктора Bitmap). пробовал operator() (Rect) - та же фигня. может неправильно так копировать? не забываю перед выводом делать копию картинки(в любом случае это не должно влиять)


  5. чоткий совет, сработало, спасибо)

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

    кстати как избавиться от тормозов при плохом освещении?


  6. кто знает какой параметр преобразования использовать в ф-ии Image ^img = gcnew Bitmap(frame.cols, frame.rows, frame.step, PixelFormat::Format24bppRgb, IntPtr(frame.data));

    а именно PixelFormat для CV_8U? пробовал PixelFormat::Format8bppIndexed, но израбоажение какое-то испорченное, но в принципе показывается. может его нужно как-то преобразовать?


  7. такая трабла: запускаю первый раз эту программу(ниже), все нормально. перезапускаю-видео тормозит(около 5к/с). чтобы все было опять нормально, запускаю vmcap(шла на диске с дровами), там меняю разрешение(на максиамльное, если на любое другое-не сработает), отключаю ее. теперь моя программа 1 раз поработает без тормозов. потом нужно опять повторять итерацию.

    #include <highgui.h>

    #include <cv.h>

    int main()

    {

    CvCapture *capture = cvCreateCameraCapture(0); // Думаю тут всё понятно

    if(capture == NULL) // Если камер не обнаружено - выходим

    return 0;

    IplImage *frame = NULL; // Кадр

    cvNamedWindow("camera", CV_WINDOW_AUTOSIZE); // Окошко

    while(1)

    {

    frame = cvQueryFrame(capture); // Получаем кадр, так же как и из видео файла

    cvShowImage("camera", frame); // Выводим

    char c = cvWaitKey(33); // Ждём

    if(c == 27)break; // Если Esc - выходим

    }

    cvReleaseCapture(&capture);

    return 0;

    }

    это пример работы с opencv.

    как это лечится???

    подчеркнутая строка - которая жрет много времени на втором этапе.

    глюк и на debug, и на релизе(пишу в vs2010), opencv 2.3.1


  8. Что это значит для компьютера?

    Попробуйте определить это строго.

    по задаче пол является одноцветным. нужно выделить всю плоскость пола. для компьютера это понятное дело не определить никак. оценивает человек.

    дело в другом. я опытным путем подобрал параметры для изображений, но они работают не для всех изображений: если слишком темно/светло сегмент пола определяется неверно. для "средних" по яркости, контрастности алгоритм отрабатывает хорошо. и я понимаю, что комп всегда может ошибиться, в программе будет возможность пользователю "подкрутить ползунок".

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


  9. нужно согласовать параметры meanshift с парамтерами картинки так, чтобы сегментация выполнилась качественно за 1 раз . если не получается, что-то поменять, и за 2-3 уж точно.

    т.е. все картинки приводить к каким-то параметрам яркости, контрастности и уже для них подобрать параметры meanshift.

    эквализация делает не совсем то, мне кажется.


  10. что-то не понимаю что означают пороги у этой функции?

    немного поигрался, мне кажется рез-т намного хуже чем у meanshift.

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

    но это конечно гораздо круче чем то что я предлагал делать dilate :)

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


  11. эта сегментация очень медленная. к тому же на границах появляются много "несегментированных" пикселей. watershed требует предварительных маркеров.

    возможно нужна предобработка? я делал blur (5). можно ли применить ее на серое изображение? (не получилось)


  12. дело в том, что по задаче граница не должна охватывать площади с узким горлышком(положим, 10 пискелей). dilate как раз и объеденяет линии(реально существующие, но не уловленные детектором границ), и объединяет близко расположенные границы(с узким горлышком).

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

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

    как вариант, использовать findcontours, и там все просто. позже попробую


  13. при применении детектора границ Кении не всегда выделаются все границы (рис1).

    post-4987-0-87395500-1332668129_thumb.jp

    тогда я решил использовать dilate в несколько итераций(рис2) как видно, пол определился относительно нормально.

    post-4987-0-06431800-1332668135_thumb.jp

    теперь нужно применить erode так, чтобы изменения, привнесенные dilate, были устранены: линии стали тоньше.

    но erode не дает нужного эффекта(рис3).

    post-4987-0-87983200-1332668139_thumb.jp

    мне нужно чтобы после erode оставалась линия толщиной минимум в 1 пиксель. тогда все будет камильфо.

    что же делать?

    возможно есть другие подходы?


  14. нда ребят, не привык думать универский мозг!

    задача то тривиальная. из точки проводим 360 прямых(через каждый градус) и находим ближайшую к точке точку пересечения с границами. далее строим ломаную. можно увеличить число прямых в n раз чтобы увеличить точность.

    но тем не менее жду еще возможных альтернативных вариантов.


  15. Есть результат детектора границ Кенни (как на картинке)

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

    затем нужно выделить прямые линии(ну это я преобразованием хаффа я думаю смогу). (желтая)

    поиск начинается с голубого креста.

    post-4987-0-68471300-1328350230_thumb.jp

    post-4987-0-62639700-1328350237_thumb.jp

×