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

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

Showing results for tags 'OpenCV'.



More search options

  • Search By Tags

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

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


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

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

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

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

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

    В общем, писать самой код для размытия смысла нет, т.к. он есть на робокрафте http://robocraft.ru/blog/computervision/281.html Но суть в том, что дали задание - Сделать фильм, в котором исходная картинка подвергается размытию с возрастающим размером шаблона. То есть, постепенно размывается. Для алгоритма размытия используйте гауссов фильтр или медианный фильтр. Как его сделать, в душе не чаю. Может кто-то помочь?
  7. Доброго времени суток всем. Такая проблема случилась, что надо мне писать диплом, а я до сих пор не могу настроить взаимодействие двух библиотек. Суть такова, что надо через камеру для микроскопа ToupCam получать видео в реальном времени (интерферограмму, если кому интересно) и так же в режиме on-line выполнять с этим видео некие манипуляции, такие как получение гистограммы, ДПФ - фильтрация - обратное ДПФ и т.д. Для разработки была выбрана библиотека OpenCV, но она не желает определять камеру и подключаться к ней. Из китайских форумов я понял, что это нормально. В комплекте с камерой идет SDK под любую платформу и даже небольшая инструкция с описанием функций, но это не шибко помогает. Мне надо получить изображение с камеры, перегнать его в cv::Mat и дальше уже все нормально будет. Вот. А теперь вопрос. Сталкивался ли кто-нибудь с подобным сочетанием библиотек? И если да, могли бы вы поделиться если не готовым кодом, то хотя бы объяснить доступным языком, в какую сторону мне копать? P.S. Нашел на форуме реализацию ДПФ и обратного ДПФ, за что хотелось бы выразить огромную благодарность тов-щу smorodov за красивый код и комментарии в нем. P.P.S. На всякий случай приложу документацию по SDK, если это поможет. en.html
  8. компилирую и запускаю пример 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
  9. кто может помочь? Регулировка диаметра кристалла путем оптического сканирования величины диаметра с помощью телевизионной системы в C++ OpenCV. нужно найти яркую дугу и определить ее диаметр в пикселях, а потом перевести значение соответствующее реальному значению в миллиметрах. Пример как должно быть см. в приложении 6.pdf
  10. Доброго времени суток. Возникла необходимость считать количество людей заходящих в помещение и выходящих из него. Это я реализовал. Но еще необходимо реализовать подсчёт сколько людей находится еще в помещении.Пример: вошло 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); } } }
  11. Всем привет, Как многим известно, под linux opencv активно использует библиотеку ffmpeg для чтения видео, а эта библиотека, в зависимости от окружения и кодеков, которыми записаны видео, может отдавать не bit exact'ные кадры. И возникла необходимость закодировать видео так, чтобы перекодирование прошло без потери качества и в любом окружении выдавались одинаковые кадры. Судя по всему, для этой задачи мне нужно использовать x264 кодек, но вот как нарулить правильное сочетание флагов, чтобы пожалось всё без потери качества - никак не соображу. Может кто-то сталкивался с такой проблемой и имеет готовое решение?
  12. Доброго времени суток. Есть задача написать распознавание текста на российском паспорте. Выбрал технологии: 1) OpencvSharp - обертка opencv для c# 2) Tesseract для распознавания текста Вопросы такие: 1) Какие фильтры(алгоритмы) применить и в какой последовательности для подготовки скана к распознаванию тессерактом. 2) Дельные советы нужны по тому как найти например в распознанном тексте фамилию или текст кем выдан.
  13. LIFT

    Нарушил многолетнее молчание и зафигачил новый пост на Хабру про последние достижения науки и техники в области Feature Matching'а: https://habrahabr.ru/post/323688/ Т.ч. кому интересна тема, вэлкам) Критика, пожелания, замечания приветствуются!
  14. Создал проект на 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
  15. Qt и OpenCV подружить

    Здравствуйте. Помогите настроить OpenCV 2.4.9 в QT 4.7.4. QtCreator 2.2.1 Что-то не так делаю? На рисунках видно что он говорит "не могу найти объявления функций"? Или что-то другое?
  16. Добрый день! Есть определенная программа, которая определяет доминирующие цвета на изображении и выводит новое изображение в найденных цветах (из 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; }
  17. Реализация функции с 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 день не могу сообразить что не так.
  18. Есть цилиндр, нужно узнавать его диаметр. потому что цилиндр может через минуту увеличиваться или уменьшаться в объеме.
  19. OpenCV + NetBeans + Ubuntu

    Приветствую коллеги. Столкнулся с проблемой по взаимодействию opencv и netbeans и linux(прим. с системой не знаком), а именно не удается получить кадр с видеопотока. Проблему вижу в неправильной конфигурации opencv и модуля ffmpeg в нем при сборке или неправильном подключении opencv к netbeans. Файлы прикладываю.
  20. Здравствуйте, добралось и до меня распознавание тескста.. Много прочитал коечто сделал ну и соотвественно натолкнулся на некоторые трудности.:-)Я их перечислю ниже, если не тяжело то дайте советы по преодолению..:-) Общий алгоритм таков: 1. Повышаю контраст. 2. Перевожу в градации серого. 3.Делаю бинаризацию.4 Получаю контуры.5 - сортирую их по площади выбираю больше определнного числа(это буквы).Далее хочу настрогать большое количесвто разных и скормить нейросети FANN. До скармливания наборов сети еще не дошел, т.к. хотел получить максимально вменяемый набор символов. Итак о трудностях: 1. При бинаризации(обычная OTSU) очень часто получаю прерывистую змейку вместо линии, очевидно что промежуточный серый и около него отбрасывается, а хотелось бы наоборот чтоб он считался как черный, чтоб линии были без разрывов. Мне кажется тогда контуры будут получше находится. Из чтения форума выяснил что стоит попробовать адаптивную бинаризацию, так ли это? Может что нить еще? 2. Самая большая проблема - слипшиеся символы.. Пока решение не придумал, как их разделять. Есть метод ConnectedComponents, что делает я понял, но как это натянуть на разделение символов - не понял. Может он и не для этого совсем? Подскажите плз. Ну и вообще как бы решить задачу разделения. Единственное, что пока придумал - бежать окном и смотреть степень похожести с последующим вырезанием. Но я вот не знаю скорость работы нейросети, мне кажется она не справится(реал тайм не обязателен, но время меряется единицами минут). Ну и сопуствующий вопрос - может tesseract прикрутить для разделения? Почему не хочу полностью использовать tesseract - шрифты сильно разные, поэтому думаю не справится - отсюда выбрал нейросеть. Да вот еще не знаю стоит ли гдето в процессе вставить скелетизацию, так как плохо понимаю ее влияние, стоитл ли? и где?:-) Вообщем както так..Спасибо всем за советы.
  21. Сохранение модели SVM

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

    Здравствуйте. Продолжаю вникать в OpenCV. Скажите, есть ли смысл применять OpenMP? Приведёт ли это к ускорению работы? Должны ли библиотеки *.lib быть перекомпилированы отдельно для поддержки ОpenMP как например для Cuda?
  23. Все привет! проблема, я так понимаю, решаемая и заключается в следующем... Написал программку с использованием OpenCV249, это консольное приложение: IDE Code::Blocks OS: Windows7 x64 В IDE нормально запускается debug версия, все работает. Когда компилирую releas версию, то компилируется без ошибок, но запустить программу не получается. Программа ругалась на недостающие dll, я их скинул в каталог с программой. Программа не выдает никаких ошибок, и не работает. Закрываю ее через диспетчер. Может дело в dll файлах? Может я неверно скомпилировал dll файлы... хотя дебаг запускается...
  24. Распознавание камней

    Здравствуйте! Задачей является найти камни на фотографии (хотя бы > 90%) и узнать их размеры зная масштаб. Подскажите каким способом это сделать, какой метод использовать, пытался контуры выделять, не получается, можно ли решить задачу используя примитивы Хаара? Заранее спасибо)
  25. Добрый день! Мне требуется найти на фотографии определенный вид птицы (она имеет отличительные особенности в виде окраски, строения тела и тд). Птица может быть как в полете (ракурс снизу), так и в профиль. Птиц на фотографиях огромное количество и они могут перекрывать друг друга. Нужно их не только найти, но и приблизительно подсчитать. Вопрос: какой алгоритм или подход лучше использовать для решения этой задачи? Если каскад Хаара для решения данной задачи не актуален, то можно просто проигнорировать нижесказанное. Я пробовала двумя подходами: каскад Хаара и мешок слов. Каскад обучается, но в какой-то момент возникли определенные затруднения: помимо птицы выдавал еще и ветки. Попыталась решить эту проблему с помощью изменения выборки положительных примеров: вырезала только птицу и заливала задний фон белым (grabcut с ручной сегментацией), после чего программа совсем перестала находить птиц, даже на исходных положительных (белых) примерах. Буду благодарна за любую помощь и совет!
×