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

ProgRoman

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

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

  • Посещение

  • Days Won

    7

Все публикации пользователя ProgRoman

  1. Алгорит победивший на ИМАТ - 2011

    действительно всё просто, что-то я сразу не понял спасибо
  2. Freak и Brisk дескрипторы

    Добрый день, изучаю сравнительно новые дескрипторы Freak и BRISK, но есть места которые не понимаю ниже ссылки на описание алгоритмов BRISK Freak там есть ссылка на статью как в одном так и в другом методе первым этапом идём выделение ключевых точек(FAST) затем уже к ключевым точкам применяются шаблоны для вычисления дескрипторов, они конечно различны, так вопрос в основном в этих шаблонах я не совсем понимаю как их формировать.. и ещё центр каждой окружности это некий пиксель взятый с соответствующим размытием так вот как можно выделить из-изображения такой участок и только его размыть.. если только интерполировать опять же в прямоугольную область..(хотя я думаю, что не прав, тогда бы рисовали решётку всё таки, а не окружности..) не понятен и сам обход ну то есть каким образом выбираем пары окружностей, что бы их сравнить нашей тестовой функцией для формирования кода дескриптора.. также ещё интересно выбирается ли (для сравнения) центр шаблона, то есть как я понимаю сама ключевая точка найденная с помощью FAST
  3. Graph Algorithm

    Сейчас смотрю курс Оптимизация энергии в задачах компьютерного зрения и алгоритмы на графах и у меня возник вопрос есть ли алгоритмы или примеры применения алгоритмов на графах к распознаванию изображений(объектов) не сегментация изображений, а распознавание
  4. у меня ещё вопрос по тестированию алгоритмов я скачал два архива VOCtrainval_06-Nov-2007.tar и VOCtest_06-Nov-2007.tar ну как я понял соответственно для обучения и тестирования зашёл в папку ImageSets\Main и для обучения для каждого из классов есть 3-и файла aeroplane_train.txt aeroplane_trainval.txt и aeroplane_val.txt я не совсем понимаю почему(зачем) их там 3-и)
  5. Latent SVM

    Появился вопрос о алгоритме Latent SVM вроде бы он появился в opencv. Правильно ли я понимаю, что это просто так можно сказать иерархический классификатор. Создаётся каскад на основе svm сперва вычисляется самый слабый классификатор к примеру фигуры человека если у нас есть такой регион и мы его не отмели на начальной фазе то далее используем более сильные(уточняющие) классификаторы к примеру рук, ног, головы и наверно в конце принимается решение ещё исходя и из положения самих уточняющихся объектов
  6. спасибо за ответ, меня что смутило, так это низкие проценты в распознавании в 2007 да и для некоторых категорий в 2012 тоже очень низкие INRIA_Genetic 0.775 т.е. 77.5% правильно распознанных это в 2007 на aeroplane NUSPSL_CTX_GPM_SCM 97.3 уже значительно лучше в 2012 тоже на aeroplane для cow 77.8 в 2012 сейчас думаю, что всё действительно так у самолётов приблизительно даже форма одна и наверно варьируется она не так сильно как к примеру у коровы или у бутылки у которой средняя точность распознавания 60.8 спасибо за ответ
  7. Filter Gabor для распознавания

    В примерах opencv есть реализация фильтра Габора, ниже привел код Mat getGaborKernel( Size ksize, double sigma, double theta, double lambd, double gamma, double psi, int ktype ) { double sigma_x = sigma; double sigma_y = sigma/gamma; int nstds = 3; int xmin, xmax, ymin, ymax; double c = cos(theta), s = sin(theta); if( ksize.width > 0 ) xmax = ksize.width/2; else xmax = cvRound(std::max(fabs(nstds*sigma_x*c), fabs(nstds*sigma_y*s))); if( ksize.height > 0 ) ymax = ksize.height/2; else ymax = cvRound(std::max(fabs(nstds*sigma_x*s), fabs(nstds*sigma_y*c))); xmin = -xmax; ymin = -ymax; CV_Assert( ktype == CV_32F || ktype == CV_64F ); Mat kernel(ymax - ymin + 1, xmax - xmin + 1, ktype); double scale = 1/(2*CV_PI*sigma_x*sigma_y); double ex = -0.5/(sigma_x*sigma_x); double ey = -0.5/(sigma_y*sigma_y); double cscale = CV_PI*2/lambd; for( int y = ymin; y <= ymax; y++ ) for( int x = xmin; x <= xmax; x++ ) { double xr = x*c + y*s; double yr = -x*s + y*c; double v = scale*exp(ex*xr*xr + ey*yr*yr)*cos(cscale*xr + psi); if( ktype == CV_32F ) kernel.at<float>(ymax - y, xmax - x) = (float)v; else kernel.at<double>(ymax - y, xmax - x) = v; } return kernel; } у меня почему то результат работы фильтра очень бледный порой вообще практически не заметное изображение, вызываю фильтр таким образом cv::Mat image = cv::imread("E:/Projects/ComputerVision/Data bases/faces/test/image_0450.jpg",1); cv::imshow("Src", image); cv::Mat src; cv::cvtColor(image, src, CV_BGR2GRAY); src.convertTo(src_f, CV_64F, 1.0/255, 0); Mat res_f = getGaborKernel(Size(25,25),15,100,30,50,5); Mat dst; filter2D(src_f,dst,CV_32F,res_f); imshow("res",dst); пытался менять параметры пока ничего нормального не нашёл результат фильтра практически не виден dst порой совсем чёрная. Пока пытаюсь всё ещё менять параметры смотрю как меняется изображение. Может кто знает сталкивался с такой проблемой... возможно я какой-то параметр не совсем корректно задаю... ниже прикреплены два изображения одно оригинальное другое после обработки фильтром И мне не совсем ясно каким образом фильтр габора можно использовать в распознавании... Имеем оригинальное изображение, затем после обработки фильтром получаем новое обработанное.. и что дальше каким образом использовать это обработанное отфильтрованное изображение... вообще по идее как я понимаю.. мы должны бы к изображению применить фильтры под разным углом(с различным theta) при различном theta отфильтрованное изображение меняется.. но как это всё применять не ясно может быть кто-то занимался этим
  8. local binary patterns

    Добрый день, разбираюсь с оператором LBP ссылки ниже wiki_Local_binary_patterns habrahabr сама процедура получения из изображения LBP изображения понятна.. ниже приведу ссылки с исходниками для построения LBP и гистограммы LBP histogram так вот мне не очень понятно в процедуре построения гистограммы что такое numPatterns template <typename _Tp> void lbp::histogram_(const Mat& src, Mat& hist, int numPatterns) { hist = Mat::zeros(1, numPatterns, CV_32SC1); for(int i = 0; i < src.rows; i++) { for(int j = 0; j < src.cols; j++) { int bin = src.at<_Tp>(i,j); hist.at<int>(0,bin) += 1; } } }
  9. local binary patterns

    если берём оператор большего радиуса он не покрывает меньшие так как считаются только граничные точки т.е. если радиус равен 1 то имеем 8-мь соседей, при увеличении радиуса число соседей будет увеличиваться, но они так же будут браться только по границе окружности, для распознавания я думаю можно как то соорудить сложный LBP, но я видел, что сперва находят гистограмму от lbp изображения а потом только распознают..
  10. local binary patterns

    numPatterns - это количество шаблонов(всех) оно зависит от соседей.. если их 8 то соответственно имеем 256 различных шаблонов // get spatial histogram from this lbp image Mat p = spatial_histogram( lbp_image, /* lbp_image */ static_cast<int>(std::pow(2.0, static_cast<double>(_neighbors))), /* number of possible patterns */ _grid_x, /* grid size x */ _grid_y, /* grid size y */ true); нашёл в исходниках opencv поэтому вопрос снимается, всё разрешилось
  11. local binary patterns

    да мне как-то казалось, что зачем их число задавать... странно же... тем более этих uniform patterns не так уж много тем более они создают гистограмму hist = Mat::zeros(1, numPatterns, CV_32SC1); а потом записывают туда значения int bin = src.at<_Tp>(i,j); hist.at<int>(0,bin) += 1; где bin может быть от 0.. 255 ну из LBP преобразования.. поэтому я думаю всё же вряд ли это uniform patterns
  12. Каскады хаара

    Добрый день, у меня вопрос я повторил программу cascade-classifier вообщем то всё работает ниже приведён текст программы, но она очень сильно тормозит т.е. каждый кадр обрабатывается долго, в программе по ссылке я так понимаю программа работает в реальном времени.. в моей же версии она очень сильно тормозит... // testdetect.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgproc.hpp> #include <opencv2\ml\ml.hpp> #include <opencv2\features2d\features2d.hpp> #include <opencv2\objdetect\objdetect.hpp> #include <opencv2\video\tracking.hpp> #include <Windows.h> #include <string.h> #include <iostream> #include <stdio.h> #include <math.h> using namespace cv; using namespace std; #define MAX(a, ((a< ? b : a); #define MIN(a, ((a< ? a : ; String face_cascade_name = "haarcascade_frontalface_alt.xml"; String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; String window_name = "tracing face"; CascadeClassifier face_cascade; CascadeClassifier eyes_cascade; void detectAndDisplay( Mat frame ) { vector<Rect> faces; Mat frame_gray; cvtColor( frame, frame_gray, CV_BGR2GRAY ); equalizeHist( frame_gray, frame_gray ); //-- Detect faces face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) ); for( int i = 0; i < faces.size(); i++ ) { Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 ); ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 ); Mat faceROI = frame_gray( faces[i] ); std::vector<Rect> eyes; //-- In each face, detect eyes eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) ); for( int j = 0; j < eyes.size(); j++ ) { Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 ); int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 ); circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 ); } } //-- Show what you got imshow( window_name, frame ); } int _tmain(int argc, char** argv) { VideoCapture cap; cap.open("video.mp4"); face_cascade.load(face_cascade_name); eyes_cascade.load(eyes_cascade_name); if(!cap.isOpened()) return -1; while(true) { Mat frame; cap >> frame; if(frame.empty()) break; detectAndDisplay( frame ); //imshow("video",frame); char c = waitKey(10); if(c==27) break; } return 0; } [/code]
  13. Blob detector

    Добрый день, как можно реализовать Blob detector почитал в интернете и как я понял он строится на основе разности гаусиан int sz,rd,k; GaussianBlur(img1,gim1,Size(sz,sz),rd); GaussianBlur(img1,gim2,Size(sz,sz),k*rd); Mat nimg = gim2-gim1; как я понимаю rd это радиус блоба sz размер гауссова ядра, не совсем понятно как задаётя sz он один для всех rd или нет... как задаётся сам радиус блоба rd и значение k как задаётся просто последовательно от 1 и до какого-то значения...
  14. Каскады хаара

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

    у меня ещё вопрос как сделать полный трекинг объекта у меня сейчас выделяются автомобили в кадрах, но они выделяются а потом хотя автомобиль и есть он не выделяется я бы хотел сделать, что бы можно было сопровождать этим выделением все автомобили пока он видим для камеры, а не только первые кадры когда есть автомобиль а потом выделение куда-то пропадает ниже код он практически не изменился String cascade_name1 = "haarcascade_car_1.xml"; String cascade_name2 = "cars3.xml"; String window_name = "tracing objects"; CascadeClassifier cascade1; CascadeClassifier cascade2; void detectAndDisplay(Mat frame) { vector<Rect> objects1; vector<Rect> objects2; Mat frame_gray; cvtColor(frame, frame_gray, CV_BGR2GRAY); equalizeHist(frame_gray, frame_gray); //-- Detect cascade1.detectMultiScale(frame_gray, objects1, 1.2, 2, 0|CV_HAAR_SCALE_IMAGE, Size(60, 60)); cascade2.detectMultiScale(frame_gray, objects2, 1.2, 2, 0|CV_HAAR_SCALE_IMAGE, Size(60, 60)); for( int i = 0; i < objects1.size(); i++ ) { Point center( objects1[i].x + objects1[i].width*0.5, objects1[i].y + objects1[i].height*0.5 ); ellipse( frame, center, Size( objects1[i].width*0.5, objects1[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 ); Mat objROI = frame_gray( objects1[i] ); } for( int i = 0; i < objects2.size(); i++ ) { Point center( objects2[i].x + objects2[i].width*0.5, objects2[i].y + objects2[i].height*0.5 ); ellipse( frame, center, Size( objects2[i].width*0.5, objects2[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 ); Mat objROI = frame_gray( objects2[i] ); } //-- Show what you got imshow( window_name, frame ); } int _tmain(int argc, char** argv) { VideoCapture cap; cap.open("racing.mp4"); if( !cascade1.load( cascade_name1 ) ){ printf("--(!)Error loading cascad!\n"); return -1; }; if( !cascade2.load( cascade_name2 ) ){ printf("--(!)Error loading cascad!\n"); return -1; }; if(!cap.isOpened()) return -1; while(true) { Mat frame; cap >> frame; if(frame.empty()) break; detectAndDisplay(frame); //imshow("video",frame); char c = waitKey(1); if(c==27) break; } return 0; }
  16. Каскады хаара

    спасибо параметры подкрутил вроде бы заработало быстрее конечно.. возник вопрос есть ли базы данных с обученными каскадами к примеру автомобилей, каких-то животных к примеру кошки собаки и другие нашёл ролик по детекции автомобилей с уже обученным каскадом ссылка повторить удалось но единственно начал проверять на других видео и оказалось, что он довольно плохо работает с автомобилями которые проезжают мимо он их будто вообще не видит к примеру когда автомобиль обгоняет вас или наоборот вы обгоняете другой автомобиль как это можно исправить
  17. Добрый день, возник такой вопрос есть ли дескрипторы которые можно использовать к примеру для трекинга и распознавания простых геометрических фигур ну т.е. круг, треугольник, квадрат.. с простой текстурой.. пробовал SIFT и SURF но они с простыми формами не очень хорошо работают.. в качестве базы данных для тестирования использую дорожные знаки
  18. да по количеству хороших пар точек, возможно можно как-то иначе.. смотрю ссылку
  19. Graph Algorithm

    спасибо, это в основном как я понял к лицам.. а к объектам другой формы.. я просто сам не встречал...
  20. Distance Transform

    Не могу разобраться как по distanceTransform понимать форму объекта к примеру круг, треугольник или прямоугольник... тут вроде бы написано что можно и что делали так, но как эту информация использовать для узнавания этих фигур пока идей нету http://www.lektorium.tv/lecture/?id=13539 там видео лекция и презентация
  21. Distance Transform

    Ещё вопрос по DistanceTransform как вычислить расстояние по нему от одного объекта до другого..в DistanceTransform хранятся расстояния до ближайшего края т.е. что бы получить ответ вроде бы надо строить к примеру пирамиду шаблона и её накладывать на нашу сцену потом ею двигать, пройтись скользящим окном по всей сцене и найти лучший отклик или отклики...
  22. Distance Transform

    Спасибо ссылки читаю, у меня такие картинки, но вроде бы они там не как у вас на картинках.. ниже приведу код Mat img1 = imread(path1, CV_LOAD_IMAGE_GRAYSCALE); Mat gim1,gim2,gim3; Canny(img1,gim1,50,250,3); gim2 = 1-gim1/255; distanceTransform(gim2,gim3,CV_DIST_L2,3); normalize(gim3,gim3,0.0,1.0,NORM_MINMAX); imshow("original",img1); imshow("Canny",gim2*255); imshow("distanceTransform",gim3);
  23. Blob detector

    и ещё вопрос в этой статье есть раздел Уточнение особых точек Как это ни странно, на предыдущем пункте поиск ключевых точек не окончен. Следующим шагом будет пара проверок пригодности точки экстремума на роль ключевой. Первым делом определяются координаты особой точки с субпиксельной точностью. Это достигается с помощью аппроксимирования функции DoG многочленом Тейлора второго порядка, взятого в точке вычисленного экстремума. и приводится формула... я думал что особые точки проверяются не разложением а вот такой формулой из http://courses.graphicon.ru/files/courses/vision/2011/lectures/cv2011_05_features.pdf R=det(M)-k(trace(M))^2, где k=0.04-0.06 или просто отношение R=det(M)/trace(M) или я что-то не то понял?)
  24. Blob detector

    а радиус этой области как определить через матрицу Гессе так? вот неплохая ссылка на описание сифта заодно он использует DoG детектор SIFT habrahabr
  25. Blob detector

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