Jump to content
Compvision.ru

Leaderboard

  1. Smorodov

    Smorodov

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


    • Points

      569

    • Content count

      3,833


  2. mrgloom

    mrgloom

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


    • Points

      242

    • Content count

      2,302


  3. Nuzhny

    Nuzhny

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


    • Points

      236

    • Content count

      1,415


  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
    Ну сетка это слишком жестко ) Под видео ссылка на гитхаб.
  19. 2 points
    Наткнулся на большой склад интересных алгоритмов с кодом: https://paperswithcode.com/area/computer-vision
  20. 2 points
    Да, именно последнее. Если посмотретьна результаты трекинга одного объекта в VOT 2018, то в победителях уже сиамские нейросети. У них свои недостатки, например, их реалтайм - это реалтайм на GT 2080 Ti, что совсем грустно. Реализаций полно на Гитхабе, например тут и тут.
  21. 2 points
    Интересная статейка с примерами: http://habrahabr.ru/blogs/google/117234/ и тут: http://ab-log.ru/smart-house/speech/speech-recognition
  22. 2 points
    https://github.com/AliMorty/Markov-Random-Field-Project/blob/master/Codes/README.md https://github.com/nicholasjclark/MRFcov https://github.com/xinario/defocus_segmentation
  23. 2 points
    Реализовал измеритель пульса по изображению с камеры (pdf-ка в архиве с исходниками). Работает не очень устойчиво (думаю из-за того что переключаются каналы разделенные при помощи ICA), но при удачном исходе на разложении Фурье виден острый четкий пик. Предлагаю желающим поэксперименировать Там встроен детектор лица, но и так работает Исходники (используются: OpenCV и Eigen): HeartRateMeasure.rar UPD: добавил комментариев и немного подправил исходники. Только что откопал интересный ресурс по теме: http://people.csail.mit.edu/mrub/vidmag/ с исходниками на MATLAB и видеороликами (обязательно посмотрите ). И еще исходники на питоне: https://github.com/thearn/webcam-pulse-detector
  24. 2 points
    Если там скрыта синусоида, то надо делать разложение в ряд Фурье. FFT даст пик на частоте синусоиды. Статейка с Хабра: https://habrahabr.ru/post/219337/ Имел дело с подобными кривыми когда измерителем пульса баловался: HartRateMeasure.zip Работа по которой делал: "Non-contact, automated cardiac pulse measurements using video imaging and blind source separation." легко гуглится.
  25. 2 points
    Нарушил многолетнее молчание и зафигачил новый пост на Хабру про последние достижения науки и техники в области Feature Matching'а: https://habrahabr.ru/post/323688/ Т.ч. кому интересна тема, вэлкам) Критика, пожелания, замечания приветствуются!
  26. 2 points
    Что касаемо этого метода, то вот ловушка.
  27. 2 points
    Насчет комплектуахи, кстати, есть вот такая заметка с описанием оптимального железа для "домашнего" ПК под DL: http://pjreddie.com/darknet/hardware-guide/
  28. 2 points
    Выкладываю свои 9 лекций по машинному обучению это первая редакция, так что не судите строго Если заметите явные косяки - пишите. Lec1.pdf Lec2.pdf Lec3.pdf Lec4.pdf Lec5.pdf Lec6.pdf Lec7.pdf Lec8.pdf Lec9.pdf AdaBoost.pdf (может быть будет еще 4, если руки дойдут) Отличный курс тут (автор Н.Ю. Золотых): Машинное обучение.pdf Кому этого мало, поищите лекции Сергея Николенко и К.В. Воронцова. Если знаете английский, то лучше всего прочитать книгу: Christopher M. Bishop "Pattern Recognition and Machine Learning" и http://www-stat.stanford.edu/~tibs/ElemStatLearn/ Интересный блог по машинному обучению здесь: http://yaroslavvb.blogspot.com/ Очень хороший цикл видео лекций: http://www.youtube.com/user/aktoshik/videos?view=0 Лекции от mathematicalmonk: Много лекций по машинному обучению (англ.): https://alliance.seas.upenn.edu/~cis520/wiki/index.php?n=Lectures.Lectures
  29. 2 points
    Взял класс отсюда и приделал к OpenCV. http://ivrg.epfl.ch/supplementary_material/RK_SLICSuperpixels/index.html Дальше хочу перевести его на opencv-шные функции, но для экспериментов и так годится. (неплохо только бы еще порядок байтов при перегоне в ARGB перепроверить) Документ с описанием: SLIC_Superpixels_TR_2.pdf Солюшн для 2010-й студии: OpenCV_HW.rar Результат работы программы: Может работать и с видео (я пока не пробовал):
  30. 2 points
    http://docs.opencv.org/trunk/modules/objdetect/doc/erfilter.html еще появилось недавно для детектирования текста Scene Text Detection
  31. 2 points
    Я соорудил один прототипчик: исходники пока не выкладываю, пока не ясен статус проекта (скорее всего позже открою). По видео в общем ясно как работает Есть открытый вопрос по подгонке плотной 3D сетки по стандартной ASM-овской модели (например xm2vts). С минимальными искажениями головы. Я думаю использовать для этого собственный базис 3d сеток головы, но пока не реализовал. Может этот велосипед где-то завалялся? Или есть какие то другие предложения/критика? ЗЫ: Собственно с этим вопросом был связан мой недавний интерес к нейронному газу и самоорганизующимся структурам. Может их здесь применить? ЗЫЗЫ: Читаю книжку по этой теме (интересная кстати книжка ): Daoudi M., Srivastava A., Veltkamp R. (Eds.). 3D Face Modeling, Analysis and Recognition (вроде в ней должен быть ответ на интересующий меня вопрос)
  32. 2 points
    Здесь похоже на то что надо : http://www.cse.psu.edu/~yanxi/lattice.pdf http://www.di.ens.fr/~josef/publications/torii13.pdf По первой ссылке есть упоминание исходников, но отправляет в яблочное облако и требует логин с паролем (http://minwoopark.us/MyNewSite/Data_%26_Code/Entries/2011/9/20_Deformed_Lattice_Detector.html). По времени в первой работе упоминается, что матлабовкий вариант работал 8 часов Возможно стоит погуглить по фразам вроде "symmetry group detector".
  33. 2 points
    Добавлю: http://blog.csdn.net/zouxy09/article/details/8550952
  34. 2 points
    Перетащил из LibHand модель руки, проверял под vs2010 x64. Использует движок Ogre, у меня версия 1.9 (устанавливал готовый SDK). Программа генерирует OpenCV-шное изображение трехмерной руки, у которой можно задать углы поворота всех суставов. Можно применять для определения положения руки по моно изображению. LibHand_new.rar С системой рендеринга OpenGL (программа сама ее ищет и выбирает, при наличии) у меня работает реалтайм (может и быстрее, не проверял). Если выбран DirectX, будут тормоза, это в лучшем случае, в худшем падает с ошибкой. Подправил aspect ratio теперь руку не плющит.
  35. 2 points
    Неплохие pdf-ки чтобы начать: http://cs.engr.uky.edu/~jacobs/classes/2010_photo/readings/PoissonImageEditing.pdf http://cs.nyu.edu/fergus/teaching/comp_photo/6_image_blending_compositing.pdf Здесь еще исходники: https://github.com/Siddharthk/CompPhoto-NUIGroup-GSoC-2012
  36. 2 points
    Всем привет! Решил заняться стерео зрением. Нашел в сети такой проект на OpenCV: http://code.google.com/p/opencvstereovision/ даже удалось скомпилить его) exe во вложении. Поигрался с программой пытался калибровать шахматной доской но результат мягко говоря неочень... Раньше ни когда этим не занимался сразу возникло несколько вопросов. Какое расстояние должно быть между камерами? Как они должны быть направлены? (какой угол примерно) (ехе требует библиотеки OpenCV 1.1 и библиотеки Qt если в сети не найдете выложу ) OpenCV-Qt-StereoCalibration.rar
  37. 2 points
    Мне думается каскады Хаара не будут здесь хорошо работать. Они работают с серыми тонами, а Вы сами по серой фотке всегда легко определите где небо а где земля Детектор Хаара хорошо использовать там, где явно присутствует четкая форма объекта и можно выделить среднее изображение и его вариации. А у неба или земли среднее изображение одинаковые (серый фон). Так что можете попробовать, конечно, но думаю достаточной точности не добьетесь. Лучше уж текстурная сегментация (фильтрами Габора например). Я пробовал, траву в лесу сегментирует вполне сносно. Правая кнопка - помечаем кусочек одного класса, левая кнопка - помечаем кусочек другого класса, r - обучаем и сегментируем. Можно отделить обучение и сегментацию. Обучиьт SVM, сохранить её в файл, а затем когда надо сегментировать считать её и применить к картинке. GaborSegmentation.zip
  38. 2 points
    Думаю что это может быт полезно посмотреть: http://vh.icg.tugraz.at/index.php?content=topics/unsupervisedseg.php На сайте есть исходники на матлабе (не такие-уж и большие), плюс автор по просьбе может выслать сишный вариант.
  39. 2 points
    Наткнулся на один занятный кусок кода для экспериментов с получением качественного изображения высокого разрешения (пример восстановленного изображения ниже) по набору изображений низкого разрешения (пример одного из исходных изображений ниже) Для сравнения, результат линейной интерполяции: Собственно код: SuperResolution.cpp Программа сама себе генерирует набор из 16 маленьких изображний, портит их шумом, а затем восстанавливает. Ссылки на сайт-источник и на документ по которому все это делается внутри исходника. В качестве задач практического применения: рассмотреть номер автомобиля, лицо, или предмет, который так не виден, но есть последовательность кадров камеры. Видео-демка:
  40. 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; }
  41. 2 points
    Нашел одну статью: K-d дерево строится по следующему правилу: • начальное множество разбивается по значениям векторов в одной из координат, например, по i = 1,…k, на два подмножества; • i выбирается таким образом, чтобы разброс значений по данной координате был максимальным; • разбиение проводится по медиане m, так что одинаковое количество точек оказывается с одной и с другой стороны; • в вершине дерева хранятся значения i , m, разброс значений векторов по каждой координате; • для полученных вершин процесс повторяется. Для поиска n ближайших соседей к вектору q в построенном дереве: • сначала дерево обходится вниз до листа содержащего «ближайшую» к q точку. Эта точка не обязана быть ближайшей, это только первое приближение; • во время спуска по дереву заполняется список поддеревьев, которые еще не обходили. Также запоминаются расстояния до них, которое определяется как минимальное расстояние от точки q до любой точки, находящейся в границах значений поддерева; • из списка выбираем ближайшее к q поддерево и продолжаем поиск в нём; • расстояние до каждого нового найденного претендента сравнивается с радиусом сферы найденных точек с центром в точке q. Если данное расстояние меньше, то точку на сфере заменяем этим претендентом. Алгоритм работает до тех пор, пока в списке есть поддеревья с расстоянием, меньшим радиуса сферы найденных точек.
  42. 2 points
    Добрый день. Вашему вниманию предлагаю готовый вариант сегментации изображения. Любая критика и советы по улучшению очень очень приветствуются! Использую - cvCreateFGDStatModel , т.е. как я понимаю это называется Adaptive Background Mixture (или Гауссианов Микшер) Полный текст программы прикрепляю к этому посту, дабы не засорять свое сообщение. Также я прикрепляю 2 видео - ОРИГИНАЛ и РЕЗУЛЬТАТ ПРОГРАММЫ. Итак, примерно очерчу алгоритм. -1 получаю изображение с файла -2 ВНИМАНИЕ применяю медианную фильтрацию 9х9 на полученный фрейм оригинала -3 создаю bg_model (функцией, указанной выше) от изображения, полученнного в верхнем пункте (медианно профильтрованного) -4 получаю два изображения фон и маску для переднего плана -5 ВНИМАНИЕ bg_model (как я понимаю, вследствии своего алгоритма, создает кучу гауссианов на каждый пиксель, далее как только появляется движение она добавляет гауссианы соответствующие этому движению, а уже ненужные убирает. И получается очень хорошее выделение переднего плана. Далее когда человек уходит из кадра, она убирает эти гауссианы и тут начинается глюк метода, он выдает мерцающие точки, из за того что он убрал некоторые гауссианы похоже) [спасибо mr gloom за ссылочку про вычитание фона, там все очень хорошо написано про этот алгоритм]. На видео, которое показывает результат очень хорошо видно в самом начале неведомую огромную белую фигню которая убирается методом описанном ниже. Также она описывается комментарием в коде. -6 чтобы убрать глюки bg_model я каждые 10 кадров беру "вычитание фона" то есть разность между текущим кадром и фоном, полученным от bg_model. Если bg_model дает "глюк" то это позиционируется как будто бы есть движение, но на самом деле движения нет, что доказывается вычитанием фона. Еще раз - если реально ничего не двигается, а bg_model выдает маску переднего плана, то сравнивая (каждые 10 кадров) картинку полученную вычитанием фона и передний план выделенный bg_model и если между ними СИЛЬНОЕ различие, я тупо обнуляю bg_model. Подробнее в комментариях в коде -7 Далее уже "почти без глюков" картинку я подвергаю вначале операции эрозии с кол-вом итераций 6 , таким образом убираю маленькие точки , а потом операцией дилатации (расширения) наращиваю большие контуры, кол-во итераций 15. -8 Полученную маску накладываю на оригинал - получаю выделенный передний план Уважаемые форумчане, большая просьба напишите Ваше мнение по поводу след. пунктов 1) стоит ли применять медианную фильтрацию в пункте 2 перед тем как пользоваться bg_model 2) какое кол-во итераций применять в пункте 7 для эрозии и расширения? сразу оговорюсь - пробовал операция закрытия, не получается избавится от маленьких точек 3) как мне дальше вести трекинг, т.е. следить за объектов - у меня возникают проблемы - это контуры не постоянны по форме и меняются (как видно из видео), может быть цветовая гистограмма? может быть оптический поток LK ? ОЧЕНЬ ЖДУ ВАШИХ КОММЕНТАРИЕВ И ЖЕЛАТЕЛЬНО ОТВЕТОВ НА ВОПРОСЫ. ЗАРАНЕЕ ОГРОМНОЕ СПАСИБО! segment_v_1_0.txt
  43. 2 points
    http://see.stanford.edu/see/courses.aspx Содержание того что там есть: Introduction to Computer Science ---------------------------- Programming Methodology Programming Abstractions Programming Paradigms Artificial Intelligence ---------------------------- Introduction to Robotics Natural Language Processing Machine LearningCS229 Linear Systems and Optimization ---------------------------- The Fourier Transform and its Applications Introduction to Linear Dynamical Systems Convex Optimization Convex Optimization Additional School of Engineering Courses ---------------------------- Programming Massively Parallel Processors iPhone Application Programming Seminars and Webinars
  44. 2 points
    Для всевозможных детекторов движения самый известный набор данных - это PETS. Практически все статьи используют данные для тестирования оттуда (наборы различаются по годам).
  45. 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
  46. 2 points
    Небольшое пояснение по алгоритму. Версия 1:AdaBoost.pdf ЗЫ: Очень хороший пример по классификаторам включили в версию 2.3. Называется points_classifier.cpp. Он позволяет погонять (на точках) классификаторы: NBC normal Bayessian classifier KNN k nearest neighbors classifier SVM support vectors machine DT decision tree BT ADA Boost GBT gradient boosted trees RF random forest ERT extremely randomized trees ANN artificial neural networks EM expectation-maximization
  47. 2 points
    Здесь Кто-нибудь собирается участвовать?
  48. 2 points
    Программа для экспериментов с преобразованием Фурье. Содержит примеры разложения изображения на действительную и мнимую части спектра, и для разложения изображения на амплитудную и фазовую части спектра, а так-же обратные преобразования для обоих типов разложения. На картинке я вырезал кольцо из амплитудной и фазовой составляющей спектра разложения. И провел обратное преобразование. Исходник: FFT.RAR
  49. 2 points
    Вопросы\уточнения: 1.возможно ли запороть уже работающую программу, использующую OpenCV№.№ если обновиться через SVN? 2.после каждого обновления надо ребилдить либы? 3.Что будет если в VS2008 в VC++ Directories будет указано и C:\OpenCV2.1\include\opencv и C:\Program Files\OpenCV2.2\include C:\Program Files\OpenCV2.2\include\opencv (а то у меня походу от этого unresolved external symbol лезут) и еще в VS2010 VC++ Directories я так понимаю вынесены в свойства проекта так что будет без разницы,т.к. все привязано не к студии, а к самому проекту? 4.Не написано насчет PATH надо ли ее вообще использовать? если посмотреть cmd->path то у меня включено C:\OpenCV2.1\bin и C:\Program Files\OpenCV\bin которой вообще нет и которая видимо была создана CMake, достаточно ли включить например C:\OpenCV2.1 или C:\? или в папке должны лежать все связанные с библиотекой dll-ки? (как дебаг так и релиз? для 2.2 они почему то разделились *_220d.dll и *_220.dll соответственно) 5.Обязательно ли указывать так заголовки? #include <opencv2/objdetect/objdetect.hpp> или есть какой то способ полегче? 6.и еще может глупый вопрос(я с этим не очень знаком), но можно ли как то использовать source код в своем проекте, не компилирую все в либы?(скажем из include папки взять *.h и подключить всю папку с сорцами .cpp) (и зачем это нужно готовить либы вообще? только появляются зависимости под студию 2008\2010, компилятор или ИДЕ) 7. Еще шаг 9-10 не ясен там и там мы подключаем одни и те же либы?
  50. 2 points
    Создание нового проекта в среде C++ Builder 6. (Для OpenCV v1.1) Библиотеки * cv.lib * cvaux.lib * cvhaartraining.lib * cxcore.lib * cxts.lib * Half.lib * highgui.lib * Iex.lib * IlmImf.lib * IlmThread.lib * Imath.lib * libjasper.lib * libjpeg.lib * libjpeg_bcc.lib * libpng.lib * libpng_bcc.lib * libtiff.lib * libtiff_bcc.lib * ml.lib * videoInput.lib * zlib.lib * zlib_bcc.lib короче все файлы из директории OpenCV с расширением lib, необходимо сконвертировать при помощи утилиты coff2omf.exe лежащей в поддиректории /bin директории, где у Вас установлен C++ Builder 6 (или LibConverter см. в прикрепленных ниже файлах) Конвертация необходима ввиду того, что в OpenCV библиотеки с расширением .lib сделаны для использования с Microsoft Visual C. Подключить сконвертированные библиотеки проекту (Меню Project -> Add to project). Еще нужно указать пути к заголовочным файлам библиотеки OpenCV, делается это на вкладке Directories/Conditionals, диалога Options вызываемого выбором пункта меню Project. Эти файлы расположены в нескольких поддиректориях директории в которую Вы поставили OpenCV.Например для OpenCV v1.1 это директории представленные ниже. * C:\Program Files\OpenCV\cv\include * C:\Program Files\OpenCV\cvaux\include * C:\Program Files\OpenCV\cxcore\include * C:\Program Files\OpenCV\ml\include * C:\Program Files\OpenCV\otherlibs\_graphics\include * C:\Program Files\OpenCV\otherlibs\ffopencv * C:\Program Files\OpenCV\otherlibs\highgui Побросать все сконвертированные lib файлы в директорию libs проекта (или другую) и указать путь к этой нашей директории аналогично тому, как это сделано для заголовочных файлов. Чекбокс Use dynamic RTL на вкладке Linker должен быть установлен, иначе требует несуществующую haartraining.dll Чекбокс Build with runtimre packages тоже должем быть установлен, иначе требует ilmthread.dll (тоже не знаю где взять). Так же рекомендуется установить флажок MFC compatibility, это необходимо для правильной работы функции cvGetSize(). И не забудте что DLL должны быть в зоне видимости программы. Приведенный ниже пример использует библиотеку OpenCV v1.1. Проект просто выводит захваченное видео в форму в соответствии с заданными координатами, в данном случае x=10, y=10 И еще если возникает ошибка 0xc0150002, то для корректной работы OpenCV1.1pre1 надо установить MSVCRT 8.0 (visual c++ run time). MSVCRT8.0 *Архив с проектом:simple.rar *Конвертер библиотек:LibConverter.rar *Набор сконвертированных lib:libs.rar *Набор DLL (на всякий случай):OpenCV11DLLs.rar //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "cv.h" #include "highgui.h" #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; CvCapture* capture = 0; IplImage *frame, *frame_copy = 0; void ProcessFrame( IplImage* image ); // Описатель шрифта (см. дальше) CvFont font; #define WIDTHBYTES(bits) ((((bits) + 31) / 32) * 4) //--------------------------------------------------------------------------- // Создание API шного битмапа из интеловского RGB изображения //--------------------------------------------------------------------------- HBITMAP CreateRGBBitmap(IplImage* _Grab) { char *App; IplImage *_Grab3=0,*_Grabf=0; LPBITMAPINFO lpbi = new BITMAPINFO; lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); lpbi->bmiHeader.biWidth = _Grab->width; lpbi->bmiHeader.biHeight =_Grab->height; lpbi->bmiHeader.biPlanes = 1; lpbi->bmiHeader.biBitCount = 24; lpbi->bmiHeader.biCompression = BI_RGB; lpbi->bmiHeader.biSizeImage = WIDTHBYTES((DWORD)_Grab->width * 8) * _Grab->height; lpbi->bmiHeader.biXPelsPerMeter = 0; lpbi->bmiHeader.biYPelsPerMeter = 0; lpbi->bmiHeader.biClrUsed = 0; lpbi->bmiHeader.biClrImportant = 0; void* pBits; HBITMAP hBitmap = CreateDIBSection( NULL, lpbi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0 ); delete lpbi; if ( hBitmap ) App=(char*)pBits; // Если глубина изображения не IPL_DEPTH_8U (однобайтовое целое), конвертируем if(_Grab->depth!=IPL_DEPTH_8U) { _Grabf=cvCloneImage(_Grab); if(_Grab) {cvReleaseImage( &_Grab);} _Grab = cvCreateImage( cvSize(_Grabf->width,_Grabf->height),IPL_DEPTH_8U,_Grabf->nChannels); cvConvert(_Grabf,_Grab); if(_Grabf) {cvReleaseImage( &_Grabf);} } // Если изображение содержит один канал, создаем трехканальное изображение // Серое или бинарное if(_Grab->nChannels==1) { _Grab3 = cvCreateImage( cvSize(_Grab->width,_Grab->height),IPL_DEPTH_8U,3); cvMerge(_Grab,_Grab,_Grab,NULL,_Grab3); } // Если входное изображение трехканальное, просто копируем указатель на него // Цветное if(_Grab->nChannels==3) { _Grab3=_Grab; } // Получаем указатель на данные unsigned char* data; cvGetRawData(_Grab3, (uchar**)&data); // Копируем данные if(_Grab3) { for (int i=0;i<_Grab->height;i++) { memcpy(App+_Grab3->widthStep*(_Grab3->height-i-1),data+_Grab3->widthStep*i,_Grab3->width*3); } } // Очищаем память если создавали изображение, а не копировали указатель if(_Grab->nChannels==1) {cvReleaseImage( &_Grab3);} return hBitmap; } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Функция вывода изображения на HANDLE оконного компонента //--------------------------------------------------------------------------- void APIDrawIpl(int x,int y,IplImage* _Grab,void *HANDLE) { HDC hMemDC,hDC; hDC=GetDC(HANDLE); hMemDC = CreateCompatibleDC(hDC); HBITMAP Bitmap=CreateRGBBitmap(_Grab); SelectObject(hMemDC,Bitmap); BitBlt(hDC,x,y,_Grab->width,_Grab->height,hMemDC,0,0,SRCCOPY); DeleteObject(Bitmap); DeleteDC(hMemDC); DeleteDC(hDC); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { capture = cvCaptureFromCAM(0); // Инициализация шрифта (теперь можем вывести какой-нибудь текст) cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX,0.5,0.5,0,1,8); Application->OnIdle = IdleLoop; // Поток обработки простоя } //--------------------------------------------------------------------------- void __fastcall TForm1::IdleLoop(TObject*, bool& done) { done = false;// Поток обработки простоя if( capture ) { if( !cvGrabFrame( capture )) goto skip; frame = cvRetrieveFrame( capture ); if( !frame ) goto skip; //********************************************************* // Если стерли то что ниже - это надо раскомментировать // if( !frame_copy ) // frame_copy = cvCreateImage( cvSize(frame->width,frame->height), // IPL_DEPTH_8U, frame->nChannels ); // Делаем копию кадра, иначе может пропасть. // cvCopy( frame, frame_copy, 0 ); // Если стерли то что ниже - это надо раскомментировать //********************************************************* //********************************************************* // Если не нужно подгонять размер кадра - это можно стереть // Выделяем память под копию кадра if( !frame_copy ) frame_copy = cvCreateImage( cvSize(352,288), IPL_DEPTH_8U, frame->nChannels ); // Масштабируем под заданный размер cvResize( frame, frame_copy, CV_INTER_LINEAR ); // Если не нужно подгонять размер кадра - это можно стереть //********************************************************* ProcessFrame( frame_copy ); } skip:; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { cvReleaseImage( &frame_copy ); cvReleaseCapture( &capture ); } //--------------------------------------------------------------------------- void ProcessFrame( IplImage* img ) { APIDrawIpl(10,10,img,Form1->Handle); }[/code]
×