Jump to content
Compvision.ru

Leaderboard

  1. Smorodov

    Smorodov

    Главные администраторы


    • Points

      575

    • Content count

      3,869


  2. mrgloom

    mrgloom

    Пользователи


    • Points

      242

    • Content count

      2,302


  3. Nuzhny

    Nuzhny

    Пользователи


    • Points

      241

    • Content count

      1,427


  4. BeS

    BeS

    Пользователи


    • Points

      53

    • Content count

      349



Popular Content

Showing most liked content since 12/03/2010 in all areas

  1. 4 points
    Вышла еще одна книжка (см. №3) и я решил для удобства собрать эти книжки вместе: 1)"Learning OpenCV. Computer Vision in C++ with the OpenCV Library. 2nd Edition" http://shop.oreilly.com/product/0636920022497.do Благородная попытка перевода ее на русский язык первого издания этой книги: http://locv.ru/wiki/%D0%93%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 2)"OpenCV 2 Computer Vision Application Programming Cookbook" ссылка на исходный код на сайте http://www.laganiere.name/opencvCookbook/ 3)"Mastering OpenCV with Practical Computer Vision Projects" очень интересные проекты с исходниками. http://www.packtpub.com/cool-projects-with-opencv/book исходники здесь: https://github.com/MasteringOpenCV/code Еще одна книжка с opensouce исходниками: Practical OpenCV By Samarth Brahmbhatt Список книг по Opencv от opencv.org: http://opencv.org/books.html Еще бесплатная книжка: "Modern Robotics with OpenCV" здесь: http://www.sciencepublishinggroup.com/book/B-978-1-940366-12-8.aspx
  2. 4 points
    Кому интересно, написал довольно шуструю вычиталку фона(пока только последовательная версия, до распараллеливания пока руки не дошли) основанную на алгоритме VIBE с оберткой для использования в OpenCV. Оригинальная статья: http://orbi.ulg.ac.be/bitstream/2268/145853/1/Barnich2011ViBe.pdf Мои исходные коды: https://github.com/BelBES/VIBE
  3. 4 points
    Привет всем! Вот, попытался сделать пример вывода видео на форму. И, думаю, получилось Для того, что-бы скопировать IplImage в объект .NET типа Image, достаточно всего лишь одной строки: #include <opencv/cv.h> #include <opencv/highgui.h> ... using namespace System; using namespace System::Windows::Forms; using namespace System::Drawing::Imaging; using namespace System::Drawing; ... IplImage *iplImg; ... // Копирование IplImage в объект .NET типа Image Image ^image = gcnew Bitmap(iplImg->width, iplImg->height, iplImg->widthStep, PixelFormat::Format24bppRgb, IntPtr(iplImg->imageData)); ... или, с использованием класса Mat: cv::Mat imgMat; // Копирование cv::Mat в объект .NET типа Image Image ^img = gcnew Bitmap(imgMat.cols, imgMat.rows, imgMat.step, PixelFormat::Format24bppRgb, IntPtr(imgMat.data)); Чтобы вывести изображение на компоненту PictureBox, достаточно следующей строки в одном из методов вашей формы: this->pictureBox1->Image = image; Если вам нужен HBITMAP, то получить его можно следующим образом: Bitmap ^image = gcnew Bitmap(iplImg->width, iplImg->height, iplImg->widthStep, PixelFormat::Format24bppRgb, IntPtr(iplImg->imageData)); HBITMAP hb = (HBITMAP)image->GetHbitmap().ToPointer(); У меня вышеприведенные примеры отлично работают с OpenCV 2.2 в Visual Studio 2008/2010. К сообщению прилагаю проект простого видео плеера, написанного с помощью OpenCV 2.2 в Visual Studio 2008. Он может воспроизводить все типы видео, которые берет OpenCV и видео, захваченное с видеокамеры. Не судите строго за возможные несовершенства в коде Просто, я старался, что бы были основные функции плеера. Пояснения к проекту. Компиляция: Чтобы успешно скомпилировать проект, достаточно в опциях Visual Studio установить пути на OpenCV в следующем виде: %OPENCV_HOME%\include и %OPENCV_HOME%\lib Например, так: C:\OpenCV2.2\include и C:\OpenCV2.2\lib Другое: При создании проекта использовались следующие опции и установки. .NET Framework 3.5. General/Common Language Runtime Support: Common Language Runtime Support (/clr) C/C++/Advanced/Disable Specific Warnings: 4996;4793 Linker/Input/Additional Dependencies: opencv_core220d.lib opencv_highgui220d.lib opencv_imgproc220d.lib opencv_objdetect220d.lib Для версии Release: без "d" после 220. В компоненте PictureBox свойство SizeMode имеет значение Zoom, что позволяет сохранить оригинальное соотношение сторон кадра. Для визуализации кадров используется Tick таймера. При двойном щелчке по области отображения, происходит переход в полноэкранный режим и обратно. Надеюсь, пример кому-нибудь пригодится VideoOnForm.zip
  4. 4 points
    Здравствуйте, решил заняться переводом книги "Learning OpenCV", перевёл уже 37 глав. Присоединяйтесь будем переводить вместе! - http://locv.ru
  5. 3 points
    проект здесь: FaceDetect.rar дополнительные классификаторы (нос, глаза, рот, тело):HaarClassifiers.rar здесь еще куча каскадов: Каскады хаара
  6. 3 points
    Самокодный вариант AdaBoost. (Виолы и Джонса там нет , только AdaBoost ) Надеюсь оформлю статью по нему, но и в листинге старался разместить побольше комментариев. AdaBoost.cpp И ссылка на мою презентацию по детекту лиц там тоже есть немного пояснений по теме: http://www.compvision.ru/forum/index.php?app=core&module=attach&section=attach&attach_id=369
  7. 3 points
    Наконец-то дошли руки Оптимизации не делал, просто проверил идею. Пример кода максимизирует расстояние между средним цветом внутри и снаружи прямоугольной области. Максимизирует он это расстояние при помощи подбора параметров этого прямоугольника (методом градиентного спуска). Вот что я имел ввиду, когда говорил непонятные вещи Результат работы программы (изображение может быть и цветным): #include "opencv2/opencv.hpp" #include <vector> using namespace std; using namespace cv; //---------------------------------------------------------- // Это и есть вычисление расстояния между средними цветами //---------------------------------------------------------- double getLikelihood(Mat& img,cv::RotatedRect& rr) { double likelihood=0; Mat mask=Mat::zeros(img.size(),CV_8UC1); // rotated rectangle Point2f rect_points[4]; rr.points( rect_points ); vector<cv::Point> pts(4); for(int i=0;i<4;++i) { pts[i]=rect_points[i]; } cv::fillConvexPoly(mask,pts,Scalar::all(255)); imshow("mask",255-mask); Scalar cc1,cc2; cc1=cv::mean(img,mask); cc2=cv::mean(img,255-mask); likelihood=norm(cc1,cc2,cv::NORM_L2); return likelihood; } //---------------------------------------------------------- // Градиент, чтобы знать куда менять параметры //---------------------------------------------------------- void getLikelihoodGradient(Mat& img,cv::RotatedRect& rr,cv::RotatedRect& drr) { cv::RotatedRect rrdx=rr; rrdx.center.x+=1; cv::RotatedRect rrdy=rr; rrdy.center.y+=1; cv::RotatedRect rrdw=rr; rrdw.size.width+=1; cv::RotatedRect rrdh=rr; rrdh.size.height+=1; cv::RotatedRect rrdang=rr; rrdang.angle+=1; cv::RotatedRect rrdxn=rr; rrdxn.center.x-=1; cv::RotatedRect rrdyn=rr; rrdyn.center.y-=1; cv::RotatedRect rrdwn=rr; rrdwn.size.width-=1; cv::RotatedRect rrdhn=rr; rrdhn.size.height-=1; cv::RotatedRect rrdangn=rr; rrdangn.angle-=1; float l0=getLikelihood(img,rr); cout << l0 << endl; float dlx=getLikelihood(img,rrdx)-getLikelihood(img,rrdxn); float dly=getLikelihood(img,rrdy)-getLikelihood(img,rrdyn); float dlw=getLikelihood(img,rrdw)-getLikelihood(img,rrdwn); float dlh=getLikelihood(img,rrdh)-getLikelihood(img,rrdhn); float dlang=getLikelihood(img,rrdang)-getLikelihood(img,rrdangn); float scale=sqrt(dlx*dlx+dly*dly+dlw*dlw+dlh*dlh+dlang*dlang); dlx/=scale; dly/=scale; dlw/=scale; dlh/=scale; dlang/=scale; drr.center.x=dlx; drr.center.y=dly; drr.size.width=dlw; drr.size.height=dlh; drr.angle=dlang; } //---------------------------------------------------------- // Генерируем тестовое зашумленное изображение //---------------------------------------------------------- void generateTestImage(Mat& img) { img=Mat(512,512,CV_8UC3); cv::RotatedRect rr(cv::Point2f(200,300),Size(140,180),67); img=Scalar::all(0); // rotated rectangle Point2f rect_points[4]; rr.points( rect_points ); vector<cv::Point> pts(4); for(int i=0;i<4;++i) { pts[i]=rect_points[i]; } cv::fillConvexPoly(img,pts,Scalar(255,255,255)); for(int i=0;i<100000;++i) { int x=rand()%512; int y=rand()%512; img.at<Vec3b>(y,x)=Vec3b(255,255,255); } for(int i=0;i<105000;++i) { int x=rand()%512; int y=rand()%512; img.at<Vec3b>(y,x)=Vec3b(0,0,0); } } //---------------------------------------------------------- // //---------------------------------------------------------- int main(int argc, char* argv[]) { Mat img,img_cpy; generateTestImage(img); imshow("testimg",img); cv::waitKey(0); cv::RotatedRect rr(cv::Point2f((float)img.cols/2.0,(float)img.rows/2.0),Size(img.cols-100,img.rows-100),0); cv::RotatedRect drr; while(1) { img_cpy=img.clone(); getLikelihoodGradient(img,rr,drr); // Меняем параметры в сторону увеличения расстояния между средними цветами rr.center+=drr.center; rr.size+=drr.size; rr.angle+=drr.angle; // rotated rectangle Point2f rect_points[4]; rr.points( rect_points ); for( int j = 0; j < 4; j++ ) { line( img_cpy, rect_points[j], rect_points[(j+1)%4], Scalar(0,255,0), 2, CV_AA ); } imshow("img_cpy",img_cpy); waitKey(10); } cv::destroyAllWindows(); return 0; }
  8. 3 points
    2 Nuzhny Результаты сравнения по скорости собирал 4-2 года назад (потом стало лень) на этой странице (смотреть от где-то от середины и все постскрипты). Сравнивал с пятью чужими программами (вернее, с опубликованными в печати или в интернете временами расчётов - исходник-то был доступен всего для одной из этих 5 программ). Сравнивал ориентировочно - с учётом прикидок о разнице в быстродействии моего и других процессоров. Исходников не открываю, демку где-то в те годы на сайте предложил сделать-дать только тому, кто придёт с тяжёлым проектом и гарантирует отдачу проекта в мои руки после того, как демка всё заявленное (как скорость, так и просто надёжность-работоспособность) продемонстрирует. По потреблению памяти - у меня на копейки больше, т.к. все данные обрабатываемого примера (именно одного текущего примера) и внутренние сигналы/веса сети оптимально раскладываются с учётом выравнивания блоков данных на границу параграфа. Ну и в коде 1.5 ноу-хау - одно чисто моё (на удивление - почему-то нигде и никем ранее не опубликованное) о самом шустром варианте распараллеливания обучения нейросети (вообще без синхронизаций потоков на уровне операционной системы), второе - об аппроксимированном вычислении нелинейности нейрона (которое опубликовано, но почему-то никто об этом не знает и на практике не применяет). И сейчас реализованы пара канонических вариантов свёрточных сеток (ЛеКуновский и Симардовский), а также другие её клоны (от Эндрю Нг, Свена Бенке) - вернее, из разных слоёв-кубиков можно собирать свой/новый вариант. Также у нейронов можно ставить полиномиальные сумматоры - не на всех слоях свёрточной сети это помогает/полезно, но если помогает - то точность растёт. Я так даже самого Хинтона опроверг - он в прошлом году говорил, что на задаче MNIST на обычном персептроне никто никогда не опустился ниже 1.6% ошибок, а я таки постановкой полиномиальных сумматоров только на вых.слой получил точность лучше (см последний абзац тут) (хотя сам Хинтон в 1986г в двухтомнике PDP описывал формулы обратного распространения ошибки в том числе и для полиномиальных сумматоров - но вот почему-то сам не пользуется сейчас сигма-пи нейронами в своих сетях, может быть, зря).
  9. 3 points
    покопавшись в исходниках можно найти для себя несколько заготовок, таких как построение 3d модели лица, его трекинг и даже ( на начальном этапе ) вычисление значения фильтров габора в ключевых точках этой модели. может кому пригодиться... трекинг работает весьма быстро для одного человека, но я по быстрому переделал под свои цели для двоих. в основе детектирования ключевых точек - Flandmark_detector, трекинга - headtracker-master. (лиценция которых GNU GPL, для тех кого это вообще интересует). должно даже собраться и заработать (под ubuntu писалось) Написано на С++, есть куски на С. для работы нужна opencv2.4.4 lndmark.tar.gz
  10. 3 points
    Соорудил быстрый и маленький кусочно-аффинный варпер (перенос фрагмента изображения из одной сетки треугольников в другую): WarpAffine.rar
  11. 3 points
    Слайды одной из моих лекций. Детектор лиц на основе метода Виолы-Джонса.rar
  12. 3 points
    Так случилось, что я активно использую Delphi в своей работе (программирование по работе, собственные открытые и закрытые проекты) и вот мне понадобилось написать программу, использующую открытую библиотеку компьютерного зрения OpenCV. Что же делать, ведь официально OpenCV использовать в Delphi невозможно, а перебираться на C ради одной программы слишком долго. Но нет ничего невозможного… Немного поискав в интернете, я нашел несколько проектов по использованию OpenCV в Delphi. Первый, второй, третий и наиболее свежий и удачный — четвертый, который я и взял за основу. Проект на github мне показался интересным, реализовано много функций OpenCV, есть много примеров на Delphi, но проект заброшен автором и пришлось взяться за свой. Все текущие наработки я выложил на code.google.com/p/opencv-delphi-new/ В настоящий момент сделано: 1. Поддержка RAD Studio XE3. 2. Добавлены новые функции: cvFlip, cvClearMemStorage, cvCreateChildMemStorage, cvRectangle, cvRetrieveFrame, cvIntegral, cvGetPerspectiveTransform, cvWarpPerspective, cvCreateMat, cv2DRotationMatrix, cvWarpAffine, cvFindContours, cvHaarDetectObjects. 3. Добавлено 6 новых примеров: FaceDetect — Пример детектирования лица в видеопотоке с использованием преобразования Хафа. FindContours — Нахождение контуров изображения. Integral — Интегральное изображение. WarpAffine — Трансформация изображения — аффинные преобразования (Поворот изображения на произвольный угол). WrapPrespective — Трансформация изображения — гомография (Перспективная трансформация). MatchShapes — Поиск объекта на изображении по шаблону (Сравнение объектов по моментам их контуров). В добавленных примерах я постарался подробно расписать все манипуляции для достяжения нужного результата. Если кому-то будет интересна тема использования OpenCV в Delphi, то пишите мне на email или оставляйте комментарии. Если тематика использования OpenCV в принципе интересна, то могу написать несколько статей, только напишите, какое направление использования OpenCV Вас интересует.
  13. 3 points
    Полезный сайт по теории: http://courses.graphicon.ru/ Материал по ASM и AAM: http://courses.graphicon.ru/files/courses/smisa/2008/lectures/lecture10.pdf
  14. 3 points
    И еще проект ( активные контуры (ASM) переделанный (на чистый OpenCV 2.X) мной проект одного китайца, который переделал его из STASM ): В архиве конвертер моделей STASM в файл с матрицами OpenCV, и солюшн для студии с двумя проектами: библиотекой и демкой. Надеюсь на дальнейшее развитие проекта. ASMCompvisionEdition.rar
  15. 3 points
    Где-то есть деление на ноль. Смотри свои данные.
  16. 3 points
    Привет. В общем вот выкладываю перевод с БИЛДЕРА на ВИЖУАЛ (кстати недавно совсем переводил), "Создание APIшного битмапа из интеловского RGB изображения" присутствует. Смотри, разбирайся. Если, что не пойдет пиши - разберемся. [Прикрепленный файл был потерян при откате форума]
  17. 3 points
    Здравствуйте, RinOS. Рекомендую все-таки использовать cvStereoRectify() т.к. результат его работы более точен, а cvStereoRectifyUncalibrated() лучше использовать когда существуют значительные непараллельности в оптических осях камер, насколько я понимаю. Критерием правильности калибровки стерео может служить правильное число в векторе T (который означает расстояние между оптическими осями по оси x, y и z) камер. У меня, при расстоянии между камерами 12 см, и 29 калибровочных пар изображений 640х480 в оттенках серого (изображения я сохраняю предварительно в bmp, чтобы каждый раз не мучаться с их показом камерам) величина составляет: цитирую xml содержимое <data>-1.1886876922892217e-001 -7.8263643755714435e-004 -4.6620003758508491e-003</data>, (все величины в метрах - первая величина - это сдвиг по оси X, то есть расстояние между камерами). То есть 1.6 %, что может быть точнее измерянного мною расстояния. Чем шире расстояние между камерами, тем лучше будет восприятие на более дальних расстояниях, и тем хуже будет поле зрения камеры, при обзоре близких предметов. Для того чтобы величина вектора T содержала метрические величины, необходимо, чтобы вы правильно (в метрических единицах) указали размер клеточки при калибровке. В книге learning OpenCV, в примере стерео (стр 445), есть константа squareSize, у меня в коде примерно так (размер клетки 3 см): float chesbSquareSize = 0.030f; // 30 mm is a Square size for (size_t pair_idx = 0; pair_idx < boards_count; pair_idx++) { for (size_t i=pair_idx*board_n,j = 0;j < board_n; ++i,++j) { // Chessboard points CV_MAT_ELEM(*image_pointsL,float,i,0) = vCalibData[IMG_LEFT][pair_idx].vPoints[j].x; CV_MAT_ELEM(*image_pointsL,float,i,1) = vCalibData[IMG_LEFT][pair_idx].vPoints[j].y; CV_MAT_ELEM(*image_pointsR,float,i,0) = vCalibData[IMG_RIGHT][pair_idx].vPoints[j].x; CV_MAT_ELEM(*image_pointsR,float,i,1) = vCalibData[IMG_RIGHT][pair_idx].vPoints[j].y; // Linear space remapping points CV_MAT_ELEM(*object_points,float,i,0) = (float)(j/w) * chesbSquareSize; CV_MAT_ELEM(*object_points,float,i,1) = (float)(j%w) * chesbSquareSize; CV_MAT_ELEM(*object_points,float,i,2) = 0; }; CV_MAT_ELEM(*point_counts,UINT,pair_idx,0) = (UINT)board_n; }; Откалиброванные матрицы удобно сохранять в xml. Для того, чтобы калибровка была корректной, рекомендуют использовать "шахматную доску" с не одинаковым кол-вом клеток по ширине и высоте (я заметил вы такую и использовали). Для улучшения качества BlockMatcher'а, попробуйте BMState->uniquenessRatio = 0; Привожу мои рабочие параметры: BMState->preFilterSize = 17; BMState->preFilterCap = 31; BMState->SADWindowSize = 11; BMState->minDisparity = 13; BMState->numberOfDisparities = 256; BMState->textureThreshold = 35; BMState->uniquenessRatio = 0; Искомую матрицу репроекции Q вы можете заполнить вручную по формуле Q= стр 435 Learn OpenCV, используя ранее вычисленные матрицы: CameraMatrix и T, например.. но мне кажется это сложный путь, и ... некоторые величины (f, n) придется выдумывать. Вот набросал матрицу, которую вы можете использовать, подставив лишь расстояние между объективами камер: Но я не уверен, что она даст для вас точный и качественный результат. f можно уменьшить вовсе до 5 метров. Если вы вызовете cvStereoRectify() то наверняка ничего не потеряете, по книге инных вариантов не приводится. Матрицу Q нельзя извлечь из cvStereoRectifyUncalibrated() поскольку (стр 431): То есть, теоретически, если вы при калибровке, задавали реальные метрические координаты (с помощью размера) ваших клеточек, то на выходе ReprojectTo3D проекции получите реальные размеры и расстояния до объекта в метрах. Насколько я понимаю, disparityImage должен быть Float(существует быстрый вариант с Int). Подавать нужно disparityImage не нормализованный. Репроекцией еще сам не занимался, поэтому грабли раскрыть в этой теме пока не могу (может на этих выходных, тогда я бы отписался здесь). Прикрепляю свою шахматную доску (visio), может пригодится.
  18. 2 points
    Интересная статейка с примерами: http://habrahabr.ru/blogs/google/117234/ и тут: http://ab-log.ru/smart-house/speech/speech-recognition
  19. 2 points
    Ищи контуры и закрашивай те, площадь которых меньше некоторого порога
  20. 2 points
    7 Изменить размер гораздопроще чем Вы думаете. Чип сенсора как стоял в плоскости физического фокуса так и стоит. Просто отключаются не используются пиксели с края сенсора. Это сделать просто изменив приделы счётчика который перебирает пиксели камеры во время чтения. Когда как масштабирование требует заблюрить соседние пиксели и произвести децимацию оставив к примеру через один каждый второй пиксель. Вот только обычно масштабирование идёт не кратно 2 а через дробные значения к 3/2. Что требует уже усложнения чипов камеры. Так вот при изменении используемой области камеры меняется угол обзора. В математической модели это приводит к изменению математического фокуса. Известно что бочкообразые и подушкообразные искажения определяются параметрами линзы k1, k3 (внутренние параметры камеры) а они в свою очередь зависят от математического фокуса камеры, то они тоже уплывут.
  21. 2 points
    Гомография же задаёт в общем случае перспективное преобразование. В этом случае, между плоскостями двух снимков есть 2 угла: поворота и наклона. И они, кажется, связаны друг с другом. Если мы имеем дело с аффинным преобразованием, то да - у нас есть один угол поворота и всё.
  22. 2 points
    Да, именно последнее. Если посмотретьна результаты трекинга одного объекта в VOT 2018, то в победителях уже сиамские нейросети. У них свои недостатки, например, их реалтайм - это реалтайм на GT 2080 Ti, что совсем грустно. Реализаций полно на Гитхабе, например тут и тут.
  23. 2 points
  24. 2 points
    http://www.pvsm.ru/net/274725 - моя публикация с открытым исходным кодом на C#
  25. 2 points
    Добрый день. Наткнулся на интересный тренажер для БПЛА. Кто-то уже пробовал? https://github.com/Microsoft/AirSim По поводу генерирования датасета говориться следующее: С виду этот LogViewer не имеет ничего полезного для автоматического аннотирования сцены. И вообще не понятно, возможно ли вытащить аннотированые изображения из тренажера.
  26. 2 points
    Нашел интересный список: http://avisynth.nl/index.php/Image_Processing_Algorithms
  27. 2 points
    Спасибо! Именно это помогло! Кому нужно - в репозитории имеется около 3к идеально размеченных автоматом данных (больший объем пока не делал) А что с настройками обучения? Оставить все по дефолту? 40к итераций хватит? если у меня будет 10-30к изображений для тренировки? Как выявить наилучший результат при тренировке? https://github.com/Maxfashko/CamVid
  28. 2 points
    Есть вот такая интересная функция, я стащил её у китайцев и адаптировал к opencv Картинка для неё: motion_fuzzy_lena.bmp Подозреваю что для других картинок надо настраивать параметры ( int A = 80;int B = 10; и Общее расстояние сдвига const int nTotLen=10; ). Но как пока не разобрался. В пояснениях было написано, что устраняет размытие от прямолинейного равномерного движения. Результат работы: bool cvMotionRestore(IplImage* Src,IplImage* Dst) { BYTE * lpSrc; //Размеры изображения LONG lWidth=Src->width; LONG lHeight=Src->height; // Изображение количество байтов в строке LONG lLineBytes=Src->widthStep; LPBYTE lpDIBBits; lpDIBBits=(LPBYTE)Src->imageData; //Переменная цикла long iColumn; long jRow; int i,n,m; //Временные переменные int temp1,temp2,totalq,q1,q2,z; double p,q; // Назначение коэффициентов int A = 80; int B = 10; //Общее расстояние сдвига const int nTotLen=10; // Ширина изображения содержит число длин сдвига ntotlen int K=((float)lLineBytes/(float)nTotLen); int error[nTotLen]; for (jRow = 0; jRow < lHeight; jRow++) { // Вычислить error[i] for(i = 0; i < nTotLen; i++) { error[i] = 0; for(n = 0; n < K; n++) for(m = 0; m <= n; m++) { // пиксель начале строки if(i == 0 && m == 0) { temp1=temp2=0; } // дифференциальный оператор else { lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + m*nTotLen+i; temp1=*lpSrc; lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + m*nTotLen+i-1; temp2 = *lpSrc; } error[i] = error[i] + temp1 - temp2; } error[i] = B * error[i] / K; } for(iColumn = 0; iColumn < lLineBytes; iColumn++) { m = iColumn / nTotLen; z = iColumn - m*nTotLen; totalq = 0; q = 0; for(n = 0; n <= m; n++) { q1 = iColumn - nTotLen*n; if(q1 == 0) {q = 0;} // дифференциальный оператор else { q2 = q1 - 1; lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + q1; temp1 = *lpSrc; lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + q2; temp2 = *lpSrc; q = (temp1 - temp2) * B; } totalq = totalq + q; } p = error[z]; // Получить значения f(x,y) temp1 = totalq + A - p; // Результат к диапазону 0-255 if(temp1 < 0) temp1 = 0; if(temp1 > 255) temp1 = 255; Dst->imageData[lLineBytes*jRow + iColumn] = temp1; } } return true; } [/code]
  29. 2 points
    Можно попробовать семантическую сегментацию, DeepLab дает неплохие результаты при сегментации людей... з.ы. 50к изображений человеков? Может быть, если имеется возможность, вы поделитесь такой базой с общественностью?
  30. 2 points
    Свежая бесплатная книжка по глубоким сетям: http://www.iro.umontreal.ca/~bengioy/dlbook/version-07-08-2015/dlbook.html
  31. 2 points
    про интерпретацию HOG http://web.mit.edu/vondrick/ihog/ Visualizing Object Detection Features by Carl Vondrick http://web.mit.edu/vondrick/mthesis.pdf http://web.mit.edu/vondrick/ihog/iccv.pdf Exploring the representation capabilities of the HOG descriptor про интерпретацию CNN тут есть про deconvolution aka convolution transpose http://www.robots.ox.ac.uk/~vedaldi/assets/teach/2015/vedaldi15aims-bigdata-lecture-4-deep-learning-handout.pdf тут еще слайд 4 (3 метода) http://places.csail.mit.edu/slide_iclr2015.pdf но не очень понятно чем это помогает
  32. 2 points
    Взял класс отсюда и приделал к OpenCV. http://ivrg.epfl.ch/supplementary_material/RK_SLICSuperpixels/index.html Дальше хочу перевести его на opencv-шные функции, но для экспериментов и так годится. (неплохо только бы еще порядок байтов при перегоне в ARGB перепроверить) Документ с описанием: SLIC_Superpixels_TR_2.pdf Солюшн для 2010-й студии: OpenCV_HW.rar Результат работы программы: Может работать и с видео (я пока не пробовал):
  33. 2 points
    Сам не люблю магию , я за интеллект. K-means хороший вариант. Вот еще самообучающийся алгоритм (главный параметр, это количество цветов int NrGMMComponents = 8 ): #include <opencv2/opencv.hpp> #include "opencv2/ml/ml.hpp" #include <vector> #include <list> #include <iostream> using namespace cv; using namespace std; void main(void) { // Количество кластеров (сколько разных цветов будет на конечном изображении) int NrGMMComponents = 8; // Имя исходного файла string fname="D:\\ImagesForTest\\passport.jpg"; cv::Mat SampleImg = imread(fname,1); cv::GaussianBlur(SampleImg,SampleImg,Size(3,3),1); int SampleImgHeight = SampleImg.rows; int SampleImgWidth = SampleImg.cols; // Набираем точки данных vector<Vec3d> ListSamplePoints; for (int y=0; y<SampleImgHeight; y++) { for (int x=0; x<SampleImgWidth; x++) { // Собираем точки с изображения Vec3b bgrPixel = SampleImg.at<Vec3b>(y, x); uchar b = bgrPixel.val[0]; uchar g = bgrPixel.val[1]; uchar r = bgrPixel.val[2]; if(rand()%25==0) // Берем не все точки подряд, а по равномерной выборке (примерно каждую 25-ую) { ListSamplePoints.push_back(Vec3d(b,g,r)); } } // for (x) } // for (y) // Формируем матрицу обучающих данных int NrSamples = ListSamplePoints.size(); Mat samples( NrSamples, 3, CV_64FC1 ); for (int s=0; s<NrSamples; s++) { Vec3d v = ListSamplePoints.at(s); samples.at<double>(s,0) = (float) v[0]; samples.at<double>(s,1) = (float) v[1]; samples.at<double>(s,2) = (float) v[2]; } // Напишем что нибудь по-английски. cout << "Learning to represent the sample distributions with " << NrGMMComponents << " gaussians." << endl; cout << "Started GMM training" << endl; cv::EM em_model; // Параметры алгоритма em_model.setInt("covMatType",cv::EM::COV_MAT_GENERIC); em_model.setInt("nclusters",NrGMMComponents); em_model.setInt("maxIters",1500); em_model.setDouble("epsilon",0.001); Mat labels(NrSamples,1,CV_32SC1); Mat logLikelihoods( NrSamples, 1, CV_64FC1 ); // Выполнение алгоритма обучения em_model.train( samples,logLikelihoods,labels); cout << "Finished GMM training" << endl; // Изображение, на котором будет отображаться результат Mat img = Mat::zeros( Size( SampleImgWidth, SampleImgHeight ), CV_8UC3 ); // Опрос классификатора для каждого пикселя Mat sample( 1, 3, CV_64FC1 ); Mat means; means=em_model.getMat("means"); for(int i = 0; i < img.rows; i++ ) { for(int j = 0; j < img.cols; j++ ) { Vec3b v=SampleImg.at<Vec3b>(i,j); sample.at<double>(0,0) = (float) v[0]; sample.at<double>(0,1) = (float) v[1]; sample.at<double>(0,2) = (float) v[2]; int response = cvRound(em_model.predict( sample )[1]); img.at<Vec3b>(i,j)[0]=means.at<double>(response,0); img.at<Vec3b>(i,j)[1]=means.at<double>(response,1); img.at<Vec3b>(i,j)[2]=means.at<double>(response,2); } } img.convertTo(img,CV_8UC3); imshow("result",img); waitKey(); // Сохраним в файл результат cv::imwrite("result.png", img); } [/code] Результат для 8 цветов: и для двух цветов: Дальше можно морфологию сделать (dilate, erode, см. выше) чтобы строчки слить в прямоугольные области. Затем найти контуры, габаритные прямоугольники и вынуть строки. Или сильно размываем ([code]cv::GaussianBlur(SampleImg,SampleImg,Size(3,3),1); заменяем на cv::GaussianBlur(SampleImg,SampleImg,Size(15,15),5);) затем кластеризуем (в примере 2 кластера), получим нечто в духе такого: И никакой магии
  34. 2 points
    Ну вот тут вроде решили эту проблему используя boost'овые треды.
  35. 2 points
    AAM по инверсно-композитному алгоритму (octave и C++ исходники): https://code.google.com/p/octaam/ Интересные работы по AAM: http://www2.isr.uc.pt/~pedromartins/ 3D модель лица и некоторые заготовки: http://aifi.isr.uc.pt/Downloads.html Облачная распознавалка лиц: http://en.faceplusplus.com/
  36. 2 points
    Могу поделиться материалом, матлабовские файлы (работает, проверял), pdf-ки, и проект для студии (перевод с МАТЛАБА я его так и не добил) Matlab-вариант: https://docs.google.com/file/d/0Bxk3hR536PxSeng1WGFVYVpWcWs/edit?usp=sharing Взят вроде отсюда (уже не помню): http://openslam.org/ekfmonoslam.html С++ вариант и pdf-ки https://docs.google.com/file/d/0Bxk3hR536PxSUVJBdjZXeGZwTkU/edit?usp=sharing
  37. 2 points
    Набросал программку для генерирования положительных примеров для createsamples. Пока не приделал удаление разметки и не сделал чтобы сама директорию positives создавала, поэтому её надо создать самостоятельно в директории с экзешником. Надеюсь в этой теме доведем ее до ума. Пока тестировал только с камерой, но с видео-файлами тоже должна работать. 1) Запускаем - начинается видео с камеры (если запущено без параметров) 2) нажимаем 's' на тех кадрах которые хотите дернуть, как надергаете достаточно, нажимаете 'q'. 3) размечаете мышкой (точки можно двигать), и переходите между кадрами клавишами 'o' и 'p' при выходе из программы сделанная работа сохраняется. Для того, чтобы перейти к ближайшему не размеченному кадру надо нажать 'l' (если вперед) или 'k' (если назад). Как закончите размечать опять 'q'. Это выкинет Вас из программы. При выходе сохраняется файл annotations.yaml - это прогресс в работе, и файл positives/info.dat - это файл для createsamples. Скрин: Исходник аннотатора: objectmarker.cpp
  38. 2 points
    Все спасибо разобрался, для перевода есть утилита convert_cascade.exe
  39. 2 points
    Всем привет! Решил заняться стерео зрением. Нашел в сети такой проект на OpenCV: http://code.google.com/p/opencvstereovision/ даже удалось скомпилить его) exe во вложении. Поигрался с программой пытался калибровать шахматной доской но результат мягко говоря неочень... Раньше ни когда этим не занимался сразу возникло несколько вопросов. Какое расстояние должно быть между камерами? Как они должны быть направлены? (какой угол примерно) (ехе требует библиотеки OpenCV 1.1 и библиотеки Qt если в сети не найдете выложу ) OpenCV-Qt-StereoCalibration.rar
  40. 2 points
    Для начала от Стэнфорда: Machine Learning и Probabilistic Graphical Models. Там есть ещё (см. внизу страницы), но эти по нашей тематике. Кроме того, 20 февраля начинаются: PROGRAMMING A ROBOTIC CAR и BUILDING A SEARCH ENGINE Программировать надо будет на Питоне. Кто-нибудь записался? P.S. Жаль, что на всё не хватит ни времени, ни сил.
  41. 2 points
    Адаптировал (перевел с C старого стандарта, и добавил поддержку векторов) код безье сплайна по заданным точкам. Исходный код с которого адаптировал и много других интересных вещей есть здесь: http://www.graphicsgems.org/ код здесь: Bezier.zip
  42. 2 points
    Нашел одну статью: K-d дерево строится по следующему правилу: • начальное множество разбивается по значениям векторов в одной из координат, например, по i = 1,…k, на два подмножества; • i выбирается таким образом, чтобы разброс значений по данной координате был максимальным; • разбиение проводится по медиане m, так что одинаковое количество точек оказывается с одной и с другой стороны; • в вершине дерева хранятся значения i , m, разброс значений векторов по каждой координате; • для полученных вершин процесс повторяется. Для поиска n ближайших соседей к вектору q в построенном дереве: • сначала дерево обходится вниз до листа содержащего «ближайшую» к q точку. Эта точка не обязана быть ближайшей, это только первое приближение; • во время спуска по дереву заполняется список поддеревьев, которые еще не обходили. Также запоминаются расстояния до них, которое определяется как минимальное расстояние от точки q до любой точки, находящейся в границах значений поддерева; • из списка выбираем ближайшее к q поддерево и продолжаем поиск в нём; • расстояние до каждого нового найденного претендента сравнивается с радиусом сферы найденных точек с центром в точке q. Если данное расстояние меньше, то точку на сфере заменяем этим претендентом. Алгоритм работает до тех пор, пока в списке есть поддеревья с расстоянием, меньшим радиуса сферы найденных точек.
  43. 2 points
    Конечно, помогаем! Первый шаг - отказ от Делфи. Двигаемся дальше?
  44. 2 points
    LosFrom2D, есть ГОСТ скопированный с ISO. Идентификация по расстоянию можно только при условии что расстояние между глазами не менее 180 пикселей, Менее можно но качество будет падать. 3 параметра нос глаза рот. Сколько градаций вы получите? Допустим максимум 4 минимум 2. От 2^3=8 до 4^3=64. Таким методом вы сможете отличить очень малое число людей, на 20 может не хватить. Для увеличения качества системы используют другие параметры. Цвет волос, цвет глаз, форму головы итд. http://protect.gost.ru/v.aspx?control=8&baseC=-1&page=0&month=-1&year=-1&search=&RegNum=1&DocOnPageCount=15&id=120745&pageK=7B46BC9C-241A-48FE-BDF1-06DB1ECBA18C
  45. 2 points
    Неа, в сторону ASM (Active Shape Models), AAM (Active Appearance Models), и прочего подобного... Хаар и Виола с Джонсом Вам помогут локализовать фейс (может быть примерное расположение глаз носа и рта), а распознавать нет. Нужно найти достаточно много и достаточно точно характерные точки лица, сформировать из них вектор, а затем нейросети, SVM, марковские модели, или любые другие классификаторы. Многое есть на форуме. ЗЫ: Для Ваших масштабов, я думаю подойдет пример который уже есть на форуме. http://www.compvision.ru/forum/index.php?showtopic=81 или http://www.compvision.ru/forum/index.php?showtopic=74 что больше нравится.
  46. 2 points
    Думаю, что надо провести небольшой ликбез по поводу OpenCV и работы с видео. OpenCV поддерживает множество способов захвата и записи видео на всевозможных аппаратных и программных платформах. При этом не используются какие-то его внутренние технологии, а задействуются возможности платформы и установленных на ней библиотек. На Windows используются родные Video for Windows (vfw) и DirectShow. Причём vfw используется, начиная с самых ранних версий OpenCV, заканчивая самой последней. Что такое vfw? Это старая технология, корнями уходящяя в Windows 3.1, а то и позже, я тогда в детский сад ходил. Декодеры для vfw сейчас почти не пишутся, вероятность проигрывания или записи файла с помощью vfw очень низка. В OpenCV для этого есть функция cvCreateFileCapture_VFW. DirectShow использовалась в нескольких версиях OpenCV как библиотека VideoInput (см. #ifdef HAVE_VIDEOINPUT CV_CAP_DSHOW, #endif). На сегодня DirectShow является предпочтительным средством работы с видео в Windows. Декодеры и кодеры популярных видеокодеков, как правило, оформляют в виде DirectShow фильтров, плейеры используют их, всевозможные грабберы тоже. Что надо сделать, чтобы задействовать DirectShow в OpenCV? Очевидно, сконфигурировать CMake, установив HAVE_VIDEOINPUT в TRUE. Или самому в файле cvconfig.h найти и установить HAVE_VIDEOINPUT. Теперь перейдём к ffmpeg. Это кроссплатформенная библиотека, которую можно использовать как в Windows, так и в Линуксе. В моей, последней версии OpenCV 2.3.2 ffmpeg задействуется через opencv_ffmpeg.dll. Её надо кидать в папку к своему exe. И, вроде, всё. Во всяком случае при проигрывании файла *.mp4 именно её функции использовались для декодирования видео, глубже в отладчике я не заглядывал. В предыдущих версиях OpenCV мне приходилось совершать серию шаманских действий для задействования ffmpeg. Что ещё? А много чего! XINE = HAVE_XINE + cvCreateFileCapture_XINE GSTREAMER = HAVE_GSTREAMER + cvCreateCapture_GStreamer QUICKTIME = HAVE_QUICKTIME + cvCreateFileCapture_QT AVFOUNDATION = HAVE_AVFOUNDATION + cvCreateFileCapture_AVFoundation И ещё можно найти, если порыскать по исходникам. То есть различные операционные системы, сторонние библиотеки, аппаратные платформы. Всё это можно найти в документации. Надо лишь установить библиотеки и сконфигурировать CMake. И проиграется практически ЛЮБОЙ файл и захватится видео практически с ЛЮБОЙ камеры. Теперь посмотрим как оно работает в OpenCV 2.3.2 (файл cap.cpp): CV_IMPL CvCapture * cvCreateFileCapture (const char * filename) { CvCapture * result = 0; if (! result) result = cvCreateFileCapture_FFMPEG_proxy (filename); #ifdef HAVE_XINE if (! result) result = cvCreateFileCapture_XINE (filename); #endif #ifdef HAVE_GSTREAMER if (! result) result = cvCreateCapture_GStreamer (CV_CAP_GSTREAMER_FILE, filename); #endif #ifdef HAVE_QUICKTIME if (! result) result = cvCreateFileCapture_QT (filename); #endif #ifdef HAVE_AVFOUNDATION if (! result) result = cvCreateFileCapture_AVFoundation (filename); #endif if (! result) result = cvCreateFileCapture_Images (filename); return result; } То есть при проигрывании файла OpenCV пытается по очереди найти доступный декодер из тех, с которыми сконфигурирован CMake. Самая первая попытка - создание cvCreateFileCapture_FFMPEG_proxy. Если ffmpeg не находится, то на Windows вызывается функция cvCreateFileCapture_VFW (её на листинге нет, она находится внутри cvCreateFileCapture_FFMPEG_proxy). И дальше по очереди. Что делать, если файл всё таки не проигрывается? Надо воспользоваться отладчиком. Зайти внутрь функции cvCreateFileCapture и посмотреть какие декодеры вообще задействованы и какие обламываются, хотя должны были бы работать. И, соответственно, посмотреть, почему они обламываются. Это не так сложно. Например, я попытался проиграть, записанный на телефоне, файл *.mp4. ffmpeg не нашёл opencv_ffmpeg.dll, а vfw не захотел его открывать (что логично). Остальные библиотеки у меня не были задействованы. Поэтому я просто закинул opencv_ffmpeg.dll и всё заработало. Если бы потребовалось проиграть QuickTime видео, то необходимо было бы найти в документации способ подключения QuickTime и выставить в cvconfig.h HAVE_QUICKTIME (либо сделать это в CMake - так правильней).
  47. 2 points
    Видеоиллюстрация работы адабуст:
  48. 2 points
    У меня программа вылетала с ошибкой "divizion by zero" на строчке: if( !cvFindHomography( &_pt1, &_pt2, &_h, CV_RANSAC, 5 )) Стал искать причину, обнаружил, что функция naiveNearestNeighbor может возвращать одну и ту же точку сколько угодно раз. То есть, для примера, у нас найдено n особенностей для исходного изображения и 1 особенность для изображения с камеры, тогда эта одна точка почему-то будет считаться парой для всех n точек из шаблона. Скорее всего функция naiveNearestNeighbor не очень верно работает (я с ней особо не разбирался), возможно, необходимо добавить туда еще какой-то порог или изменить существующие параметры. Добавил в функцию findPairs вот такую заглушку: if( nearest_neighbor >= 0 && nearest_neighbor != last_neighbor) { ptpairs.push_back(i); ptpairs.push_back(nearest_neighbor); last_neighbor = nearest_neighbor; } Хотя, все равно иногда вылетает та же ошибка (может быть это проблема борландовского компилятора), так что надо туда просто повесить обработчик ошибок и забить. На всякий случай прикрепляю проект для borland builder 6, вдруг кому-то пригодится. OpenCV SURF.rar
  49. 2 points
    Программа для экспериментов с преобразованием Фурье. Содержит примеры разложения изображения на действительную и мнимую части спектра, и для разложения изображения на амплитудную и фазовую части спектра, а так-же обратные преобразования для обоих типов разложения. На картинке я вырезал кольцо из амплитудной и фазовой составляющей спектра разложения. И провел обратное преобразование. Исходник: FFT.RAR
  50. 2 points
    На одном китайском сайте, нашел пример вывода в 3d, disparity image Для лучшего эффекта предварительно нормализуем изображение imageDepthNormalized = cvCreateMat( imageSize.height,imageSize.width, CV_8U ); cvScale(imageDepth, imageDepthNormalized, 1, 256); Программа, исходник и картинка во вложении, картинку берет из "c:\z.bmp" glut3d.rar
×