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

ProgRoman

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

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

  • Посещение

  • Days Won

    7

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

  1. Retinex

    изменил на GaussianBlur(ims,t1,Size(sm/2,sm/2),sm/2); GaussianBlur(ims,t2,Size(sm/2,sm/2),sm/4); GaussianBlur(ims,t3,Size(sm/2,sm/2),sm/8); поменял и размер ядра.. ну в два раза меньший стал... вроде бы есть проясненья лучше ли стало пока не знаю... но откуда-то возникает чёрная полоса... непонятно... может у этого алгоритма область применения есть ну где-то он не работает...
  2. Retinex

    что-то странно... изменил GaussianBlur(ims,t1,Size(sm,sm),sm/1); GaussianBlur(ims,t2,Size(sm,sm),sm/2); GaussianBlur(ims,t3,Size(sm,sm),sm/3); на GaussianBlur(ims,t1,Size(sm,sm),sm/1); GaussianBlur(ims,t2,Size(sm,sm),sm/3); GaussianBlur(ims,t3,Size(sm,sm),sm/5); ну все нечётные... и тоже ничего не изменилось... очень странно... почему так вроде бы должно меняться в зависимости от ядра гаусса...
  3. Retinex

    изображения переводятся в вещественный тип img.convertTo(ts,CV_64FC3,1.0/255.0); и все действия происходят уже в нём...
  4. Примеры из opencv

    Добрый день, пытался запустить готовые детекторы из примеров, но что-то не особо получилось пример matcher_simple.cpp ниже тот же код что и в примере #include <stdio.h> #include <opencv2/core/core.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; void help() { printf("\nThis program demonstrates using features2d detector, descriptor extractor and simple matcher\n" "Using the SURF desriptor:\n" "\n" "Usage:\n matcher_simple <image1> <image2>\n"); } int main(int argc, char** argv) { if(argc != 3) { help(); return -1; } Mat img1 = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE); Mat img2 = imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE); if(img1.empty() || img2.empty()) { printf("Can't read one of the images\n"); return -1; } // detecting keypoints SurfFeatureDetector detector(); vector<KeyPoint> keypoints1, keypoints2; detector.detect(img1, keypoints1); detector.detect(img2, keypoints2); // computing descriptors SurfDescriptorExtractor extractor; Mat descriptors1, descriptors2; extractor.compute(img1, keypoints1, descriptors1); extractor.compute(img2, keypoints2, descriptors2); // matching descriptors BruteForceMatcher<L2<float> > matcher; vector<DMatch> matches; matcher.match(descriptors1, descriptors2, matches); // drawing the results namedWindow("matches", 1); Mat img_matches; drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches); imshow("matches", img_matches); waitKey(0); return 0; } получил следующую ошибку после исправления, исправленный код ниже // detecting keypoints SurfFeatureDetector detector(); vector<KeyPoint> keypoints1, keypoints2; detector().detect(img1, keypoints1); detector().detect(img2, keypoints2); // computing descriptors SurfDescriptorExtractor extractor(); Mat descriptors1, descriptors2; extractor().compute(img1, keypoints1, descriptors1); extractor().compute(img2, keypoints2, descriptors2); // matching descriptors BruteForceMatcher<L2<float> > matcher(); vector<DMatch> matches; matcher().match(descriptors1, descriptors2, matches); // drawing the results namedWindow("matches", 1); Mat img_matches; drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches); imshow("matches", img_matches); waitKey(0); получил следующую ошибку
  5. Примеры из opencv

    и у меня возник ещё вопрос для сопоставления дескрипторов я сейчас использую метод ближайших соседей встроенный у flann int knn=5; FlannBasedMatcher matchr; vector<DMatch> matches; matchr.knnMatch(descriptors1,descriptors2,matches,knn); он выдаёт ошибку, что может быть не так...
  6. Примеры из opencv

    Большое спасибо, всё получилось у меня сейчас такой вопрос, какие пороги надо писать в сифте SiftFeatureDetector detector(); я пробовал так SiftFeatureDetector detector(40, 70); но никакого drawMatches не отображалось.. наверно пороги нужно брать другие?..
  7. Примеры из opencv

    а что за либа может быть не подключена.. в доп зависимостях у меня следующие C:\OpenCV2.2\lib\opencv_core220d.lib C:\OpenCV2.2\lib\opencv_highgui220d.lib C:\OpenCV2.2\lib\opencv_video220d.lib C:\OpenCV2.2\lib\opencv_ml220d.lib C:\OpenCV2.2\lib\opencv_legacy220d.lib C:\OpenCV2.2\lib\opencv_imgproc220d.lib а в инклудах #include <stdio.h> #include <opencv2/core/core.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/highgui/highgui.hpp>
  8. shape context algorithm

    минимизируем оценку совмещения двух контуров. Это полный перебор по всем точкам для выяснения какой дескриптор первой формы лежит ближе ко второй.. вроде бы это n2 n(количество точек на 1-ой и второй форме)без учёта (подсчёта близости самих дескрипторов этих гистограмм) затем по этим совмещённым точкам подсчитывается (энергия) стоимость чем меньше она тем лучше т.е. образы формы очень близки вроде как то так можно...
  9. shape context algorithm

    h(i) что мы строим для каждой точки контура и называется как я понял shape context и мы в конце имеем N(пусть 100) этих дескрипторов, которые описывают контур формы дальше если по алгоритму я понял строится весовая матрица и уже находится полное паросочетание с наименьшей стоимостью.. а можно ли как-то использовать эти дескрипторы для сравнения двух форм с помощью к примеру обычных метрик грубо говоря без переупорядочивания элементов гистограмм h(i)
  10. shape context algorithm

    т.е. я правильно понимаю пусть у нас есть два изображения, даже лучше контуры с уже выделенными точками одно это Pi а второе это Qj i и j изменяются по количеству точек т.е. от 1 до N для построения Shape context надо для каждой точки первого изображения строить эти окружности и считать количество попавших в сектора точек первого же изображения т.е. это потом разворачивается в матрицу число строк это log( r ) а число столбцов Q условно(обозначения из википедии)) и каждый элемент этой матрицы это и есть количество точек попавших в тот или иной сектор. т.е правильно ли при построении диаграммы для одного изображения второе при этом не используется так в самой формуле стоит так q-pi или (q )тут просто начальная точка и таким образом получается вектор...
  11. расстояние Хаусдорфа

    Добрый день у меня вопрос правильно ли я понял само расстояние как оно считается Пусть есть два изображения X и Y вытягиваем эти два изображения в вектор длина которого пусть N H(X,Y)- это расстояние Хаусдорфа, H(X,Y)=max(h1,h2) h1=maximinj|xi-yj| h2=maxjmini|xi-yj| то есть само расстояние разница берётся по пикселям изображений ниже приведён код double calcHausdorff(const Mat &v1,const Mat &v2) { double res=0,h1=-100000,h2=-100000; int n=v1.size().area(); //calc h1 for(int i=0; i<n; i++) { double xi = v1.at<double>(i); double dmj=100000; for(int j=0; j<n; j++) { double yj = v2.at<double>(j); dmj=MIN(dmj,abs(xi-yj)) } h1=MAX(h1,dmj); } //calc h2 for(int j=0; j<n; j++) { double yj = v2.at<double>(j); double dmj=100000; for(int i=0; i<n; i++) { double xi = v1.at<double>(i); dmj=MIN(dmj,abs(xi-yj)) } h2=MAX(h2,dmj); } res=MAX(h1,h2); return res; } похоже ли на правду ну что я реализовал или где-то ошибаюсь?...
  12. расстояние Хаусдорфа

    Спасибо большое, сейчас разбираюсь с shape context и просматриваю SIFT
  13. расстояние Хаусдорфа

    попробовал вроде бы результаты лучше... также картинки очистил от фона т.е. остались только знаки
  14. расстояние Хаусдорфа

    согласен, что такие методы не особо точны вот ещё по самому методу я при вычислении расстояния вычислял разность между пикселями каждый с каждым dmj=MIN(dmj,abs(xi-yj)) не стоит ли брать не только разность интенсивностей у пикселей, но и их расположение ну т.е. dmj=MIN(dmj,abs(xi-yj)+abs(i-j))
  15. расстояние Хаусдорфа

    эти результаты уже с приведением изображений в градации серого, при бинаризации почему-то у меня всегда 0 получается.... фон пока не пробовал вычитать..., но я как то думал, что она и так должна бы работать ну пусть хуже чем с контурами объектов, но всё равно должна бы давать какие-то разумные реультаты... а эти что-то не особо понятны...
  16. расстояние Хаусдорфа

    ok, спасибо) я применяю её для сравнения двух изображений к примеру дорожных знаков, и что-то как то не особо успешно... на одном и том же изображении она даёт 0 в других случаях всё как-то не особо понятно... к примеру при сравнении этой мерой 3-х прикреплённых изображений первые два из одного класса а второе из другого такие результаты первое с третьим 0.0352941 первое со вторым 0.117647 на мой взгляд это странно я думал для более похожих изображений расстояние будет меньше чем для более отличающихся изображений
  17. Mahalanobis

    Добрый день, я написал свою реализацию расстояния махаланобиса, но проект всё время падает с исключением ниже код моего метода double calcMah(const Mat &Xk,const Mat &x) { int rw = Xk.rows; int cl = Xk.cols; Mat xm(rw,1,CV_64F); //calc mean for(int r=0; r<rw; r++) { Mat tmr = Xk.row(r).clone(); Scalar sc = mean(tmr); xm.at<double>(r) = sc.val[0]; } Mat mv = Mat::ones(rw,cl,CV_64F).mul(xm); Mat Xvg=Xk-mv; Mat cov =Xvg*Xvg.t(); Mat icov = cov.inv(); Mat res = (xm-x)*icov*(xm-x).t(); return res.at<double>(0); }
  18. Mahalanobis

    Спасибо всё действительно работает!) единственно что-то уж очень долго считает на изображениях
  19. Mahalanobis

    вот что у меня получилось Mat X = (Mat_<double>(4,3)<<1,3,5,22,5,-1,3,20,11,4,-7,34); во вложении картинка с результатами единичной матрицы нету ни в программе ни в маткаде может это из-за того что определитель ковариационной матрицы близок к нулю...
  20. Mahalanobis

    в маткаде я подобрал точки так что бы обратная матрица к ковариационной была отлична от нуля p1(1,2,3,4);p2(3,5,0,-7); p3(5,-1,11,34);, но у меня в маткаде получился один ответ у программы совсем другой причём если при обращении поставить DECOMP_SVD т.е. Mat icov = cov.inv(DECOMP_SVD); то тоже будет другой ответ... почему что-то не особо ясно.. может ошибка где-то в функции махаланоблиса, которую я написал...
  21. Mahalanobis

    ну да вроде бы со средний всё нормально... считается средний вектор его размерность будет 4 строки 1 столбец вроде всё так..
  22. Mahalanobis

    почему не то у меня 4 это размерность пространства т.е. точка в R4 вот всего 2-е точки т.е. первая p1(1,2,3,4); p2(3,5,0,7), ну и точка для тестирования это x1(1,2,3,4)
  23. Mahalanobis

    сейчас проверил в маткаде определитель ковариационной матрицы равен 0, что-то как не изменяю матрицу X он всё равно 0
  24. Mahalanobis

    пробовал сперва брать просто придуманные вектора, но тоже ничего хорошего (матрица обратная к ковариационной тоже нулевая) Mat X = (Mat_<double>(4,2)<<1,3,2,5,3,0,4,7); Mat x1 = (Mat_<double>(4,1)<<1,2,3,4); double d = calcMah(X,x1);
  25. Mahalanobis

    я для тестирования использую базу данных изображений, пока просто матрица состоит из 2-х тестовых изображений и одно беру для сравнения или из этого класса или из другого.. приведу код.. я его писал для проверки расстояния махаланобиса (в матрице tempMt из которой и строится ковариационная и обратная к ней матрицы количество строк это размерность изображения вытянутого в вектор, а количество столбцов это количество этих векторов т.е. изображений) int imSz = 50;// размер изображения для тестирования Mat i1 = imread("C:/GTSRB/Final_Train/00000/00000_00026.jpg");//первое изображение из 0-го класса (тренировочное) Mat i2 = imread("C:/GTSRB/Final_Train/00000/00005_00029.jpg");//второе изображение из 0-го класса (тренировочное) Mat i3 = imread("C:/GTSRB/Final_Train/00016/00006_00028.jpg");//изображение для тестирования Mat tst; Mat tempMt(imSz*imSz,2,CV_64F); //преобразование перового изображения в вектор и запись в tempMt { Mat nts; Mat rts; Mat dts; Mat nv(imSz*imSz,1,CV_64F); cvtColor(i1,nts,CV_BGR2GRAY); resize(nts,rts,Size(imSz,imSz)); rts.convertTo(dts,CV_64F,1.0/255.0); int dx=-1; for (int r=0;r<imSz;r++ ) { for (int c=0;c<imSz;c++) { dx++; nv.at<double>(dx)=dts.at<double>(r,c); } } for(int p=0; p<imSz*imSz;p++) { tempMt.at<double>(p,0)=nv.at<double>(p); } } //преобразование второго изображения в вектор и запись в tempMt { Mat nts; Mat rts; Mat dts; Mat nv(imSz*imSz,1,CV_64F); cvtColor(i2,nts,CV_BGR2GRAY); resize(nts,rts,Size(imSz,imSz)); rts.convertTo(dts,CV_64F,1.0/255.0); int dx=-1; for (int r=0;r<imSz;r++ ) { for (int c=0;c<imSz;c++) { dx++; nv.at<double>(dx)=dts.at<double>(r,c); } } for(int p=0; p<imSz*imSz;p++) { tempMt.at<double>(p,1)=nv.at<double>(p); } } //преобразование тестового изображения в вектор, запись в tst { Mat nts; Mat rts; Mat dts; Mat nv(imSz*imSz,1,CV_64F); cvtColor(i3,nts,CV_BGR2GRAY); resize(nts,rts,Size(imSz,imSz)); rts.convertTo(dts,CV_64F,1.0/255.0); int dx=-1; for (int r=0;r<imSz;r++ ) { for (int c=0;c<imSz;c++) { dx++; nv.at<double>(dx)=dts.at<double>(r,c); } } tst = nv.clone(); } double d = calcMah(tempMt,tst); cout<<d;
×