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

Smorodov

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

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

  • Посещение

  • Days Won

    346

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

  1. Насколько я знаю, OpenCV вполне не плохо идет на таких платках, размеры от 170х170 до 100х100. Мозг от VIA
  2. Иногда, заказать из-за бугра службой доставки - получается дешевле и быстрее.
  3. Есть несколько соображений: 1) Под линуксом заведется 2) 50 $ пока хватит на 320х280, на первое время этого достаточно. (со статикой очень быстро наиграетесь) 3) встраиваемые системы - те-же компы, только дороже, при достаточных средствах их можно запараллелить. 4) для существенного ускорения можно применять графические чипы, как было сказано раньше, многие задачи машинного зрения неплохо распараллеливаются. 6) при дальнейшем развитии (требует больших денег) можно перевести все на программируемую логику. По поводу литературы: мануал, некоторые материалы можно найти на сайте, есть еще Learning OpenCV, но там, насколько показала практика есть небольшие ошибки в примерах. Лучше всего ориентироваться на примеры из директории OpenCV/examples.
  4. Огромное спасибо за отлов багов Насколько я знаю, HMM, в такой реализации, работают с закрытыми наборами данных (адекватный результат может быть получен только для лиц из базы), для открытых наборов, и синтеза применяют PCA (метод собственных компонент). Пример тоже есть на форуме, правда тоже для фиксированной базы, но там похожесть измеряется уже более понятным способом, как расстояние между многомерными векторами. Видимо, лучше использовать этот метод для отсеивания по порогу, а затем применять HMM, для уточнения.
  5. Можно посмотреть здесь http://www.membrana.ru/lenta/index.html?9389 Ссылка на сайт производителя http://www.robedo.com/
  6. На сайте есть собственный jabber сервер. Подключайтесь Формат адреса: ваш_ник@compvision.ru Рекомендуемые программы-клиенты: Miranda http:www.miranda-im.org Trillian http:www.ceruleanstudios.com Psi http:psi-im.org Gaim/Pidgin http:www.pidgin.im Здесь обсуждается статья: Jabber сервер на compvision.ru
  7. Все правильно, вот мои значения likehood[j]: -82,5132369995117 -80,4748992919922 -77,9187850952148 -75,3669357299805 -81,546272277832 -78,8088073730469 -79,0791778564453 Максимальное среди них -75 и все работает. Кто его поймет, как счтиать похожесть . И номер фотки - 3.
  8. TImage & no CV_WINDOW_AUTOSIZE

    Если три канала, то байты B,G,R,B,G,R... и строки вверх ногами относительно BMP . Если один (серое), то обычно, но тогда: unsigned char* image_data; // где-то раньше должно быть src_image= cvCreateImage( cvSize(width,height),IPL_DEPTH_8U,3); // *src_image не должен быть 0 cvGetRawData(src_image, (uchar**)&image_data); C=image_data[i*w+j]; Bitmap->ScanLine=C; Bitmap->ScanLine[i+1]=C; Bitmap->ScanLine[i+2]=C; i+=3; И еще ширина изображения в байтах равна img->widthStep, а не img->width*3, это так, для инфы. Когда ширина изображения кратна 8 то img->widthStep=img->width*3, а если нет тогда не равно. Вот тема была тут: http://www.compvision.ru/forum/index.php?showtopic=121
  9. Занятный девайс http://www.seeedstudio.com/depot/beta-test...nano-p-512.html
  10. TImage & no CV_WINDOW_AUTOSIZE

    Здесь есть пример вывода на любой оконный компонент, зная его Handle: http://www.compvision.ru/forum/index.php?showtopic=2 Там-же есть такой кусок: //********************************************************* // Если не нужно подгонять размер кадра - это можно стереть // Выделяем память под копию кадра if( !frame_copy ) frame_copy = cvCreateImage( cvSize(352,288), IPL_DEPTH_8U, frame->nChannels ); // Масштабируем под заданный размер cvResize( frame, frame_copy, CV_INTER_LINEAR ); // Если не нужно подгонять размер кадра - это можно стереть //********************************************************* Где 352 и 288 и есть размер получаемого кадра(желаемый размер окна) который можно вывести стандартным способом.
  11. Как прикрутить OpenCV к билдеру?

    Запостил в yahoo groups: http://tech.groups.yahoo.com/group/OpenCV/message/66551 Там те-же проблемы, пока без решения.
  12. Как прикрутить OpenCV к билдеру?

    Да, есть ошибки. Я продвинулся чуть дальше, но тоже пока не все гладко, они там с шаблонами сильно накрутили. Попробуйте заголовки определить так: #include <vcl.h> #include <math.h> #include <utility> #include <complex> #include "cv.h" #include "highgui.h"[/code] проблемы с complex исчезнут, но появятся проблемы с шаблонами, что то типа этого: в строчке: // transposition, inversion, per-element multiplication MatExpr_<MatExpr_Op2_<Mat_, double, Mat_, MatOp_T_<Mat> >, Mat_> t() const; Выдает: [bCC32 Error] cxcore.hpp(1253): E2299 Cannot generate template specialization from 'MatExpr_Op2_<A1,A2,M,Op>' и дальше бла бла бла про шаблоны в том же духе PS: В C++Builder 6 проблемы аналогичные.
  13. HOG OpenCV 1.20

    Не надо сорцы трогать , в папке с примерами есть peopledetect.cpp и exe - шник и все работает. #include "cvaux.h" #include "highgui.h" int main(int argc, char** argv) { cv::Mat img; if( argc > 1 ) img = cv::imread(argv[1]); if( !img.data ) { fprintf( stderr, argc == 1 ? "ERROR: no image was specified\n" : "ERROR: the specified image could not be loaded\n"); fprintf( stderr, "Usage: peopledetect <inputimage>\n" ); return -1; } cv::HOGDescriptor hog; hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector()); cv::vector<cv::Rect> found; double t = (double)cv::getTickCount(); // run the detector with default parameters. to get a higher hit-rate // (and more false alarms, respectively), decrease the hitThreshold and // groupThreshold (set groupThreshold to 0 to turn off the grouping completely). hog.detectMultiScale(img, found, 0, cv::Size(8,8), cv::Size(24,16), 1.05, 2); t = (double)cv::getTickCount() - t; printf("Detection time = %gms\n", t*1000./cv::getTickFrequency()); for( int i = 0; i < (int)found.size(); i++ ) { cv::Rect r = found[i]; // the HOG detector returns slightly larger rectangles than the real objects. // so we slightly shrink the rectangles to get a nicer output. r.x += cvRound(r.width*0.1); r.y += cvRound(r.height*0.1); r.width = cvRound(r.width*0.8); r.height = cvRound(r.height*0.8); cv::rectangle(img, r.tl(), r.br(), cv::Scalar(0,255,0), 1); } cv::namedWindow("people detector", 1); cv::imshow("people detector", img); cv::waitKey(0); return 0; }[/code]
  14. Шаблоны движения (motion templates)

    Фильтр Кальмана - это прежде всего фильтр. Он не может предсказывать, но за то, может откорректировать то что Вы намеряли (рассчитали). Вы же определяете координаты объектов в текущий момент времени. Так-же можно определить положения и в следующий момент. Потом скорректировать значения координат используя фильтр. Разделение объектов можно производить по признаку максимальной схожести свойств объекта на предыдущем и следующем кадре. В качестве такого свойства можно принять скорость, можно добавить еще что нибудь допустим, координаты и цвет.
  15. Синтез 3D модели по срезам

    Непосредственных методов в OpenCV нет. Про методы томографии литературу можно взять здесь: http://rapidlibrary.com/index.php?q=3d+tom...&filetype=0 PS: по моему, в библиотеке MATFOR был пример такого преобразования.
  16. stereovision

    В магазинах (а питерском доме книги видел за 1000 с небольшим руб.) продается книжка (переводная), оригинал (англ.) можно посмотреть здесь: http://rapidlibrary.com/index.php?q=comput...&filetype=0 Обложка у переведенной точно такая-же. Там описаны методы и восстановления трехмерных изображений в том числе. В интернете есть еще достаточно много материала по теме, но он на англ. Есть еще книжка в эл. виде англ. посвященная трехмерному машинному зрению, если интересно - вышлю по е-майл. Сам программы такие пока не писал.
  17. Я считаю, что объемы поставок импортного высокотехнологичного оборудования и заинтересованность иностранцев в том чтобы занять наш рынок, могут ответить на вопрос насчет спроса. Однако, чтобы достичь уровня рентабельного производства такого оборудования необходимы достаточно большие вложения и время на подготовку специалистов, а так-же разработку соответствующего законодательства. PS: Те-же добывающие производства требуют наличия высокотехнологичного оборудования.
  18. stereovision

    Спасибо, про structure from motion не знал, в википедии ссылка на неплохое вводное описание (англ.) ссылка И здесь иллюстрация стереокинетического эффекта : http://www.michaelbach.de/ot/mot_ske/index.html PS: Кстати на таких эффектах интересно проверять и некоторые алгоритмы машинного зрения. PPS: Иеще по теме : http://www.membrana.ru/lenta/index.html?9649
  19. Я нашел ресурсы по теме на сайте МГУ. По поводу робототехники, толковой современной отечественной литературы почти нет, встречается, в основном литература предназначенная для читателей, владеющих предметом не хуже автора книжки Качественной литературы на английском достаточно много, за счет её перевода пополняется рынок толковой литературы на русском языке. Что касается образования, то в наших вузах продвинутые лаборатории учат на иностранном оборудовании. Стоит сказать, что на курсовые и дипломные проекты, за рубежом преподаватель получает десятки тысяч баксов в год (на каждый проект ~10-20 т.). А у нас, что купил на свои то и привинтил ну и интуазизм Вот такое состояние. Поле для развития огромное.
  20. Фильтр Калмана

    Есть еще такой класс для двумерных координат, откопал на просторах и-нета (перевел часть комментов, но не тестил правда пока): Вот файл: Kalman2.rar, А вот что внутри: class KalmanFilter { public: KalmanFilter(); ~KalmanFilter(); virtual void predictionBegin(float x,float y); virtual void predictionUpdate(float x,float y); virtual void predictionReport(CvPoint &pnt); private: CvKalman *m_pKalmanFilter; CvRandState rng; CvMat* state; CvMat* process_noise; CvMat* measurement; CvMat* measurement_noise; bool m_bMeasurement; clock_t m_timeLastMeasurement; CRITICAL_SECTION mutexPrediction; }; // Инициализация фильтра Кальмана KalmanFilter::KalmanFilter() { m_timeLastMeasurement = clock(); int dynam_params = 4; // x,y,dx,dy int measure_params = 2; m_pKalmanFilter = cvCreateKalman(dynam_params, measure_params); state = cvCreateMat( dynam_params, 1, CV_32FC1 ); // Генератор случайных чисел cvRandInit( &rng, 0, 1, -1, CV_RAND_UNI ); cvRandSetRange( &rng, 0, 1, 0 ); rng.disttype = CV_RAND_NORMAL; cvRand( &rng, state ); process_noise = cvCreateMat( dynam_params, 1, CV_32FC1 ); // (w_k) measurement = cvCreateMat( measure_params, 1, CV_32FC1 ); // two parameters for x,y (z_k) measurement_noise = cvCreateMat( measure_params, 1, CV_32FC1 ); // two parameters for x,y (v_k) cvZero(measurement); // F matrix data // F is transition matrix. It relates how the states interact // For single input fixed velocity the new value // depends on the previous value and velocity- hence 1 0 1 0 // on top line. Новое значение скорости не зависит от предыдущего // значения координаты, и зависит только от предыдущей скорости- поэтому 0 1 0 1 on second row const float F[] = { 1, 0, 1, 0,//x + dx 0, 1, 0, 1,//y + dy 0, 0, 1, 0,//dx = dx 0, 0, 0, 1,//dy = dy }; memcpy( m_pKalmanFilter->transition_matrix->data.fl, F, sizeof(F)); cvSetIdentity( m_pKalmanFilter->measurement_matrix, cvRealScalar(1) ); // (H) cvSetIdentity( m_pKalmanFilter->process_noise_cov, cvRealScalar(1e-5) ); // (Q) cvSetIdentity( m_pKalmanFilter->measurement_noise_cov, cvRealScalar(1e-1) ); // (R) cvSetIdentity( m_pKalmanFilter->error_cov_post, cvRealScalar(1)); // choose random initial state cvRand( &rng, m_pKalmanFilter->state_post ); InitializeCriticalSection(&mutexPrediction); } KalmanFilter::~KalmanFilter() { // Деструктор cvReleaseMat( &state ); cvReleaseMat( &process_noise ); cvReleaseMat( &measurement ); cvReleaseMat( &measurement_noise ); cvReleaseKalman( &m_pKalmanFilter ); DeleteCriticalSection(&mutexPrediction); } // Устанавливаем значения переменных фильтра на первом шаге // Если этого не сделать, то объект не будет трекаться void KalmanFilter::predictionBegin(float x,float y) { //В переменной m_pKalmanFilter->state_post хранится предыдущее состояние m_pKalmanFilter->state_post->data.fl[0] = x; //координата x m_pKalmanFilter->state_post->data.fl[1] = y; //координата y m_pKalmanFilter->state_post->data.fl[2] = (float)0; //dx - скорость по x m_pKalmanFilter->state_post->data.fl[3] = (float)0; //dy - скорость по y } void KalmanFilter::predictionUpdate(float x,float y) { EnterCriticalSection(&mutexPrediction); state->data.fl[0] = x; //center x state->data.fl[1] = y; //center y m_bMeasurement = true; LeaveCriticalSection(&mutexPrediction); } void KalmanFilter::predictionReport(CvPoint &pnt) { clock_t timeCurrent = clock(); EnterCriticalSection(&mutexPrediction); const CvMat* prediction = cvKalmanPredict( m_pKalmanFilter, 0 ); pnt.x = prediction->data.fl[0]; pnt.y = prediction->data.fl[1]; // Если мы получили действительные данные недавно, тогда используем полученные данные для корректировки // состояния фильтра. Если мы не получили данные, тогда корректируем состояние фильтра, используя предсказанные значения if (m_bMeasurement) //(timeCurrent - m_timeLastMeasurement < TIME_OUT_LOCATION_UPDATE) // используем действительные данные { m_bMeasurement = false; } // Обычно фильтр работает быстрее чем поступают данные измерений.. // Таким образом, можно дать фильтру брать данные из предсказанных значений в промежутках между измерениями // (делает работу трекера более плавной) else // используем предсказанные данные { state->data.fl[0] = pnt.x; state->data.fl[1] = pnt.y; } // генерируем шум измерения noise(z_k) cvRandSetRange( &rng, 0, sqrt(m_pKalmanFilter->measurement_noise_cov->data.fl[0]), 0 ); cvRand( &rng, measurement_noise ); // zk = Hk * xk + vk // measurement = measurement_error_matrix * current_state + measurement_noise cvMatMulAdd( m_pKalmanFilter->measurement_matrix, state, measurement_noise, measurement ); // уточняем состояние фильтра cvKalmanCorrect( m_pKalmanFilter, measurement ); // гененрируем шум процесса(w_k) cvRandSetRange( &rng, 0, sqrt(m_pKalmanFilter->process_noise_cov->data.fl[0]), 0 ); cvRand( &rng, process_noise ); // xk = F * xk-1 + B * uk + wk // state = transition_matrix * previous_state + control_matrix * control_input + noise cvMatMulAdd( m_pKalmanFilter->transition_matrix, state, process_noise, state ); LeaveCriticalSection(&mutexPrediction); }[/code]
  21. Фильтр Калмана

    Листинг попытаюсь пояснить (что сам понял) потом. А пока вот что перевел (очень сырой вариант), может чего добавите Фильтр_Кальмана.rar
  22. stereovision

    Это вряд ли. Нужны два изображения, полученные из разных точек. Можно если использовать фотоаппарат, например (фотографировать из разных точек, правда надо точно знать взаимное расположение мест съемки). А вообще, в интернете есть стереофотографии с параметрами съемки, можно на них поэкспериментировать, если очень хочется
  23. С Днем Программиста - 256-м днем в году! Сегодня отмечается День Программиста день №0x100 в году, праздник, с недавнего времени, официальный и государственный. Всем творческих успехов и поменьше отладки , а так же побольше зарплаты и понимания со стороны начальства . Будем добиваться, чтобы в году было 1024 дня, а в километре 1024 метра С праздником еще раз!
  24. Никто не спорит Просто чтобы лучше что то понять, иногда надо соорудить велосипед
  25. OpenCV и Linux

    В линуксе можно, GCC или QT4. И здесь посмотрите http://walkintothefuture.blogspot.com/2009...java-linux.html
×