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

Поиск по сайту

Showing results for tags 'OpenCV'.



More search options

  • Search By Tags

    Введите теги через запятую.
  • Search By Author

Тип содержимого


Категории и разделы

  • Пакет OpenCV
    • OpenCV
    • Новости
    • Вопросы взаимодействия OpenCV + GDI, GDI+
  • Дополненная реальность (ARToolkit и др.)
    • ARToolkit
  • Нейросети
    • Вопросы по нейросетям и ИИ
  • Общие вопросы
    • Обсуждение общих вопросов
  • Другое

Найдено 56 результатов

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

    Здраствуйте! Мне нужна программа для распознования лиц с картинки используя нейросети с помощью метода HOG. Хорошо если на С#. Можете мне как-то помочь??
  2. Подскажите, пожалуйста, чем лучше распознать слабо отличимые от фона линии, например линии на руке. Я понимаю что скорее всего надо применять усиливающие фильтры (или поднимать контраст), но может есть какие-то специальные алгоритмы, упрощающие жизнь?
  3. Доброго времени суток. Как возможно установить OpenCV 3.3 в связке с Cuda 8.0 через CMake GUI? Пытался делать по инструкции http://jamesbowley.co.uk/buildcompile-opencv-v3-3-on-windows-with-cuda-8-0-and-intel-mkltbb/ (без Intel SDK), но сборка в Visual Studio не прекращается в течении 3-4 часов. Может есть где готовые RAR архивы с готовыми сборками OpenCV 3.3 + Cuda 8.0?
  4. Здравствуйте! Есть следующая задача: необходимо найти 2 ярких красных светодиода в real-time. Сделал это с помощью перехода в HSV и поиска блобов по каждому из каналов - скорость получилась неподходяще малой, зато точность прекрасна. Теперь нужно это ускорить, есть идея попробовать уйти от блобов - но итог этого не порадовал по точности абсолютно - система получилась очень сильно зависимая от окружающего освещения. Как можно это решить, какие методы использовать? Необходимо найти яркие диоды (2 штуки), окружающее освещение - лампы дневного света, в идеале более 20fps.
  5. Установка opencv на python

    Что делать если после установки opencv на python, при наборе а командной строке import cv2 возникает ошибка? При это если набирать в idle ошибки нет.
  6. Добрый день. Подскажите, какие есть варианты для очистки изображения от "шума"? Под шумом подразумеваю печатный текст "пiдпис" и "№". Нюанс еще в том, что этот текст может быть напечатан разными шрифтами и разного размера. Пробовал удалить наложением эталона с логическим AND. Получается, но далеко не идеально. Возможно, есть другой вариант очистки? P.S. Угловой перекос устранил, линии удалил. Вопрос исключительно по очистке от печатного текста.
  7. ASM/AAM в OpenCV

    Добрый день! Хочу написать программу, распознающую основные эмоции человека по видеопотоку вебки, используя opencv. Насколько я понимаю, наиболее подходящими для меня будут алгоритмы aam/asm, позволяющие выделить основные морфологические точки лица, по взаимному расположению которых я и определю эмоцию. Вопрос - эти алгоритмы реализованы в opencv? Если да - есть ли демки/примеры, как называются классы? В ходе непродолжительного гуглинга актуальный ответ найти не удалось.
  8. Привет коллеги! Прошу помощи! Как написать собственную прошивку для камер Hikvision? Есть алгоритмы детектор огня, оставленных предметов, распознавание номеров, трекинг, автотрекинг. Хочу, чтобы эти алгоритмы работали в голове камеры и выдавали результат в виде текста на изображении, либо выделением области цветом. Как это сделать? Что почитать? Как нужно откомпилировать проект Opencv, чтобы его библиотеки тоже вошли в прошивку? Любой информации буду рад.
  9. кто сможет реализовать? 1. Константирование - повышение контрастности изображения нелинейным оператором преобразования. 2. Фильтрация - Нелинейная локальная фильтрация медианным фильтром для подавления шумов. 3. Выделение границ оператором Собела. 4. Триангуляция. подробности и формулы пришлю в лс.
  10. Размытие

    В общем, писать самой код для размытия смысла нет, т.к. он есть на робокрафте http://robocraft.ru/blog/computervision/281.html Но суть в том, что дали задание - Сделать фильм, в котором исходная картинка подвергается размытию с возрастающим размером шаблона. То есть, постепенно размывается. Для алгоритма размытия используйте гауссов фильтр или медианный фильтр. Как его сделать, в душе не чаю. Может кто-то помочь?
  11. компилирую и запускаю пример http://docs.opencv.org/2.4/doc/tutorials/features2d/feature_homography/feature_homography.html но не проходит проверку if( !img_object.data || !img_scene.data ) { std::cout<< " --(!) Error reading images " << std::endl; return -1; } с чем это может быть связанно и как это исправить? А так же каким лучше методом узнать на сколько отличаются изображения друг от друга(например другое может быть немного меньше, со сдвигами и повернуто), после чего восстановить второе на сколько это возможно близко к первому? В каком направлении лучше копать? p.s.: vs17; opencv 2.4.13
  12. Доброго времени суток всем. Такая проблема случилась, что надо мне писать диплом, а я до сих пор не могу настроить взаимодействие двух библиотек. Суть такова, что надо через камеру для микроскопа ToupCam получать видео в реальном времени (интерферограмму, если кому интересно) и так же в режиме on-line выполнять с этим видео некие манипуляции, такие как получение гистограммы, ДПФ - фильтрация - обратное ДПФ и т.д. Для разработки была выбрана библиотека OpenCV, но она не желает определять камеру и подключаться к ней. Из китайских форумов я понял, что это нормально. В комплекте с камерой идет SDK под любую платформу и даже небольшая инструкция с описанием функций, но это не шибко помогает. Мне надо получить изображение с камеры, перегнать его в cv::Mat и дальше уже все нормально будет. Вот. А теперь вопрос. Сталкивался ли кто-нибудь с подобным сочетанием библиотек? И если да, могли бы вы поделиться если не готовым кодом, то хотя бы объяснить доступным языком, в какую сторону мне копать? P.S. Нашел на форуме реализацию ДПФ и обратного ДПФ, за что хотелось бы выразить огромную благодарность тов-щу smorodov за красивый код и комментарии в нем. P.P.S. На всякий случай приложу документацию по SDK, если это поможет. en.html
  13. кто может помочь? Регулировка диаметра кристалла путем оптического сканирования величины диаметра с помощью телевизионной системы в C++ OpenCV. нужно найти яркую дугу и определить ее диаметр в пикселях, а потом перевести значение соответствующее реальному значению в миллиметрах. Пример как должно быть см. в приложении 6.pdf
  14. Доброго времени суток. Возникла необходимость считать количество людей заходящих в помещение и выходящих из него. Это я реализовал. Но еще необходимо реализовать подсчёт сколько людей находится еще в помещении.Пример: вошло 15 человек, вышло 9, осталось в помещении 6 человек. если наглядно то надо что-то вроде этого - https://www.youtube.com/watch?v=W-gDfr_G7GA&t=1s #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include<iostream> #include<conio.h> // it may be necessary to change or remove this line if not using Windows #include <fstream> // file utils #include <ctime> // timestamp stuff #include "Blob.h" #define SHOW_STEPS // un-comment or comment this line to show steps or not #define FRAME_SCALE 1 // divide frame dimentions by this number /////////////////////////////////////////////////////////////////////////////////////////////////// int main(void) { cv::VideoCapture capVideo; std::ofstream myfile; // log file cv::Mat imgFrame1; cv::Mat imgFrame2; cv::Mat imgFrame1L; cv::Mat imgFrame2L; std::vector<Blob> blobs; cv::Point crossingLine[2]; int ShopCountL = 0; int ShopCountR = 0; capVideo.open("input1_2.MOV"); if (capVideo.get(CV_CAP_PROP_FRAME_COUNT) < 2) { std::cout << "error: video file must have at least two frames"; _getch(); // it may be necessary to change or remove this line if not using Windows return(0); } capVideo.read(imgFrame1L); capVideo.read(imgFrame2L); int intVerticalLinePosition = (int)std::round((double)imgFrame1.cols * 0.50); crossingLine[0].y = 0; crossingLine[0].x = intVerticalLinePosition; crossingLine[1].y = imgFrame1.rows - 1; crossingLine[1].x = intVerticalLinePosition; char chCheckForEscKey = 0; bool blnFirstFrame = true; int frameCount = 2; imgFrame2Copy = imgFrame2.clone(); // get another copy of frame 2 since we changed the previous frame 2 copy in the processing above drawBlobInfoOnImage(blobs, imgFrame2Copy); int blnAtLeastOneBlobCrossedTheLine = checkIfBlobsCrossedTheLine(blobs, intVerticalLinePosition, ShopCountL, ShopCountR, myfile); if (blnAtLeastOneBlobCrossedTheLine == 1) { cv::line(imgFrame2Copy, crossingLine[0], crossingLine[1], SCALAR_GREEN, 2); } else if (blnAtLeastOneBlobCrossedTheLine == 2) { cv::line(imgFrame2Copy, crossingLine[0], crossingLine[1], SCALAR_YELLOW, 2); } else { cv::line(imgFrame2Copy, crossingLine[0], crossingLine[1], SCALAR_BLUE, 2); } drawShopCountOnImage(ShopCountL, ShopCountR, imgFrame2Copy); cv::imshow("People_Counting_Cross_Line", imgFrame2Copy); currentFrameBlobs.clear(); imgFrame1 = imgFrame2.clone(); // move frame 1 up to where frame 2 is capVideo.read(imgFrame2); if ((capVideo.get(CV_CAP_PROP_POS_FRAMES) + 1) < capVideo.get(CV_CAP_PROP_FRAME_COUNT)) { capVideo.read(imgFrame2L); resize(imgFrame2L, imgFrame2, cv::Size(imgFrame2L.size().width / FRAME_SCALE, imgFrame2L.size().height / FRAME_SCALE)); } else { time_t now = time(0); char* dt = strtok(ctime(&now), "\n");; std::cout << dt << ",EOF" << std::endl; return(0); // end? } blnFirstFrame = false; frameCount++; chCheckForEscKey = cv::waitKey(1); } if (chCheckForEscKey != 27) { // if the user did not press esc (i.e. we reached the end of the video) cv::waitKey(0); // hold the windows open to allow the "end of video" message to show } return(0); } /////////////////////////////////////////////////////////////////////////////////////////////////// bool checkIfBlobsCrossedTheLine(std::vector<Blob> &blobs, int &intVerticalLinePosition, int &ShopCountL, int &ShopCountR, std::ofstream &myfile) { bool blnAtLeastOneBlobCrossedTheLine = 0; for (auto blob : blobs) { if (blob.blnStillBeingTracked == true && blob.centerPositions.size() >= 2) { int prevFrameIndex = (int)blob.centerPositions.size() - 2; int currFrameIndex = (int)blob.centerPositions.size() - 1; //going left if (blob.centerPositions[prevFrameIndex].x > intVerticalLinePosition && blob.centerPositions[currFrameIndex].x <= intVerticalLinePosition) { ShopCountL++;[B][SIZE="3"]вычисление сколько вошло[/SIZE][/B] [B]вот тут должно быть вычисление сколько осталось еще внутри[/B] time_t now = time(0); char* dt = strtok(ctime(&now), "\n");; std::cout << dt << ",1,0 (Left)" << std::endl; myfile << dt << ",1,0" << std::endl; blnAtLeastOneBlobCrossedTheLine = 1; } // going right if (blob.centerPositions[prevFrameIndex].x < intVerticalLinePosition && blob.centerPositions[currFrameIndex].x >= intVerticalLinePosition) { ShopCountR++;[B]А вот тут сколько вышло[/B] time_t now = time(0); char* dt = strtok(ctime(&now), "\n");; std::cout << dt << ",0,1 (Right)" << std::endl; myfile << dt << ",0,1" << std::endl; blnAtLeastOneBlobCrossedTheLine = 2; } } } return blnAtLeastOneBlobCrossedTheLine; } /////////////////////////////////////////////////////////////////////////////////////////////////// void drawBlobInfoOnImage(std::vector<Blob> &blobs, cv::Mat &imgFrame2Copy) { for (unsigned int i = 0; i < blobs.size(); i++) { if (blobs[i].blnStillBeingTracked == true) { cv::rectangle(imgFrame2Copy, blobs[i].currentBoundingRect, SCALAR_RED, 2); int intFontFace = CV_FONT_HERSHEY_SIMPLEX; double dblFontScale = blobs[i].dblCurrentDiagonalSize / 60.0; int intFontThickness = (int)std::round(dblFontScale * 1.0); cv::putText(imgFrame2Copy, std::to_string(i), blobs[i].centerPositions.back(), intFontFace, dblFontScale, SCALAR_GREEN, intFontThickness); } } }
  15. Всем привет, Как многим известно, под linux opencv активно использует библиотеку ffmpeg для чтения видео, а эта библиотека, в зависимости от окружения и кодеков, которыми записаны видео, может отдавать не bit exact'ные кадры. И возникла необходимость закодировать видео так, чтобы перекодирование прошло без потери качества и в любом окружении выдавались одинаковые кадры. Судя по всему, для этой задачи мне нужно использовать x264 кодек, но вот как нарулить правильное сочетание флагов, чтобы пожалось всё без потери качества - никак не соображу. Может кто-то сталкивался с такой проблемой и имеет готовое решение?
  16. Доброго времени суток. Есть задача написать распознавание текста на российском паспорте. Выбрал технологии: 1) OpencvSharp - обертка opencv для c# 2) Tesseract для распознавания текста Вопросы такие: 1) Какие фильтры(алгоритмы) применить и в какой последовательности для подготовки скана к распознаванию тессерактом. 2) Дельные советы нужны по тому как найти например в распознанном тексте фамилию или текст кем выдан.
  17. LIFT

    Нарушил многолетнее молчание и зафигачил новый пост на Хабру про последние достижения науки и техники в области Feature Matching'а: https://habrahabr.ru/post/323688/ Т.ч. кому интересна тема, вэлкам) Критика, пожелания, замечания приветствуются!
  18. Создал проект на Qt под OpenCV тестовый после подключения библиотеки, но проект не собирается и пишет ошибку при компиляции "undefined reference to 'cvloadimage' ", в *pro файле прописал следующие: Код QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = untitled2 TEMPLATE = app # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked as deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += main.cpp\ mainwindow.cpp HEADERS += mainwindow.h FORMS += mainwindow.ui INCLUDEPATH+=C:\OpenCV\opencv-master\build\install\include\ INCLUDEPATH+=C:\OpenCV\opencv-master\build\install\include\opencv INCLUDEPATH+=C:\OpenCV\opencv-master\build\install\include\opencv2\ INCLUDEPATH+=C:\OpenCV\opencv-master\build\install\include\opencv2\imgproc INCLUDEPATH+=C:\OpenCV\opencv-master\build\install\include\opencv2\highgui LIBS+= -L\C:\OpenCV\opencv-master\build\lib\libopencv_highgui_pch_dephelp.a LIBS+= -L\C:\OpenCV\opencv-master\build\lib\libopencv_highgui320.dll.a LIBS+= -L\C:\OpenCV\opencv-master\build\lib\libopencv_imgproc320.dll.a SOURCES += Исходник в main: C++ (Qt)Выделить код 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include "mainwindow.h" #include <QApplication> #include <opencv/cv.h> #include <cvv.hpp> #include <stdlib.h> #include <stdio.h> #include <imgproc.hpp> #include <highgui.hpp> #include <iostream> using namespace cv; using namespace std; IplImage* image = 0; int main(int argc, char *argv[]) { const char* filename = argc == 2 ? argv[1] : "1calib.png"; // получаем картинку image = cvLoadImage(filename,1); QApplication a(argc, argv); MainWindow w; IplImage *img = cvLoadImage("1calib.png"); cvNamedWindow("Hello, QT! From OpenCV!"); cvShowImage("Hello, QT! From OpenCV!", img); cvWaitKey(); w.show(); return a.exec(); } После прописки pro файла qmake запускал, но компилятор все равно не видит функцию.Помогите разобраться с этой проблемой, а то я еще не начал даже разбираться с OpenCv а уже затык, на ровном месте. Вот не много подправил pro файл ошибка та же INCLUDEPATH+=C:\OpenCV\opencv-master\build\install\include\ INCLUDEPATH+=C:\OpenCV\opencv-master\build\install\include\opencv INCLUDEPATH+=C:\OpenCV\opencv-master\build\install\include\opencv2\ LIBS+= C:\OpenCV\opencv-master\build\lib\libopencv_core320.dll.a LIBS+= C:\OpenCV\opencv-master\build\lib\libopencv_highgui_pch_dephelp.a LIBS+= C:\OpenCV\opencv-master\build\lib\libopencv_highgui320.dll.a LIBS+= C:\OpenCV\opencv-master\build\lib\libopencv_imgproc320.dll.a
  19. Qt и OpenCV подружить

    Здравствуйте. Помогите настроить OpenCV 2.4.9 в QT 4.7.4. QtCreator 2.2.1 Что-то не так делаю? На рисунках видно что он говорит "не могу найти объявления функций"? Или что-то другое?
  20. Добрый день! Есть определенная программа, которая определяет доминирующие цвета на изображении и выводит новое изображение в найденных цветах (из RGB в HSV). Теперь к самой проблеме: не пойму как изменить программу так, чтобы изменить количество доминирующих цветов (то есть использовать, например, только 20% доминирующих цветов) и привязать это к кнопкам. Программа используется для уменьшения объема памяти, занимаемого изображением. Заранее спасибо за помощь! // // определение преобладающих цветов на изображении // при помощи k-Means // #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui/highgui.hpp" #include <stdlib.h> #include <stdio.h> #include <vector> #include <algorithm> // // определение преобладающих цветов на изображении // через пространство HSV // + накопление данных по соответствующим цветам из RGB #define RECT_COLORS_SIZE 10 // получение пикселя изображения (по типу картинки и координатам) #define CV_PIXEL(type,img,x,y) (((type*)((img)->imageData+(y)*(img)->widthStep))+(x)*(img)->nChannels) // Various color types // 0 1 2 3 4 5 6 7 8 9 10 enum { cBLACK = 0, cWHITE, cGREY, cRED, cORANGE, cYELLOW, cGREEN, cAQUA, cBLUE, cPURPLE, NUM_COLOR_TYPES }; char* sCTypes[NUM_COLOR_TYPES] = { "Black", "White","Grey","Red","Orange","Yellow","Green","Aqua","Blue","Purple" }; uchar cCTHue[NUM_COLOR_TYPES] = { 0, 0, 0, 0, 20, 30, 60, 85, 120, 138 }; uchar cCTSat[NUM_COLOR_TYPES] = { 0, 0, 0, 255, 255, 255, 255, 255, 255, 255 }; uchar cCTVal[NUM_COLOR_TYPES] = { 0, 255, 120, 255, 255, 255, 255, 255, 255, 255 }; typedef unsigned int uint; // число пикселей данного цвета на изображении uint colorCount[NUM_COLOR_TYPES] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // определяем тип пикселя int getPixelColorType(int H, int S, int V) { int color = cBLACK; #if 1 if (V < 75) color = cBLACK; else if (V > 190 && S < 27) color = cWHITE; else if (S < 53 && V < 185) color = cGREY; else #endif { if (H < 7) color = cRED; else if (H < 25) color = cORANGE; else if (H < 34) color = cYELLOW; else if (H < 73) color = cGREEN; else if (H < 102) color = cAQUA; else if (H < 140) color = cBLUE; else if (H < 170) color = cPURPLE; else // полный круг color = cRED; // обратно к красному } return color; } // сортировка цветов по количеству bool colors_sort(std::pair< int, uint > a, std::pair< int, uint > b) { return (a.second > b.second); } int main(int argc, char* argv[]) { // для хранения изображения IplImage* image = 0, *hsv = 0, *dst = 0, *dst2 = 0, *color_indexes = 0, *dst3 = 0; IplImage* image1 = 0, *hsv1 = 0, *dst4 = 0, *dst5 = 0, *color_indexes1 = 0, *dst6 = 0; // // загрузка изображения // char img_name[] = "Image0.jpg"; // имя картинки задаётся первым параметром char* image_filename = argc >= 2 ? argv[1] : img_name; // получаем картинку image = cvLoadImage(image_filename, 1); printf("[i] image: %s\n", image_filename); if (!image) { printf("[!] Error: cant load test image: %s\n", image_filename); return -1; } // показываем картинку cvNamedWindow("image"); cvShowImage("image", image); printf("[i] image size: %d bytes\n", image->imageSize); //cvCreateButton("button6", callbackButton2, (void*) "test", CV_PUSH_BUTTON, 0); /* <--- pass the string literal "test" as third argument */ // // преобразуем изображение в HSV // hsv = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3); cvCvtColor(image, hsv, CV_BGR2HSV); // картинки для хранения результатов dst = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3); dst2 = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 3); color_indexes = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1); //для хранения индексов цвета // для хранения RGB-х цветов CvScalar rgb_colors[NUM_COLOR_TYPES]; int i = 0, j = 0, x = 0, y = 0; // обнуляем цвета for (i = 0; i<NUM_COLOR_TYPES; i++) { rgb_colors[i] = cvScalarAll(0); } for (y = 0; y<hsv->height; y++) { for (x = 0; x<hsv->width; x++) { // получаем HSV-компоненты пикселя uchar H = CV_PIXEL(uchar, hsv, x, y)[0]; // Hue uchar S = CV_PIXEL(uchar, hsv, x, y)[1]; // Saturation uchar V = CV_PIXEL(uchar, hsv, x, y)[2]; // Value (Brightness) // определяем к какому цвету можно отнести данные значения int ctype = getPixelColorType(H, S, V); // устанавливаем этот цвет у отладочной картинки CV_PIXEL(uchar, dst, x, y)[0] = cCTHue[ctype]; // Hue CV_PIXEL(uchar, dst, x, y)[1] = cCTSat[ctype]; // Saturation CV_PIXEL(uchar, dst, x, y)[2] = cCTVal[ctype]; // Value // собираем RGB-составляющие rgb_colors[ctype].val[0] += CV_PIXEL(uchar, image, x, y)[0]; // B rgb_colors[ctype].val[1] += CV_PIXEL(uchar, image, x, y)[1]; // G rgb_colors[ctype].val[2] += CV_PIXEL(uchar, image, x, y)[2]; // R // сохраняем к какому типу относится цвет CV_PIXEL(uchar, color_indexes, x, y)[0] = ctype; // подсчитываем :) colorCount[ctype]++; } } // усреднение RGB-составляющих for (i = 0; i<NUM_COLOR_TYPES; i++) { rgb_colors[i].val[0] /= colorCount[i]; rgb_colors[i].val[1] /= colorCount[i]; rgb_colors[i].val[2] /= colorCount[i]; } // теперь загоним массив в вектор и отсортируем std::vector< std::pair< int, uint > > colors; colors.reserve(NUM_COLOR_TYPES); for (i = 0; i<NUM_COLOR_TYPES; i++) { std::pair< int, uint > color; color.first = i; color.second = colorCount[i]; colors.push_back(color); } // сортируем std::sort(colors.begin(), colors.end(), colors_sort); // для отладки - выводим коды, названия цветов и их количество for (i = 0; i<colors.size(); i++) { printf("[i] color %d (%s) - %d\n", colors[i].first, sCTypes[colors[i].first], colors[i].second); } // выдаём код первых цветов printf("[i] color code: \n"); for (i = 0; i<NUM_COLOR_TYPES; i++) printf("%02d ", colors[i].first); printf("\n"); printf("[i] color names: \n"); for (i = 0; i<NUM_COLOR_TYPES; i++) printf("%s ", sCTypes[colors[i].first]); printf("\n"); // покажем цвета cvZero(dst2); int h = dst2->height / RECT_COLORS_SIZE; int w = dst2->width; for (i = 0; i<RECT_COLORS_SIZE; i++) { cvRectangle(dst2, cvPoint(0, i*h), cvPoint(w, i*h + h), rgb_colors[colors[i].first], -1); } cvShowImage("colors", dst2); cvSaveImage("dominate_colors_table.png", dst2); // покажем картинку в найденных цветах dst3 = cvCloneImage(image); for (y = 0; y<dst3->height; y++) { for (x = 0; x<dst3->width; x++) { int color_index = CV_PIXEL(uchar, color_indexes, x, y)[0]; CV_PIXEL(uchar, dst3, x, y)[0] = rgb_colors[color_index].val[0]; CV_PIXEL(uchar, dst3, x, y)[1] = rgb_colors[color_index].val[1]; CV_PIXEL(uchar, dst3, x, y)[2] = rgb_colors[color_index].val[2]; } } cvNamedWindow("dst3"); cvShowImage("dst3", dst3); cvSaveImage("dominate_colors.png", dst3); image1 = cvLoadImage("dominate_colors.png", 1); printf("[i] image size: %d bytes\n", image1->imageSize); // конвертируем отладочную картинку обратно в RGB cvCvtColor(dst, dst, CV_HSV2BGR); // показываем результат cvNamedWindow("color"); cvShowImage("color", dst); // ждём нажатия клавиши cvWaitKey(0); // освобождаем ресурсы cvReleaseImage(&image); cvReleaseImage(&hsv); cvReleaseImage(&dst); cvReleaseImage(&dst2); cvReleaseImage(&color_indexes); cvReleaseImage(&dst3); // удаляем окна cvDestroyAllWindows(); return 0; }
  21. Реализация функции с python на с++

    Добрый день ! Задача стоит реализовать замену лиц, столкнулся с проблемой переноса цвета кожи и бликов. Нашел данную статью тут , исходники. Пишу на c++, к сожалению с python не работал ни разу, поэтому сложно переносить код на с++. На данный момент мне нужно только функция "correct_colours" вот она на python : def correct_colours(im1, im2, landmarks1): print RIGHT_EYE_POINTS; a1 = landmarks1[LEFT_EYE_POINTS]; blur_amount = COLOUR_CORRECT_BLUR_FRAC * numpy.linalg.norm( numpy.mean(landmarks1[LEFT_EYE_POINTS], axis=0) - numpy.mean(landmarks1[RIGHT_EYE_POINTS], axis=0)) blur_amount = int(blur_amount) if blur_amount % 2 == 0: blur_amount += 1 im1_blur = cv2.GaussianBlur(im1, (blur_amount, blur_amount), 0) im2_blur = cv2.GaussianBlur(im2, (blur_amount, blur_amount), 0) cv2.imwrite('im1_blur.jpg', im1_blur) cv2.imwrite('im2_blur.jpg', im2_blur) # Avoid divide-by-zero errors. im2_blur += (128 * (im2_blur <= 1.0)).astype(im2_blur.dtype) return (im2.astype(numpy.float64) * im1_blur.astype(numpy.float64) / im2_blur.astype(numpy.float64)) Вот как я ее реализовал на с++: void correct_colours(Mat &im1,Mat &im2,vector<Point2f> points2) { arma::mat leftEye(EYE_POINTS_COUNT,2); for(int i = 0; i < EYE_POINTS_COUNT; i++) { leftEye(i,0) = (double)points2[LEFT_EYE_POINTS].x; leftEye(i,1) = (double)points2[LEFT_EYE_POINTS].y; } arma::mat rightEye(EYE_POINTS_COUNT,2); for(int i = 0; i < EYE_POINTS_COUNT; i++) { rightEye(i,0) = (double)points2[RIGHT_EYE_POINTS].x; rightEye(i,1) = (double)points2[RIGHT_EYE_POINTS].y; } arma::mat B = arma::mean(leftEye,0); arma::mat C = arma::mean(rightEye,0); arma::mat D = C-B; int A = COLOUR_CORRECT_BLUR_FRAC*arma::norm(D); if (A % 2 == 0) { A += 1; } cv::Mat im1_blur; cv::Mat im2_blur; cv::Size size(A,A); cv::GaussianBlur(im1, im1_blur,size, 0); cv::GaussianBlur(im2, im2_blur,size, 0); //imshow("im1_blur", im1_blur); //imshow("im2_blur", im2_blur); Mat rezult = im2_blur.clone(); uchar *p1,*p2,*p3,*p4; for(int row = 0; row < im2_blur.rows; ++row) { p1 = im1_blur.ptr(row); p2 = im2_blur.ptr(row); p3 = im2.ptr(row); p4 = rezult.ptr(row); for(int col = 0; col < im2_blur.cols; ++col) { if( (*p2) <= 1 ) { *p2 = (*p2)+128; } (*p4) = (*p3) * (*p1) / (*p2); } } imshow("rez", rezult); Но полученный результат на с++ не такой какой должен быть. Подскажите пожалуйста, что я делаю не так ? Думаю проблема иденну в последних двух строчках кода на python : im2_blur += (128 * (im2_blur <= 1.0)).astype(im2_blur.dtype) return (im2.astype(numpy.float64) * im1_blur.astype(numpy.float64) / im2_blur.astype(numpy.float64)) Но 3 день не могу сообразить что не так.
  22. Здравствуйте. Мне нужно найти грузовики на видео. Подскажите, пожалуйста, какие-нибудь идеи на этот счет. Я понимаю, что самый простой способ это вычитание фона и по размеру блобов, но он не слишком надежный. Мне кажется, что стоит искать параллелепипед кузова, но мне не совсем понятно, как это сделать. Пробовал искать 3 близких четырехугольника, но не очень работает.
  23. Есть цилиндр, нужно узнавать его диаметр. потому что цилиндр может через минуту увеличиваться или уменьшаться в объеме.
  24. OpenCV + NetBeans + Ubuntu

    Приветствую коллеги. Столкнулся с проблемой по взаимодействию opencv и netbeans и linux(прим. с системой не знаком), а именно не удается получить кадр с видеопотока. Проблему вижу в неправильной конфигурации opencv и модуля ffmpeg в нем при сборке или неправильном подключении opencv к netbeans. Файлы прикладываю.
  25. Сохранение модели SVM

    Столкнулся с проблему при сохранении обученной модели SVM(ядро полином), при сохранении и последующей загрузке резко падает процент распознавания, в сети наткнулся на информацию что opencv сохраняет не все данные при не линейном ядре. Пробовал и 3.0 и 3.1 результат один и тот-же. Собственно есть несколько вопросов к знатокам: 1. есть ли способ нормального сохранения средствами OpenCV 2. есть ли способ сохранить модель из scikit-learn в формате который бы просчитала OpenCVая реализация, при обычном сохранении там сохраняется бинарный файл а opencv хочет xml 3. может есть более удобный фреймворк на подобии scikit-learn который бы без заморочек позволил это сделать
×