Jump to content
Compvision.ru

Leaderboard

  1. Smorodov

    Smorodov

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


    • Points

      561

    • Content count

      3,819


  2. mrgloom

    mrgloom

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


    • Points

      242

    • Content count

      2,302


  3. Nuzhny

    Nuzhny

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


    • Points

      234

    • Content count

      1,411


  4. BeS

    BeS

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


    • Points

      53

    • Content count

      349



Popular Content

Showing most liked content since 12/03/2010 in Posts

  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
    Реализовал измеритель пульса по изображению с камеры (pdf-ка в архиве с исходниками). Работает не очень устойчиво (думаю из-за того что переключаются каналы разделенные при помощи ICA), но при удачном исходе на разложении Фурье виден острый четкий пик. Предлагаю желающим поэксперименировать Там встроен детектор лица, но и так работает Исходники (используются: OpenCV и Eigen): HeartRateMeasure.rar UPD: добавил комментариев и немного подправил исходники. Только что откопал интересный ресурс по теме: http://people.csail.mit.edu/mrub/vidmag/ с исходниками на MATLAB и видеороликами (обязательно посмотрите ). И еще исходники на питоне: https://github.com/thearn/webcam-pulse-detector
  20. 2 points
    Преамбула В пору своей молодости (2005 год) я поступил в аспирантуру, где параллельно с работой занимался разработкой детектора движения для цифровой системы видеонаблюдения. К науке охладел довольно быстро, диссертация оказалось слабой и, как следствие, я её не защитил. В то же время вышла первая версия CUDA, которая хорошо подходила для задач вычитания фона и вообще обработки видео. Я не упустил это событие и попробовал реализовать детектор кроме С++ ещё и на CUDA. Ну и в те давние времена OpenCV был достаточно сырым и слаборазвитым. Поэтому я его не использовал совсем, а получившийся алгоритм превосходил всё имеющееся в OpenCV на тот момент. Что получилось? Вот что получилось. Получился достаточно быстрый детектор, который в то время показывал достаточное качество и скорость. Я решил выложить наработки тех лет: и исходники, и пару статей, и недописанную диссертацию. Вдруг, кому-то будет интересно. Для запуска требуется CMake, Linux|Windows и OpenCV 3.0 (исключительно для захвата видео и вывода результатов). Документации пока нет совсем, комментарии по вполне понятным причинам написаны на русском. CUDA включается опцией в CMake, работоспособность не проверял (точно работало на CUDA 1.0). Есть опции для всякой разной отладки, вывода дополнительных окошек, пока не документированы. P.S. Если кто-то захочет запустить у себя и не получится - пишите сюда или на bitbucked, помогу. Если нужны будут консультации по коду и/или алгоритмам - аналогично. Общее впечатление по алгоритму можно составить на основании статей. Планов на будущее особо нет, возможно буду отшлифовывать, добавлю реализацию на OpenCL - всё для целей исключительно ознакомительных и для показа потенциальным работодателям.
  21. 2 points
    Что касаемо этого метода, то вот ловушка.
  22. 2 points
    Изначальная задача собрать некий базис 3д моделей по которым потом будут строится промежуточные? Есть non-rigin ICP, т.е. взять некую 1 базовую модель и фитить её потом на облако точек, но думаю явно будут проблемы когда рот открывается и когда сильная мимика. http://www.hao-li.com/teaching/geometricComputingSeminar/IntroductionToNonRigidRegistration.pdf http://resources.mpi-inf.mpg.de/deformableShapeMatching/EG2011_Tutorial/slides/2.3%20Non-Rigid%20Registration.pdf http://lgg.epfl.ch/publications/2008/sgp2008GCO.pdf еще отсюда http://lgg.epfl.ch/publications.php http://lgg.epfl.ch/publications/2014/2d3dRegistration/index.php еще тут можно посмотреть много интересного http://www.pointclouds.org/blog/all.php секция Statistical Face Model как раз связана с вашей первой ссылкой не совсем в тему но есть еще такая штука как http://grail.cs.washington.edu/projects/dynamicfusion/papers/DynamicFusion.pdf
  23. 2 points
    Свежая бесплатная книжка по глубоким сетям: http://www.iro.umontreal.ca/~bengioy/dlbook/version-07-08-2015/dlbook.html
  24. 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 но не очень понятно чем это помогает
  25. 2 points
    Я в своё время следил за Дропбоксом, участвовал в их акциях - расширил бесплатное место до 8.5 Гбайт. Со скрипом, но хватает. В любом случае, это не проблема, всегда можно найти подходящий сервис. А на счёт удобной организации книг надо подумать... Docear - что-то похожее на то, что хочется.
  26. 2 points
    Покажу на первом примере - libavcodec. Набираешь в консоли: apt-cache search libavcodec В результатах находишь необходимое: libavcodec-dev - Development files for libavcodec Его и ставим: sudo apt-get install libavcodec-dev Установилось, снова запускаем ./configure Пишет, что всё нормально? Отлично! Переходим к следующему пункту. Возможно, что все зависимости можно и не ставить, просто не будет некоторых функций, я не проверял. Когда ты будешь распространять свою программу в бинарном виде в виде пакета, тебе надо будет указать в зависимостях всё необходимое. apt-get это доставит. Если не пакетом будешь распространять, то напиши установочный скрипт, в котором всё прописано и само поставится. В общем, действуй по аналогии с другим софтом.
  27. 2 points
    Я соорудил один прототипчик: исходники пока не выкладываю, пока не ясен статус проекта (скорее всего позже открою). По видео в общем ясно как работает Есть открытый вопрос по подгонке плотной 3D сетки по стандартной ASM-овской модели (например xm2vts). С минимальными искажениями головы. Я думаю использовать для этого собственный базис 3d сеток головы, но пока не реализовал. Может этот велосипед где-то завалялся? Или есть какие то другие предложения/критика? ЗЫ: Собственно с этим вопросом был связан мой недавний интерес к нейронному газу и самоорганизующимся структурам. Может их здесь применить? ЗЫЗЫ: Читаю книжку по этой теме (интересная кстати книжка ): Daoudi M., Srivastava A., Veltkamp R. (Eds.). 3D Face Modeling, Analysis and Recognition (вроде в ней должен быть ответ на интересующий меня вопрос)
  28. 2 points
    Попробуй Intraface прикрутить: там 49 особых точек, остальные я думаю можно интерполяцией расставить. IntraFace предалагает либу для некоммерческого использования, есть демка, идет под винду и линукс, зависит от OpenCV. Когда-то на меня сильно произвел впечатление ролик . Но ничего подобного я сделать не мог и инструментная база была похуже.
  29. 2 points
    OpenCV - Accelerated Computer Vision using GPUs ( во вторник, 11 июня, с 21 до 22 часов по московскому времени) Регистрация здесь : https://www2.gotomeeting.com/register/686845850 Я зарегался.
  30. 2 points
    Добавлю: http://blog.csdn.net/zouxy09/article/details/8550952
  31. 2 points
    Насколько я знаю, дескриптор - это некоторое описание точки изображения. То есть существует точка, координаты которой мы задаем произвольно или находим при помощи автоматического метода (например детектором Харриса). Но, нам нужно эту точку снабдить дополнительной биркой, по которой мы можем отличать ее от других аналогичных точек. Поэтому считаем дескриптор в этих координатах. Все дескрипторы использует окружение точки (соседние пиксели), но по-разному. Так вот HOG, это всего лишь способ вычисления дескриптора, по своей идее аналогичный SURF, SIFT, FAST и т.д. Гистограмма градиентов идет как дополнительная инфа к точке, а как Вы ее считаете (квадратиками или кружочками) дело уже третье. Почему это используется в детекторе? Потому что к яркости точки (1 параметр) добавляется еще описание контекста, в котором встречается эта точка (еще N параметров). Если дескриптор подобран правильно, то наличие дополнительных параметров (дополнительных измерений пространства параметров) существенно повышает наши шансы разделить классы. Вот тут еще почитайте: http://ru.wikipedia.org/wiki/%D0%93%D0%B8%D1%81%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0_%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%B3%D1%80%D0%B0%D0%B4%D0%B8%D0%B5%D0%BD%D1%82%D0%BE%D0%B2 http://courses.graphicon.ru/files/courses/cg/2012/lectures/cg2012_04_recognition.pdf http://www.nada.kth.se/utbildning/grukth/exjobb/rapportlistor/2012/rapporter12/matute_arribas_victoria_12016.pdf PS: Есть еще T-HOG для детекта текстовых областей (pdf-ки и исходники на java): http://www.dainf.ct.utfpr.edu.br/~rminetto/projects/thog.html
  32. 2 points
    В readme написано: ------------------------------------------------------------ Quick start ------------------------------------------------------------ After unzipping: 1) Go to matlab_code directory 2) Run mono_slam.m по-моему параметров там не нужно, все вбито в скрипт. Программа нужна для вычисления перемещения камеры (6 координат) по последовательности изображений. Вот видео программы тех же авторов.
  33. 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
  34. 2 points
    Набросал программку для генерирования положительных примеров для createsamples. Пока не приделал удаление разметки и не сделал чтобы сама директорию positives создавала, поэтому её надо создать самостоятельно в директории с экзешником. Надеюсь в этой теме доведем ее до ума. Пока тестировал только с камерой, но с видео-файлами тоже должна работать. 1) Запускаем - начинается видео с камеры (если запущено без параметров) 2) нажимаем 's' на тех кадрах которые хотите дернуть, как надергаете достаточно, нажимаете 'q'. 3) размечаете мышкой (точки можно двигать), и переходите между кадрами клавишами 'o' и 'p' при выходе из программы сделанная работа сохраняется. Для того, чтобы перейти к ближайшему не размеченному кадру надо нажать 'l' (если вперед) или 'k' (если назад). Как закончите размечать опять 'q'. Это выкинет Вас из программы. При выходе сохраняется файл annotations.yaml - это прогресс в работе, и файл positives/info.dat - это файл для createsamples. Скрин: Исходник аннотатора: objectmarker.cpp
  35. 2 points
    Всем привет! Решил заняться стерео зрением. Нашел в сети такой проект на OpenCV: http://code.google.com/p/opencvstereovision/ даже удалось скомпилить его) exe во вложении. Поигрался с программой пытался калибровать шахматной доской но результат мягко говоря неочень... Раньше ни когда этим не занимался сразу возникло несколько вопросов. Какое расстояние должно быть между камерами? Как они должны быть направлены? (какой угол примерно) (ехе требует библиотеки OpenCV 1.1 и библиотеки Qt если в сети не найдете выложу ) OpenCV-Qt-StereoCalibration.rar
  36. 2 points
    допустим для GetReal1D(CvArr*,int id1), выдает значение типа double, которое находиться по номеру id1 К примеру, IplImage* image = cvLoadImage("test.jpg", CV_8U); cvGetReal2D(image, 1, 1); выведет значение яркости в пикселе(1,1) 3D соответственно для трехмерного
  37. 2 points
    Мне думается каскады Хаара не будут здесь хорошо работать. Они работают с серыми тонами, а Вы сами по серой фотке всегда легко определите где небо а где земля Детектор Хаара хорошо использовать там, где явно присутствует четкая форма объекта и можно выделить среднее изображение и его вариации. А у неба или земли среднее изображение одинаковые (серый фон). Так что можете попробовать, конечно, но думаю достаточной точности не добьетесь. Лучше уж текстурная сегментация (фильтрами Габора например). Я пробовал, траву в лесу сегментирует вполне сносно. Правая кнопка - помечаем кусочек одного класса, левая кнопка - помечаем кусочек другого класса, r - обучаем и сегментируем. Можно отделить обучение и сегментацию. Обучиьт SVM, сохранить её в файл, а затем когда надо сегментировать считать её и применить к картинке. GaborSegmentation.zip
  38. 2 points
    До этого был метод простых итераций Здесь приведен Метод Ньютона: void main(void) { // считаем u,v по x,y // здесь все очевидно double k1=2e-4; double k2=3e-4; double c1=100.0; double c2=120.0; double x= 10; double y= 20; /*double u= c1+x+k1*((x)*(x)+(y)*(y))*(x); double v= c2+y+k2*((x)*(x)+(y)*(y))*(y);*/ double u= x+k1*((x-c1)*(x-c1)+(y-c2)*(y-c2))*(x-c1); double v= y+k2*((x-c1)*(x-c1)+(y-c2)*(y-c2))*(y-c2); cout << u << endl; cout << v << endl; // Вычисление x,y по u,v // выразили x и y через известные и самих себя // и крутим цикл пока не сойдется. double x_prev=0,y_prev=0; double delta=DBL_MAX; int iter=0; for(;delta>DBL_EPSILON;) { double t1 = x - c1; double t2 = t1 * t1; double t3 = y - c2; double t4 = t3 * t3; double deltax = (k1 * (t2 + t4) * t1 + x - u) / k1 / t3 / t1 / 0.2e1; t2 = pow(x - c1, 0.2e1); t3 = y - c2; t4 = t3 * t3; double t6 = k2 * (t2 + t4); double deltay = (t6 * t3 + y - v) / (0.2e1 * k2 * t3 * t3 + t6 + 0.1e1); x=x-deltax; y=y-deltay; //cout << deltax << endl; delta=sqrt(pow((deltax),2)+pow((deltay),2)); iter++; //cout << delta << endl; } cout << x << endl; cout << y << endl; getchar(); }[/code]
  39. 2 points
    Наткнулся на один занятный кусок кода для экспериментов с получением качественного изображения высокого разрешения (пример восстановленного изображения ниже) по набору изображений низкого разрешения (пример одного из исходных изображений ниже) Для сравнения, результат линейной интерполяции: Собственно код: SuperResolution.cpp Программа сама себе генерирует набор из 16 маленьких изображний, портит их шумом, а затем восстанавливает. Ссылки на сайт-источник и на документ по которому все это делается внутри исходника. В качестве задач практического применения: рассмотреть номер автомобиля, лицо, или предмет, который так не виден, но есть последовательность кадров камеры. Видео-демка:
  40. 2 points
    Лекториум В частности, по компьютерному зрению: 1. Компьютерное зрение и библиотека OpenCV 2. Семантическая классификация изображений 3. Оптимизация энергии в задачах компьютерного зрения и алгоритмы на графах И ещё много чего интересного
  41. 2 points
    Не использовать глобальные переменные, использовать константные указатели для неизменяемых объектов и т.п. полезные рекомендации, которые помогают избегать непонятных глюков. Например: int SmoothTresholdFunc(const IplImage* image1, IplImage* image2) { cvSmooth(image1, image2, CV_MEDIAN, 3, 3, 0, 0); cvThreshold(image2, image2, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); cvSaveImage("test_crop2.jpg", image2, 0); return 1; } int main() { IplImage* src = cvLoadImage(path, CV_LOAD_IMAGE_GRAYSCALE); IplImage* dst = cvCreateImage(cvGetSize(src), src->depth, src->nChannels); SmoothTresholdFunc(src, dst); cvSaveImage("test_crop.jpg", dst, 0); cvReleaseImage(&dst); cvReleaseImage(&src); return 0; }
  42. 2 points
    бета-версия редактора , и почему это тема больше не моя??
  43. 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 что больше нравится.
  44. 2 points
  45. 2 points
    Есть уже написанный код, который работает со структурой IplImage, это раз, а во-вторых - в целях повышения образованности. Нашел как преобразовать. cv::Mat frame; IplImage img ((IplImage)frame); cvSaveImage(fileNameSave,&img);
  46. 2 points
    Решил вопрос попиксельным копированием (вроде не очень грузит проц.) результатом вполне доволен. вот код: // OpenCVFont.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "opencv2/opencv.hpp" #include <ft2build.h> #include FT_FREETYPE_H FT_Library library; FT_Face face; /* handle to face object */ using namespace cv; // all the new API is put into "cv" namespace. Export its content using namespace std; //----------------------------------------------------------------------- void my_draw_bitmap(Mat& img,FT_Bitmap* bitmap,int x,int y) { for(int i=0;i<bitmap->rows;i++) { for(int j=0;j<bitmap->width;j++) { unsigned char val=bitmap->buffer[j+i*bitmap->pitch]; if(val!=0) { img.at<Vec3b>(i+y,j+x)=Vec3b(val,val,val); } } } } //----------------------------------------------------------------------- void PrintString(Mat& img,std::wstring str,int x,int y) { FT_Bool use_kerning=0; FT_UInt previous=0; use_kerning = FT_HAS_KERNING( face ); float prev_yadv=0; float posx=0; float posy=0; float dx=0; for(int k=0;k<str.length();k++) { int glyph_index = FT_Get_Char_Index( face, str.c_str()[k] ); FT_GlyphSlot slot = face->glyph; /* a small shortcut */ if(k>0){dx=slot->advance.x/64; } FT_Load_Glyph( face, glyph_index, FT_LOAD_DEFAULT ); FT_Render_Glyph (slot,FT_RENDER_MODE_NORMAL); prev_yadv=slot->metrics.vertAdvance/64; if ( use_kerning && previous && glyph_index ) { FT_Vector delta; FT_Get_Kerning( face, previous, glyph_index, FT_KERNING_DEFAULT, &delta ); posx += (delta.x/64); } posx+=(dx); my_draw_bitmap(img,&slot->bitmap,posx+x+ slot->bitmap_left,y - slot->bitmap_top+posy ); previous = glyph_index; } } //----------------------------------------------------------------------- int _tmain(int argc, _TCHAR* argv[]) { FT_Init_FreeType( &library ); FT_New_Face( library,"arial.ttf",0,&face ); FT_Set_Pixel_Sizes(face,40,0); FT_Select_Charmap(face, FT_ENCODING_UNICODE); Mat img(480,640,CV_8UC3); PrintString(img,L"Привет!",100,100); cv::imshow("win",img); cv::waitKey(0); return 0; }
  47. 2 points
    А зачем лишние копирования памяти? Пусть каждый дочерний поток полностью копирует заголовок изображения и делает ему SetImageROI size_t num_threads = boost::thread::hardware_concurrency(); В общем случае: clock() Если можно использовать WinAPI, то число вариантов возрастает. Например: QueryPerfomanceCounter или GetThreadTimes.
  48. 2 points
    http://www.vision.ee.ethz.ch/~gallju/projects/houghforest/index.html http://graphics.cs.msu.ru/en/science/research/machinelearning/hough детектирование движения людей. Hough Forests for Object Detection
  49. 2 points
    Ура, получилось! =) Разобрался с матрицами проекций и все встало на свои места. Сейчас попробую все расписать подробно. Дано: вебкамера 1 шт, доска шахматная калибровочная 1 шт. Надо: определить положение соответствующих ключевых точек в 3Д пространстве сцены. Еще раз уточню, что задачу я упростил, мне не нужно получать внешние параметры камеры из ключевых точек, у меня есть доска. =) Получается следующий алгоритм: 1) Калибруем камеру при помощи доски (этот пример как раз есть в книжке по OpenCV: стандартная связка cvFindChessboardCorners->cvFindCornerSubPix->cvCalibrateCamera2 в гугле по этим функциям находится куча страничек всяких индусов и китайцев, которые перепечатали и успешно откомпилили код из книжки и очень по этому поводу радуются ) - получаем матрицу внутренних параметров камеры (intrinsic) и коэффициенты искажения (distCoeffs). Сохраняем их в xml. Калибровку делаем один раз для одной камеры (если не использовали зум). 2) Используем cvUndistort2 для устранения искажений изображения с камеры. 3) Делаем два снимка, перемещая камеру, из них мы и будем получать наши трехмерные координаты. 4) В функцию cvFindExtrinsicCameraParams2 передаем новые координаты точек доски для первого и второго изображения и внутренние параметры камеры (камера у нас одна, так что параметры одинаковые, будем называть их матрицей K). Получаем rvecs и tvecs - векторы вращения и перемещения для каждого нового положения камеры. 5) Используем cvRodrigues2(rvecs,rmat,NULL); получаем матрицу вращения камеры размерностью 3х3. До этого пункта мне все было понятно и вчера, проблемы появились дальше. 6) Необходимо получить матрицу проекции P для каждого из двух изображений. По определению m = P*M, где m = [x,y,1]^T - координаты точки на изображении в пикселях, а M = [X,Y,Z]^T - координаты точки в трехмерном пространстве сцены. Так вот, матрица P в том виде, что нам нужна, получается так: P = K*Pcam, где К - матрица внутренних параметров камеры, а Pcam = [rmat | tvecs] размерностью 3х4. 7) Если передать полученные значения в функцию cvTriangulatePoints из OpenCV 2.2, то она вернет вполне корректные координаты точки в трехмерном пространстве сцены. Я чуть-чуть переписал свою функцию, так что она теперь получает и возвращает такие же параметры, как и cvTriangulatePoints. //CvMat* projPoints1 = cvCreateMat(2,N,CV_32FC1); // Массив координат точек на первом изображении в пикселях виде матрицы: // | x1 x2 ... xN | // | y1 y2 ... yN |, N - количество точек //CvMat* projPoints2 = cvCreateMat(2,N,CV_32FC1); // Соответствующие точки:: на втором изображении //CvMat* projMatr1 = cvCreateMat(3,4,CV_32FC1); //Матрица проекции для первого изображения //CvMat* projMatr2 = cvCreateMat(3,4,CV_32FC1); //Матрица проекции для второго изображения //CvMat* points4D = cvCreateMat(4,N,CV_32FC1); // output - получаем массив координат точек в трехмерном пространстве сцены в виде матрицы: // | X1 X2 ... XN | // | Y1 Y2 ... YN | // | Z1 Z2 ... ZN | // | W1 W2 ... WN |, N - количество точек, W - масштабный множитель или как-то так он называется void TwoViewTriangulation(CvMat *projMatr1, CvMat *projMatr2, CvMat *projPoints1, CvMat *projPoints2, CvMat *points4D) { CvMat* A = cvCreateMat(4,4,CV_64F); CvMat* Anorm = cvCreateMat(4,4,CV_64F); CvMat* U = cvCreateMat(4,4,CV_64F); CvMat* D = cvCreateMat(4,4,CV_64F); CvMat* Vt = cvCreateMat(4,4,CV_64F); for (int n = 0; n < projPoints1->cols; n++) { for (int i = 0; i < 4; i++) { cvmSet(A,0,i, cvmGet(projPoints1,0,n) * cvmGet(projMatr1,2,i) - cvmGet(projMatr1,0,i)); cvmSet(A,1,i, cvmGet(projPoints1,1,n) * cvmGet(projMatr1,2,i) - cvmGet(projMatr1,1,i)); cvmSet(A,2,i, cvmGet(projPoints2,0,n) * cvmGet(projMatr2,2,i) - cvmGet(projMatr2,0,i)); cvmSet(A,3,i, cvmGet(projPoints2,1,n) * cvmGet(projMatr2,2,i) - cvmGet(projMatr2,1,i)); } cvNormalize(A, Anorm, 1, 0, CV_L2, NULL); cvSVD(Anorm, D, U, Vt, CV_SVD_MODIFY_A || CV_SVD_V_T); // A = U D V^T cvmSet(points4D,0,n, cvmGet(Vt,0,3)); cvmSet(points4D,1,n, cvmGet(Vt,1,3)); cvmSet(points4D,2,n, cvmGet(Vt,2,3)); cvmSet(points4D,3,n, cvmGet(Vt,3,3)); } } 8) Чтобы получить реальные координаты в масштабе сцены, нужно все координаты X, Y, Z разделить на W. Пока проверил на координатах точек доски, расчетные довольно точно совпадают с реальными (ну, примерно совпадают - уже хорошо ). Пойду другие ключевые точки доставать и испытывать. Как только напишу функцию, которая из фундаментальной матрицы получает корректные матрицы проекций для камеры, то доска больше будет не нужна. Обязательно сюда тогда добавлю.
  50. 2 points
    На одном китайском сайте, нашел пример вывода в 3d, disparity image Для лучшего эффекта предварительно нормализуем изображение imageDepthNormalized = cvCreateMat( imageSize.height,imageSize.width, CV_8U ); cvScale(imageDepth, imageDepthNormalized, 1, 256); Программа, исходник и картинка во вложении, картинку берет из "c:\z.bmp" glut3d.rar
×