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

Nuzhny

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

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

  • Посещение

  • Days Won

    176

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

  1. Работа с камерами

    Какой язык, какая ОС? На мой вкус, boost::thread один из самых удобных кросплатформенных вариантов для С++.
  2. Работа с контурами

    Выдели в студии весь текст и нажми Ctrl+K+F. Весь код отформатируется, сразу увидишь недостающую скобку.
  3. Да, все процедуры с выводом надо будет переписать. Самый лучший способ замера производительности - это профайлер (например, VTune).
  4. Надо сказать, что GDI по-разному работает в XP/Vista/7, с включённым и выключенным Aero. Самая медленная и неудачная реализация в Висте. Аппаратное ускорения GDI поддерживает только для операций блитинга (BitBlt, StrenchBlt и т.п.). Рисование линий к ним не относится. Я бы использовал DirectX или OpenGL: и проще, и быстрей, и удобней. Поначалу может быть просто непривычно.
  5. Majority фильтр

    Вот, набросал (ничего, что без комментариев?): bool majority_filter(IplImage* src_img, IplImage* dest_img, int filter_size) { if (!(filter_size % 2) || src_img->width != dest_img->width || src_img->height != dest_img->height || src_img->nChannels > 1 || dest_img->nChannels > 1) return false; int filter_size_2 = filter_size / 2; CvRect r = cvRect(0, 0, filter_size, filter_size); int bins = 255; int hist_size[] = { bins }; float range[] = { 0, 255 }; float* ranges[] = { range }; CvHistogram* hist = cvCreateHist(1, hist_size, CV_HIST_ARRAY, ranges, 1); for (int y = 0; y < src_img->height; ++y) { r.y = y - filter_size_2; if (r.y < 0) { r.height = filter_size + r.y; r.y = 0; } else if (r.y + filter_size > src_img->height) { r.height = src_img->height - r.y; } else r.height = filter_size; for (int x = 0; x < src_img->width; ++x) { r.x = x - filter_size_2; if (r.x < 0) { r.width = filter_size + r.x; r.x = 0; } else if (r.x + filter_size > src_img->width) { r.width = src_img->width - r.x; } else r.width = filter_size; cvSetImageROI(src_img, r); cvCalcHist(&src_img, hist, 0, 0); int max1 = 0, max2 = 0; int ind1 = 0, ind2 = 0; for (int i = 0; i < bins; ++i) { CvScalar v = cvGet1D(hist->bins, i); if ((int)v.val[0] >= max1) { max2 = max1; ind2 = ind1; max1 = (int)v.val[0]; ind1 = i; } } cvResetImageROI(src_img); if (max1 > max2) cvSet2D(dest_img, y, x, cvScalar(ind1)); } } cvReleaseHist(&hist); return true; } //////////////////////////////////////////////////////////////////////////// void print_img(const IplImage* img) { for (int y = 0; y < img->height; ++y) { for (int x = 0; x < img->width; ++x) { CvScalar v = cvGet2D(img, y, x); printf("% 4.0f ", v.val[0]); } printf("\n"); } printf("\n"); } //////////////////////////////////////////////////////////////////////////// int _tmain(int argc, _TCHAR* argv[]) { cvNamedWindow("before", 0); cvNamedWindow("after", 0); #if 0 IplImage* img1 = cvLoadImage("D:\\video_bmp\\black_23.jpg", 0); #else IplImage* img1 = cvCreateImage(cvSize(6, 6), 8, 1); char data[] = { 4, 4, 4, 4, -3, 7, 0, 0, \ 4, 4, 7, 7, 7, 7, 0, 0, \ 5, 5, 7, 7, 6, 7, 0, 0, \ 5, 5, 5, 5, 5, 6, 0, 0, \ 7, 7, 5, 5, 5, 5, 0, 0, \ 7, 0, 5, 2, 0, 0, 0, 0 }; memcpy(img1->imageData, data, sizeof(data)); #endif cvShowImage("before", img1); IplImage* img2 = cvCloneImage(img1); majority_filter(img1, img2, 3); cvShowImage("after", img2); print_img(img1); print_img(img2); cvWaitKey(0); cvReleaseImage(&img1); cvReleaseImage(&img2); cvDestroyAllWindows(); return 0; } //////////////////////////////////////////////////////////////////////////// В качестве примера я брал и обычные изображения (однотонные, gray), и пример из твоей ссылки. Результат выводится в консоль, совпадает с результатом по ссылке, который находится под чертой. Я правильно понимаю, что по изображению просто проходят каким-то окном (нечётного размера), находят максимально встречающееся значение и присваивают в текущую позицию? Если да, то ответ по ссылке не совсем правильный: в верхней строке, четвёртый элемент должен быть "7", так как вокруг него находится две "4", три "7" и одна "-3". Так же?
  6. Majority фильтр

    Он довольно прост. Если хочешь, могу реализовать его.
  7. Различимых цветов, конечно, больше. HSV гораздо удобней, для манипуляции с цветами. Но я бы взял готовые цвета.
  8. Работа с камерами

    У тебя установлен k-lite codeck pack? С ним ставится graphstudio.exe. Попробуй через неё захватить и вывести видео. Получилось? Значит, через OpenCV тоже должно (graphstudio работает через DirectShow). Если там получается, а в OpenCV нет, то надо в отладчике смотреть как внутри производится захват.
  9. Ничего простого в голову не приходят. Можно отсортировать цвета по похожести (например, как по твоей ссылке). А потом... По модели сегментации построить граф и по нему подбирать цвета: соседние вершины должны иметь цвета, расстояние между которыми в списке больше, скажем, 10.
  10. Работа с камерами

    Поиск в гугле даёт несколько ссылок, например.
  11. Цвета радуги с определённым шагом? Работать будешь в HSV?
  12. Mahalonobis

    Где-то есть деление на ноль. Смотри свои данные.
  13. cvResize в версии 2.2

    Это больше, чем просто ник - фамилия.
  14. cvResize в версии 2.2

    Это совпадение. Неделю назад я переехал на OpenCV 2.2 специально ради того, чтобы попробовать прикрутить к своему проекту распознавание людей. И столкнулся ровно с теми же проблемами.
  15. cvResize в версии 2.2

    Она переехала в модуль imgproc.
  16. Распознавание лиц

    Примеры есть
  17. HOG OpenCV 1.20

    Довольно популярная библиотека - SMV-lite. Её использовали авторы статьи "Histograms of Oriented Gradients for Human Detection" Navneet Dalal and Bill Triggs
  18. HOG OpenCV 1.20

    Теоретически: 1. создать обучающую выборку изображений, вычислить для них HOG дескрипторы (HOGDescriptor::compute); 2. обучить SMV (CvSVM::train) и сохранить результаты обучения в виде массива float; 3. загрузить результаты обучения HOGDescriptor::setSVMDetector
  19. Распознавание лиц

    peopledetect из OpenCV использует дескрипторы HOG с классификатором SVM.
  20. проблема с cvThreshold

    Похоже, что у тебя и правда проблемы с окружением, а не с программой. Мой вариант у меня работает правильно. Попробуй, кстати, с отладочной и релизной OpenCV запустить. Разница есть?
  21. проблема с cvThreshold

    cvCvtScale нечаянно осталась. Лучше выложи своё изображение, чтобы не гадать.
  22. opencv 2.2

    Он называется peopledetect. GPU не нужно
  23. opencv 2.2

    В версии OpenCV из SVN пример детектора выглядит по-другому. И работает.
  24. проблема с cvThreshold

    А если так? IplImage* in = cvLoadImage(argv[1],CV_LOAD_IMAGE_ANYCOLOR); IplImage* r = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // R channel IplImage* g = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // G channel IplImage* b = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // B channel IplImage* fon = cvLoadImage(argv[2],CV_LOAD_IMAGE_ANYCOLOR); IplImage* r_fon = cvCreateImage(cvGetSize(fon), IPL_DEPTH_8U, 1); // R channel IplImage* g_fon = cvCreateImage(cvGetSize(fon), IPL_DEPTH_8U, 1); // G channel IplImage* b_fon = cvCreateImage(cvGetSize(fon), IPL_DEPTH_8U, 1); // B channel IplImage* r_dst = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // R channel IplImage* g_dst = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // G channel IplImage* b_dst = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1); // B channel cvSplit(in, r, g, b, NULL); cvSplit(fon, r_fon, g_fon, b_fon, NULL); cvAbsDiff(g,g_fon,r_dst); cvAbsDiff(g,g_fon,g_dst); cvAbsDiff(b,b_fon,b_dst); cvThreshold(r_dst,r_dst,50,255,CV_THRESH_BINARY); cvThreshold(g_dst,g_dst,50,255,CV_THRESH_BINARY); cvThreshold(b_dst,b_dst,50,255,CV_THRESH_BINARY); cvErode(r_dst,r_dst,NULL,1); cvErode(g_dst,g_dst,NULL,1); cvErode(b_dst,b_dst,NULL,1); cvDilate(r_dst,r_dst,NULL,1); cvDilate(g_dst,g_dst,NULL,1); cvDilate(b_dst,b_dst,NULL,1); IplImage* out_img = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 3); cvCvtScale cvCvtColor(r_dst, out_img, CV_GRAY2RGB); cvShowImage("R",out_img); cvCvtColor(g_dst, out_img, CV_GRAY2RGB); cvShowImage("G",out_img); cvCvtColor(b_dst, out_img, CV_GRAY2RGB); cvShowImage("B",out_img); cvWaitKey(0); cvReleaseImage(&out_img); cvReleaseImage(&in); cvReleaseImage(&r); cvReleaseImage(&g); cvReleaseImage(&; cvReleaseImage(&fon); cvReleaseImage(&r_fon); cvReleaseImage(&g_fon); cvReleaseImage(&b_fon); cvReleaseImage(&r_dst); cvReleaseImage(&g_dst); cvReleaseImage(&b_dst); cvDestroyAllWindows();[/code]
  25. На С/С++. На php web-морда.
×