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

Smorodov

Главные администраторы
  • Количество публикаций

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

  • Посещение

  • Days Won

    346

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

  1. Распознавание лиц

    Здравствуйте. Насколько я понимаю, в книжке, о которой вы говорите достаточно много неточностей. Я думаю что лучше опираться не только на эту книжку, но и на руководство по OpenCV. Они лежат на форуме в топике "официальное руководство по OpenCV". Что касается распознавания лиц то вот подборка ссылок: http://www.compvision.ru/forum/index.php?showtopic=15 http://www.compvision.ru/forum/index.php?showtopic=81 http://www.compvision.ru/forum/index.php?showtopic=74 И описание: метод главных компонент обучение каскадов Хаара
  2. MS Visual C++ и OpenCV

    IPP хорошая штука, 1 коммерческая лицензия стоит 200$ но если Вы её используете, то вряд ли Ваш продукт стоит меньше 2000$ - 3000$, так что здесь, как раз большой проблемы нет, причем если нужно несколько лицензий Вам дают какие то скидки. Вот ссылка на страничку с ценами: страничка с ценами
  3. MS Visual C++ и OpenCV

    Так можно сделать, в версии 1.0 надо было еще видеофильтры зарегистрировать, там есть bat файл специальный. А в 1.1 я такого не нашел, наверное теперь не нужно ничего регистрировать. Единственное что, IPP работать так скорее всего не будет. И MSVCR надо не забыть.
  4. MS Visual C++ и OpenCV

    существуют трюки, при помощи которых можно впаять dll в exe- шник, правда , скорее всего попыхтеть придется. Есть еще вариант - тулза dll2lib по моему называется может быть она поможет сам правда ее не тестил нормально.
  5. Как прикрутить OpenCV к билдеру?

    дошло до меня зачем такое: typedef struct CvCapture CvCapture; это просто чтобы переменную, допустим cap, типа struct cvCapture объявлять так: cvCapture cap; а не так: struct cvCapture cap; век живи - век учись
  6. В папке с примерами есть такой код (opencv\samples\c\dft.c), скорее всего, Вам просто нужно правильно преобразовать шкалы. #include <cxcore.h> #include <cv.h> #include <highgui.h> // Rearrange the quadrants of Fourier image so that the origin is at // the image center // src & dst arrays of equal size & type void cvShiftDFT(CvArr * src_arr, CvArr * dst_arr ) { CvMat * tmp; CvMat q1stub, q2stub; CvMat q3stub, q4stub; CvMat d1stub, d2stub; CvMat d3stub, d4stub; CvMat * q1, * q2, * q3, * q4; CvMat * d1, * d2, * d3, * d4; CvSize size = cvGetSize(src_arr); CvSize dst_size = cvGetSize(dst_arr); int cx, cy; if(dst_size.width != size.width || dst_size.height != size.height){ cvError( CV_StsUnmatchedSizes, "cvShiftDFT", "Source and Destination arrays must have equal sizes", __FILE__, __LINE__ ); } if(src_arr==dst_arr){ tmp = cvCreateMat(size.height/2, size.width/2, cvGetElemType(src_arr)); } cx = size.width/2; cy = size.height/2; // image center q1 = cvGetSubRect( src_arr, &q1stub, cvRect(0,0,cx, cy) ); q2 = cvGetSubRect( src_arr, &q2stub, cvRect(cx,0,cx,cy) ); q3 = cvGetSubRect( src_arr, &q3stub, cvRect(cx,cy,cx,cy) ); q4 = cvGetSubRect( src_arr, &q4stub, cvRect(0,cy,cx,cy) ); d1 = cvGetSubRect( src_arr, &d1stub, cvRect(0,0,cx,cy) ); d2 = cvGetSubRect( src_arr, &d2stub, cvRect(cx,0,cx,cy) ); d3 = cvGetSubRect( src_arr, &d3stub, cvRect(cx,cy,cx,cy) ); d4 = cvGetSubRect( src_arr, &d4stub, cvRect(0,cy,cx,cy) ); if(src_arr!=dst_arr){ if( !CV_ARE_TYPES_EQ( q1, d1 )){ cvError( CV_StsUnmatchedFormats, "cvShiftDFT", "Source and Destination arrays must have the same format", __FILE__, __LINE__ ); } cvCopy(q3, d1, 0); cvCopy(q4, d2, 0); cvCopy(q1, d3, 0); cvCopy(q2, d4, 0); } else{ cvCopy(q3, tmp, 0); cvCopy(q1, q3, 0); cvCopy(tmp, q1, 0); cvCopy(q4, tmp, 0); cvCopy(q2, q4, 0); cvCopy(tmp, q2, 0); } } int main(int argc, char ** argv) { const char* filename = argc >=2 ? argv[1] : "lena.jpg"; IplImage * im; IplImage * realInput; IplImage * imaginaryInput; IplImage * complexInput; int dft_M, dft_N; CvMat* dft_A, tmp; IplImage * image_Re; IplImage * image_Im; double m, M; im = cvLoadImage( filename, CV_LOAD_IMAGE_GRAYSCALE ); if( !im ) return -1; realInput = cvCreateImage( cvGetSize(im), IPL_DEPTH_64F, 1); imaginaryInput = cvCreateImage( cvGetSize(im), IPL_DEPTH_64F, 1); complexInput = cvCreateImage( cvGetSize(im), IPL_DEPTH_64F, 2); cvScale(im, realInput, 1.0, 0.0); cvZero(imaginaryInput); cvMerge(realInput, imaginaryInput, NULL, NULL, complexInput); dft_M = cvGetOptimalDFTSize( im->height - 1 ); dft_N = cvGetOptimalDFTSize( im->width - 1 ); dft_A = cvCreateMat( dft_M, dft_N, CV_64FC2 ); image_Re = cvCreateImage( cvSize(dft_N, dft_M), IPL_DEPTH_64F, 1); image_Im = cvCreateImage( cvSize(dft_N, dft_M), IPL_DEPTH_64F, 1); // copy A to dft_A and pad dft_A with zeros cvGetSubRect( dft_A, &tmp, cvRect(0,0, im->width, im->height)); cvCopy( complexInput, &tmp, NULL ); if( dft_A->cols > im->width ) { cvGetSubRect( dft_A, &tmp, cvRect(im->width,0, dft_A->cols - im->width, im->height)); cvZero( &tmp ); } // no need to pad bottom part of dft_A with zeros because of // use nonzero_rows parameter in cvDFT() call below cvDFT( dft_A, dft_A, CV_DXT_FORWARD, complexInput->height ); cvNamedWindow("win", 0); cvNamedWindow("magnitude", 0); cvShowImage("win", im); // Split Fourier in real and imaginary parts cvSplit( dft_A, image_Re, image_Im, 0, 0 ); // Compute the magnitude of the spectrum Mag = sqrt(Re^2 + Im^2) cvPow( image_Re, image_Re, 2.0); cvPow( image_Im, image_Im, 2.0); cvAdd( image_Re, image_Im, image_Re, NULL); cvPow( image_Re, image_Re, 0.5 ); // Compute log(1 + Mag) cvAddS( image_Re, cvScalarAll(1.0), image_Re, NULL ); // 1 + Mag cvLog( image_Re, image_Re ); // log(1 + Mag) // Rearrange the quadrants of Fourier image so that the origin is at // the image center cvShiftDFT( image_Re, image_Re ); cvMinMaxLoc(image_Re, &m, &M, NULL, NULL, NULL); cvScale(image_Re, image_Re, 1.0/(M-m), 1.0*(-m)/(M-m)); cvShowImage("magnitude", image_Re); cvWaitKey(-1); return 0; }[/code]
  7. Для линукс, насколько я знаю бесплатный, а для windows платный. Качается отсюда раздел "Performance Libraries" : http://software.intel.com/en-us/articles/i...luation-center/
  8. Можно здесь глянуть: http://nashruddin.com/an-example-on-using-...ith-opencv.html, не cvDFT но вроде работает.
  9. Большое количество деталей роботов которые можно использовать в своих разработках, выполненых в 3d (Solidworks) 3D модели деталей роботов
  10. Словари синонимов: sinonims.rar Разные приколы со словами, типа автопоэта http://www.forumklassika.ru/showthread.php?t=14398
  11. Загрузка изображений из файла. Иногда нам для экспериментов может понадобится загрузить из файла картинку, в рамках проекта по машинному зрению это делается при помощи команды IplImage* img = cvLoadImage("Имя файла"); Командой поддерживаются типы файлов: BMP, DIB, JPEG, JPE, PNG, PBM, PGM, PPM, SR, RAS, и TIFF, что вполне обеспечивает большинство потребностей. После работы с изображением память необходимо очистить при помощи стандартной команды cvReleaseImage( &img ); Файл с проектом:ImageLoader.rar
  12. Загрузка изображений из файла

    Подробнее о работе с видео можно посмотреть здесь: http://www.compvision.ru/forum/index.php?showtopic=106
  13. Думаю всем это будет интересно. Для скорости надо поставить IPP, если еще не установлены, с ними заметно быстрее работает. У меня кадров 15-20 дает на Athlon64x2 5000 (вэбка примерно 350х280 пикселей). На Вашей же картинке (вэбкой с экрана) все отлично. Кстати, в каком разрешении работаете? Может после считывания изображения уменьшать его, до разумных размеров?
  14. Все примеры могут работать с камерой (некоторые после незначительной переделки), главное там функция обработки изображения, а как Вы его получили дело Ваше. Кстати, по моему на основе этого примера и была сделана программка из этой темы http://www.compvision.ru/forum/index.php?showtopic=11
  15. Детектор углов

    Детектор угловых точек изображения. Архив с проектом: CornerDetect.rar
  16. Детектор углов

    Спасибо Это мой перевод куска иностранного текста с небольшими коррективами. Не в вики потому что пока руки не дошли, а в pdf потому что кроссплатформенно и просто создать из word-а
  17. Накопал в и-нете интересный документик (к сожалению без титульного листа, поэтому автора не указываю): Компьютерная_лингвистика.pdf
  18. Собственные вектора и значения

    Программа, использующая описанный метод здесь: http://www.compvision.ru/forum/index.php?showtopic=74
  19. Можно посмотреть что то на подобии Logitech Webcam Pro 9000 (100 $). Предел цены конечно, но Цейсовская оптика и разрешение 1600X1200, USB 2.0 думаю что должно хватить для большинства задач. Пример захваченного кадра можно посмотреть тут (с наведенной мышью - это для другой камеры): http://ghonis2.ho8.com/Pro9000a.html там её для самодельного телескопа применяют.
  20. На всякий случай перевел все на float. //--------------------------------------------------------------------------- void ProcessFrame( IplImage* img ) { IplImage* rgb[3]; CvMat* rgbMat; IplImage* dst = cvCreateImage(cvSize(img->width, img->height), IPL_DEPTH_32F, 3); IplImage* src = cvCreateImage(cvSize(img->width, img->height), IPL_DEPTH_32F, 3); cvConvert(img,src); IplImage* dstRGB[3]; for (int i = 0; i < 3; i++) { rgb = cvCreateImage(cvSize(src->width, src->height), IPL_DEPTH_32F, 1); dstRGB = cvCreateImage(cvSize(src->width, src->height), IPL_DEPTH_32F, 1); } cvSplit(src, rgb[0], rgb[1], rgb[2], NULL); //across float D[] = {0.25, 0.5, 0.25}; rgbMat = cvCreateMat(1, 3, CV_32FC1); for (int x = 0; x < 3; x++) cvmSet(rgbMat, 0, x, D[x]); for ( i = 0; i < 3; i++) { cvZero(dstRGB); cvFilter2D(rgb, dstRGB, rgbMat); } cvReleaseMat(&rgbMat); //down rgbMat = cvCreateMat(3, 1, CV_32FC1); cvZero(dst); cvMerge(dstRGB[0], dstRGB[1], dstRGB[2], NULL, dst); for (int y = 0; y < 3; y++) cvmSet(rgbMat, y, 0, D[y]); for ( i = 0; i < 3; i++) { // cvZero(dstRGB); cvFilter2D(dstRGB, dstRGB, rgbMat, cvPoint(0, 1)); // è çäåñü ïîïðàâèë (÷òîáû ôèëüòðû ïîñëåäîâàòåëüíî ïðèìåíÿëèñü) } cvReleaseMat(&rgbMat); cvZero(dst); cvMerge(dstRGB[0], dstRGB[1], dstRGB[2], NULL, dst); //cvConvertScale( dst, dst,25000,0); APIDrawIpl(10,10,src,Form1->Handle); APIDrawIpl(400,10,dst,Form1->Handle); cvZero(dst); for ( i = 0; i < 3; i++) { cvReleaseImage(&rgb); cvReleaseImage(&dstRGB); } cvReleaseImage(&src); cvReleaseImage(&dst); } Вообще-то разница (правое немного размыто) есть:
  21. Вот: http://blogs.mathworks.com/steve/2006/10/0...le-convolution/ И сверху поправил. Кстати, ядро из примера, это размытие, его действие сложно заметить. Я переделал на оператор Собеля все работает. У меня посл. свертка работает (собель из статьи выше): //--------------------------------------------------------------------------- void ProcessFrame( IplImage* src ) { IplImage* rgb[3]; CvMat* rgbMat; IplImage* dst = cvCreateImage(cvSize(src->width, src->height), src->depth, 3); IplImage* dstRGB[3]; for (int i = 0; i < 3; i++) { rgb = cvCreateImage(cvSize(src->width, src->height), src->depth, 1); dstRGB = cvCreateImage(cvSize(src->width, src->height), src->depth, 1); } cvSplit(src, rgb[0], rgb[1], rgb[2], NULL); //across float D[] = {1, 2, 1}; // Первая часть ядра rgbMat = cvCreateMat(1, 3, CV_32FC1); for (int x = 0; x < 3; x++) cvmSet(rgbMat, 0, x, D[x]); for ( i = 0; i < 3; i++) { cvZero(dstRGB); cvFilter2D(rgb, dstRGB, rgbMat, cvPoint(1, 0)); } cvReleaseMat(&rgbMat); cvZero(dst); cvMerge(dstRGB[0], dstRGB[1], dstRGB[2], NULL, dst); //down rgbMat = cvCreateMat(3, 1, CV_32FC1); D[0]=-1; // Вторая часть ядра D[1]=0; D[2]=1; for (int y = 0; y < 3; y++) cvmSet(rgbMat, y, 0, D[y]); for ( i = 0; i < 3; i++) { // cvZero(dstRGB); cvFilter2D(dstRGB, dstRGB, rgbMat, cvPoint(0, 1)); // и здесь поправил (чтобы фильтры последовательно применялись) } cvReleaseMat(&rgbMat); cvZero(dst); cvMerge(dstRGB[0], dstRGB[1], dstRGB[2], NULL, dst); for ( i = 0; i < 3; i++) { cvReleaseImage(&rgb); cvReleaseImage(&dstRGB); } APIDrawIpl(10,10,src,Form1->Handle); APIDrawIpl(400,10,dst,Form1->Handle); cvReleaseImage(&dst); }
  22. Вот здесь статейка о разделяемых ядрах. Насколько я понял, разделяемым называется двумерное ядро свертки, которое можно представить в виде матричного произведения одномерных ядер. Из этого следует, что применение двумерного ядра эквивалентно последовательному применению к изображению одномерных ядер, являющихся множителями на которые раскладывается исходная матрица. То есть, я предполагаю (считать лень), что квадратная матрица [(1/16, 2/16, 1/16), (2/16, 4/16, 2/16), (1/16, 2/16, 1/16)], есть матричное произведение двух одномерных матриц строки (1/4, 2/4, 1/4) и столбца (1/4, 2/4, 1/4). И результат после применения 2Д ядра свертки, и после последовательного применения 1Д ядер свертки результат должен быть одинаковый.
  23. Может что то типа программы для калибровки камеры подойдет + раскраска угловых клеток. Pамку взять в виде цветной шахматной доски, там как раз и матрица поворота возвращается. Вообще, насчет ориентации, можно поискать по слову Homography или Homography transform, для начала в руководстве по OpenCV. Еще можно пример с библиотекой блобов посмотреть, когда ставишь перед камерой шахматную доску, он клетки в разные цвета красит (Количество блобов я там ограничил, поэтому все не закрасит (для выделения/фильтрации объектов по размеру подойдет)).
×