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

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

Showing results for tags 'opencv'.



More search options

  • Search By Tags

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

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


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

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

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

  1. Доброго времени суток. Возникла необходимость считать количество людей заходящих в помещение и выходящих из него. Это я реализовал. Но еще необходимо реализовать подсчёт сколько людей находится еще в помещении.Пример: вошло 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); } } }
  2. Всем привет, Как многим известно, под linux opencv активно использует библиотеку ffmpeg для чтения видео, а эта библиотека, в зависимости от окружения и кодеков, которыми записаны видео, может отдавать не bit exact'ные кадры. И возникла необходимость закодировать видео так, чтобы перекодирование прошло без потери качества и в любом окружении выдавались одинаковые кадры. Судя по всему, для этой задачи мне нужно использовать x264 кодек, но вот как нарулить правильное сочетание флагов, чтобы пожалось всё без потери качества - никак не соображу. Может кто-то сталкивался с такой проблемой и имеет готовое решение?
  3. Доброго времени суток. Есть задача написать распознавание текста на российском паспорте. Выбрал технологии: 1) OpencvSharp - обертка opencv для c# 2) Tesseract для распознавания текста Вопросы такие: 1) Какие фильтры(алгоритмы) применить и в какой последовательности для подготовки скана к распознаванию тессерактом. 2) Дельные советы нужны по тому как найти например в распознанном тексте фамилию или текст кем выдан.
  4. LIFT

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

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

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

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

    Здравствуйте. Продолжаю вникать в OpenCV. Скажите, есть ли смысл применять OpenMP? Приведёт ли это к ускорению работы? Должны ли библиотеки *.lib быть перекомпилированы отдельно для поддержки ОpenMP как например для Cuda?
  15. Все привет! проблема, я так понимаю, решаемая и заключается в следующем... Написал программку с использованием OpenCV249, это консольное приложение: IDE Code::Blocks OS: Windows7 x64 В IDE нормально запускается debug версия, все работает. Когда компилирую releas версию, то компилируется без ошибок, но запустить программу не получается. Программа ругалась на недостающие dll, я их скинул в каталог с программой. Программа не выдает никаких ошибок, и не работает. Закрываю ее через диспетчер. Может дело в dll файлах? Может я неверно скомпилировал dll файлы... хотя дебаг запускается...
  16. Добрый день! Мне требуется найти на фотографии определенный вид птицы (она имеет отличительные особенности в виде окраски, строения тела и тд). Птица может быть как в полете (ракурс снизу), так и в профиль. Птиц на фотографиях огромное количество и они могут перекрывать друг друга. Нужно их не только найти, но и приблизительно подсчитать. Вопрос: какой алгоритм или подход лучше использовать для решения этой задачи? Если каскад Хаара для решения данной задачи не актуален, то можно просто проигнорировать нижесказанное. Я пробовала двумя подходами: каскад Хаара и мешок слов. Каскад обучается, но в какой-то момент возникли определенные затруднения: помимо птицы выдавал еще и ветки. Попыталась решить эту проблему с помощью изменения выборки положительных примеров: вырезала только птицу и заливала задний фон белым (grabcut с ручной сегментацией), после чего программа совсем перестала находить птиц, даже на исходных положительных (белых) примерах. Буду благодарна за любую помощь и совет!
  17. Добрый день ! Ищу работоспособный пример проекта вычитания фона (background subtraction BS) c использованием CUDA или OpenCL. У меня установлены VS2013 и СUDA 6.5. Примеры с Ceemple (предкомпилированная библиотека OpenCV3.0 + СUDA 6.5 64 бит) запускаются на моей домашней машине. На работе стоит Windows 7 32 бит и распространяемая библиотека Ceemple не работает. На форуме нашел пример Bes BS-алгоритма: https://github.com/BelBES/VIBE. Этот проект прекрасно работает. Хотелось бы попробовать реализацию этого (или других алгоритмов BS) на видеокартах c "чистым" (т.е. с ядрами __kernel__ ) CUDA или OpenCL.
  18. Распознавание камней

    Здравствуйте! Задачей является найти камни на фотографии (хотя бы > 90%) и узнать их размеры зная масштаб. Подскажите каким способом это сделать, какой метод использовать, пытался контуры выделять, не получается, можно ли решить задачу используя примитивы Хаара? Заранее спасибо)
  19. OpenCV + OpenGL нужно ли?

    Добрый день. Прошу профессионалов объяснить необходимость совместного использования opencv + openGL. Использую для андроид. На сайте OpenCV рекомендуют использовать OpenGL. Зачем? Или все же нужно садится за изучение? Какие преимущества она дает?
  20. Пытаюсь рассчитать поле направлений отпечатка пальца по этой статье, часть 2.2. Делаю для блока W=1x1, т.е. для каждого пикселя. По идее должно получиться что-то похожее на то, что изображено слева. Справа то, что выходит у меня. Где я что не учёл? Спасибо. void pix_orient(Mat &image) { int width = image.cols; int height = image.rows; float Gsy = 0.0, Gsx = 0.0; Mat grad_x, grad_y; Sobel(image, grad_x, CV_32F, 1, , 3, 1, , BORDER_DEFAULT); Sobel(image, grad_y, CV_32F, , 1, 3, 1, , BORDER_DEFAULT); for(int i = ; i < height; i++) { for(int j = ; j < width; j++) { Gsx = (grad_x.at<float>(i,j)*grad_x.at<float>(i,j)) - (grad_y.at<float>(i,j)*grad_y.at<float>(i,j)); Gsy = 2*grad_x.at<float>(i,j) * grad_y.at<float>(i,j); float fi = 0.0; fi = 0.5 * fastAtan2(Gsy, Gsx)*CV_PI/180; //[0;pi] //[-0.5*pi ; 0.5*pi] if(fi<=0) fi = fi + CV_PI/2; else fi = fi - CV_PI/2; image.at<float>(i,j) = fi; } }//for }
  21. Всем доброго вечера, я наконец то смог снова зайти на сайт, чему безгранично счастлив. Знаю что задача решалась, что есть готовый сэмпл в opencv, но хотелось бы получить от вас подсказку, мб ссылки на статьи, исходники. Вопрос следующий: первоначально нужно обнаружить человека в кадре на видео и соответственно осуществить трекинг(если несколько людей, то всех), затем буду всякие доработки, но пока это) Есть идея отделять передний и задний фон, обнаруживать движение и проверять человек ли это, но если он встанет или будет стоять до начала работы, то станет фоном. Что подскажете, как лучше реализовать? P.S. Считаем что камера находится сверху(не перпендикулярно земле, а под углом). Заранее спасибо.
  22. OpenCV и Каскады

    Всем привет! Ребят, у меня возник вопрос по OpenCV. Эту библиотеку я только начинаю изучать...потихоньку разбираюсь! Делал пока тестовые проекты по распознаванию лиц. Вопрос, собственно, такой: Что нужно для распознавания других объектов (например, ручку или телефон)? Как я понял - нужны каскады с очертаниями этого объекта. А как их делать? С помощью какой-то программы или как??
  23. Вопрос по CvWriter

    Переношу проект с VS на Builder 6. Использую opencv 1.1. При записи файла с помощью CvWriter файл не содержит информацию по количеству кадров и его размерам. На VS но с версией opencv 2 все работает нормально!
  24. В компанию "Ситроникс" (sitronics-cams.com) требуется программист С/С++ для разработки приложений систем машинного зрения. Требования: - хорошее знание С/С++, openCV для windows или linux систем. - опыт использования любой системы контроля версий - примеры кода для ознакомления Плюсом будут: - знание Python, Java, matlab - опыт самостоятельной разработки алгоритмов машинного зрения Условия: - офис рядом с м. Петровско-Разумовская - полное соблюдение ТК РФ Компенсация обсуждается индивидуально с каждым кандидатом..
  25. Всем добрый день! Подскажите плиз с помощью каких средств можно сократить время цикла распознавания лиц? Если быть точнее, то необходимо оптимизировать работу функции model->predict(); При добавлении более 100 лиц в модель, время затрачиваемое на определение лица и присваивание метки увеличивается кратно 1 лицо 1 мс, таким образом получается что если искать совпадение в модели которая имеет порядка 200 лиц, в среднем на один цикл распознавания затрачивается 150 мс, из-за этого видеопоток начинает тормозить. 1) подскажите какой метод наиболее эффективно использовать? TBB, OpenMP, GPU или есть чтото более оптимальное? 2) можно ли распараллелить работу функции model->predict()? Модель создается с помощью createLBPHFaceRecognizer().
×