Flame 1 Жалоба Опубликовано May 29, 2012 скомпилил на с++ в студии, скорость сравнима с тем что на линуксе правда не сразу понял как файлы из папки грузить, но вот сделал так, вдруг кому интересно станет: char a[] = "C://faces//s"; char b[] = "//"; char c[] = ".pgm"; char filenames[20]; for (int j=0;j<N_People;j++) // Цикл по разным людям { for (int i=0;i<N_Samples;i++) // Цикл по фотографиям { sprintf(filenames, "%s%d%s%d%s", a, j+1, b, i+1, c); img_load = cvLoadImage(filenames); Я в итоге реализовал на С++, а на С# написал враппер на некоторые функции. На плюсах действительно все быстрее работает, главное избегать утечек памяти А я с тем ковырялся добавил тока ему нейм спейс еще чтобы использовать совместно с враппером OpenCVSharp потому как у последнего все удобнее сделано но там нет марковских моделей почему то. а добавить их туда я че-то не осилил. Там есть PCA, он работает быстро. может если туда добавить Марковские модели будет быстрее Вы писали с нуля враппер именно для марковских моделей чтобы использовать их в С#? Кстати по поводу утечек памяти в студии есть такая штука gcnew, для борьбы с утечками Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ShurikEv 0 Жалоба Опубликовано May 29, 2012 на плюсах реализовал свои классы для распознавания, вытащил во внешние функции и их заврапил. Т.е. врапил только свои функции, в которых использовались функции библиотеки OpenCv Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Snuff 0 Жалоба Опубликовано May 30, 2012 Здравствуйте! Нужна ваша помощь. Дали в институте задание, сделать программу для нахождения лица человека на изображении, полученному с камеры в реальном времени и сравнение его с лицами в базе, с последующим определением тот это человек или нет. Ну вобщем вы меня поняли =) Можно ли использовать вашу программу для своей цели? (Имею ввиду, использовать программу с вашего разрешения) Если да, то скажите, что мне необходимо помимо камеры и компьютера, имею ввиду какая ОС нужна, и язык программирования (Delphi или C++?), какая версия OpenCV, и какой метод будет попроще: марковский или главных компонент? (Получится ли запустить вашу программу, которая в начале темы или из другой темы аналогичной, при условии что у меня будет стоять билдер и opencv, соответственно подключенная камера? Имею ввиду что, установив эти проги, и открыв вашу программу, я смогу сразу увидеть как она работает (выделяет лицо, фотографирует его, сохраняет в базу фото, а потом сравнивает, хм, что то я запутался, наверно нужно сперва создать эту базу с фото, а потом только полученное изображение будет сравниваться с эталонными)). Сам пытался сделать что то подобное в LabView, но в силу нелицензионности программы ничего не получилось. Есть вариант делать в линуксе с пакетом OpenCV на PHP, но линукс знаю плохо, как-то страшно в дебри лезть. Помогите пожалуйста. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 30, 2012 1) можно. 2) win + C++ builder 6 + opencv (должен работать с любой версией, но там вроде 1.1pre1, есть в этой ветке и под 2.x ) 3) главных компонент проще 4) получится, если все правильно установлено 5) эта программа с камерой не работает, придется Вам поработать 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Snuff 0 Жалоба Опубликовано May 30, 2012 Спасибо большое. Тоесть, эта программа работает только с изображениями? Имею ввиду что, есть какая то выборка, например 5 фоток одного человека, мы делаем еще одну фотку, ставим её рядом с теми пятью и программа делает опознание? Если я не правильно написал, то поправьте меня, может я что то недопонял =) Просто вы написали что "можно" на мой вопрос: "нахождения лица человека на изображении, полученному с камеры в реальном времени и сравнение его с лицами в базе, с последующим определением тот это человек или нет". Как в ноутбуках устанавливают программы, вместо того чтоб пароль вводить, пользователь смотрит в камеру, она захватывает изображение, фокусируется на лице (возможно делает снимок, я не знаю какой у неё алгоритм) и после этого, полученный снимок сравнивает. Мне нужно реализовать подобное. И еще скажите, у меня opencv версии 2.3.1, как его прикрепить к билдеру? Так же как написано в этой статье? http://www.compvision.ru/forum/index.php?showtopic=2&st=0 Заранее спасибо еще раз. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 30, 2012 Есть по N фоток M разных людей. Программа учится на них, после этого при предъявлении ей новой фотки одного из тех людей которых она знает, обученная программа должна определить кто это. Вы скомпилируйте и погоняйте программу, сначала на фотках, а там глядишь и другие вопросы отпадут. http://www.compvision.ru/forum/index.php?showtopic=763 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Snuff 0 Жалоба Опубликовано May 30, 2012 Хорошо, попробую. Спасибо. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Snuff 0 Жалоба Опубликовано May 31, 2012 Снова здравствуйте. У меня проблема, я не понимаю некоторых вещей. Вот у меня есть opencv 1.1, есть builder 6, с помощью поиска нашел все либы в папке opencv и открыл их с помощью coff2omf (применил ко всем просто). Далее нужно что то сделать с dll, я не понимаю что и главное как. Не могли бы вы для "чайника" написать как это сделать или ссылку дать, в нете ищу, ничего толкового пока =( Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 31, 2012 Не нужно ничего делать с dll, пропишите путь к ним в PATH, или перепишите в папку к программе. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Snuff 0 Жалоба Опубликовано May 31, 2012 Заработало вроде, я просто скопировал все длл из opencv в билдер (из bin в bin) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Snuff 0 Жалоба Опубликовано May 31, 2012 Можно вопрос по программе PCA_recognition, там есть папка faces, в ней 40 папок s1-s40, в каждой по 10 файлов. Я так понял это обучающие фотки для системы, выборки, что значит число 40 и 10? Формат фоток .pgm, это же картинка обычная? Тоесть я хочу открыть программу со своими фотками, мне просто нужно их заменить ? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ShurikEv 0 Жалоба Опубликовано May 31, 2012 Можно вопрос по программе PCA_recognition, там есть папка faces, в ней 40 папок s1-s40, в каждой по 10 файлов. Я так понял это обучающие фотки для системы, выборки, что значит число 40 и 10? Формат фоток .pgm, это же картинка обычная? Тоесть я хочу открыть программу со своими фотками, мне просто нужно их заменить ? 40 - количество людей 10 - количество фото каждого человека Т.е. фото каждого человека обучается на массиве из 10 фото. Ясно, что можно обучаться на разных массивах, но чем больше фото, тем лучше. .pgm - это формат изображения. Можно использовать и jpg. Как я понял, необходимо на фото найти область лицы (каскады Хаара), перевести фото в чб-режим, и уже по полученному изображению обучаться. Фото можно и заменить, но лучше разобраться в программе (благо она не сложная) и модифицировать код под свои нужды. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 31, 2012 Ну не просто, а с пониманием того что: 1) это имена файлов (которые должны соответствовать тому, что ожидает программа); 2) pgm - это формат файла, и если используете другой формат, то поменяйте расширение в программе. 3) фотки должны загружаться в однослойном режиме (градации серого). 4) проверить не вбиты ли жестко где-нибудь размеры картинок (я не помню). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Snuff 0 Жалоба Опубликовано May 31, 2012 спасибо, буду разбираться в программе, недавно только начал изучать си Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Flame 1 Жалоба Опубликовано May 31, 2012 Размеры не вбиты, но там должны быть все одного размера, иначе opencv ругается Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Snuff 0 Жалоба Опубликовано May 31, 2012 Еще вопрос, пишу #include <highgui.h>, а он мне ошибку [C++ Error] Unit1.cpp(5): E2209 Unable to open include file 'highgui.h', как можно решить ? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Flame 1 Жалоба Опубликовано May 31, 2012 Надо указать в билдере дополнительные директории исходных файлов. Где то тут на форуме была инструкция как на билдере настроить Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Snuff 0 Жалоба Опубликовано May 31, 2012 Слушай, а ты не мог бы пожалуйста написать? Как нибудь покороче, но для чайника =) Я видел как это делается в Вижуале, а тут не могу найти Вроде как в Directories/Conditionals, только там не понятно, в какую строку что писать =) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Flame 1 Жалоба Опубликовано May 31, 2012 Посмотри тут - ссылка Я просто сам на визуале делаю, и на QT, билдер давно не использовал И лучше используй 2.3.1 или 2.4, в 1.1 вроде глюки есть. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Snuff 0 Жалоба Опубликовано May 31, 2012 понятно, спасибо, я тоже эту ссылку нашел, мне нужно чтоб еще проще объяснили, я всего несколько дней изучаю си Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Flame 1 Жалоба Опубликовано May 31, 2012 Да там надо просто директорию указать, там будет что то типа Include files или типа того, указываешь ему директории где заголовочные файлы лежать и все. Либо кинь все заголовочные файлы *.h в директорию где у тебя экзешник будет уже скомпилированый, а в обьявлении заменяешь #include <highgui.h> на #include "highgui.h" Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Snuff 0 Жалоба Опубликовано May 31, 2012 ппц, вроде как нашел там все, ordered list of include paths называется, вбиваю туда путь C:\opencv\build\include\opencv2\highgui, и вообще по разному все вбиваю туда, различные пути, а он всё равно пишет что не то. А по поводу экзэшника я не совсем понял, что ты мне советовал. А еще тот путь что я пишу туда, он почему то исчезает оттуда постоянно. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Flame 1 Жалоба Опубликовано June 1, 2012 C:\opencv\build\include\opencv C:\opencv\build\include\ надо вот такие Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Flame 1 Жалоба Опубликовано June 7, 2012 Кто может примерно обьяснить что и какой из этих параметров значат и что дают для обучения и распознавания? И обязательно ли ставить одинаковые параметры для обучения и распознавания? const int OBS_WIDTH = 12; const int OBS_HEIGHT = 12; const int NO_DCT_COEFF_X = 4; const int NO_DCT_COEFF_Y = 4; const int STEP_X = 4; const int STEP_Y = 4; const int MAX_ITER = 80; const double STOP_STEP_ITER = 0.01; Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 9, 2012 Use source Luke ! Из hmmobs.cpp (директория modules/legacy), там есть еще несколько hmm-овских файлов, они достаточно неплохо комментированы. //*F/////////////////////////////////////////////////////////////////////////////////////// // Name: icvImgToObs_DCT_8u32f_C1R // Purpose: The function takes as input an image and returns the sequnce of observations // to be used with an embedded HMM; Each observation is top-left block of DCT // coefficient matrix. // Context: // Parameters: img - pointer to the original image ROI // imgStep - full row width of the image in bytes // roi - width and height of ROI in pixels // obs - pointer to resultant observation vectors // dctSize - size of the block for which DCT is calculated // obsSize - size of top-left block of DCT coeffs matrix, which is treated // as observation. Each observation vector consists of // obsSize.width * obsSize.height floats. // The following conditions should be satisfied: // 0 < objSize.width <= dctSize.width, // 0 < objSize.height <= dctSize.height. // delta - dctBlocks are overlapped and this parameter specifies horizontal // and vertical shift. // Returns: // CV_NO_ERR or error code // Notes: // The algorithm is following: // 1. First, number of observation vectors per row and per column are calculated: // // Nx = floor((roi.width - dctSize.width + delta.width)/delta.width); // Ny = floor((roi.height - dctSize.height + delta.height)/delta.height); // // So, total number of observation vectors is Nx*Ny, and total size of // array obs must be >= Nx*Ny*obsSize.width*obsSize.height*sizeof(float). // 2. Observation vectors are calculated in the following loop // ( actual implementation may be different ), where // I[x1:x2,y1:y2] means block of pixels from source image with // x1 <= x < x2, y1 <= y < y2, // D[x1:x2,y1:y2] means sub matrix of DCT matrix D. // O[x,y] means observation vector that corresponds to position // (x*delta.width,y*delta.height) in the source image // ( all indices are counted from 0 ). // // for( y = 0; y < Ny; y++ ) // { // for( x = 0; x < Nx; x++ ) // { // D = DCT(I[x*delta.width : x*delta.width + dctSize.width, // y*delta.height : y*delta.height + dctSize.height]); // O[x,y] = D[0:obsSize.width, 0:obsSize.height]; // } // } //F*/[/code] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах