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

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

Showing results for tags 'c++'.



More search options

  • Search By Tags

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

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


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

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

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

  1. Пытаюсь калибровать камеру на предмет дисторсии по вот этому мануалу https://docs.opencv.org/4.3.0/d4/d94/tutorial_camera_calibration.html Когда использовал шахматный эталон - всё было ок, пока он был целиком в кадре, но висло намертво, когда часть эталона оказывалась вне кадра, пытаюсь сделать с кругами, пишут вроде что алгоритм более устойчивый, но он просто не находит цель, если не уменьшать размер изображения (примерно до 1024*768). Шаблон генерил с помощью скриптов OpenCV, пытался и симметричный и асимметричный использовать. Можно ли что-то сделать, чтобы нормально находить эталон на большом кадре? Или надо сильно уменьшать изображение, находить цель, потом брать базовое изображение, умножать все найденные координаты на коэффициент, с которым уменьшали изображение и запускать findCornersSubPix? Асимметричный эталон использовал вот этот Код вот такой: cv::Size boardSize( 4, 11 ); cv::Mat image = cv::imdecode( cv::Mat( 1, data->size(), CV_8UC1, data->data() ), cv::IMREAD_COLOR ); std::vector< cv::Point2f > pointBuf; bool found; // int chessBoardFlags = cv::CALIB_CB_ADAPTIVE_THRESH | cv::CALIB_CB_NORMALIZE_IMAGE | cv::CALIB_CB_FAST_CHECK; qDebug()«"Looking for corners"; // found = findChessboardCorners( image, boardSize, pointBuf, chessBoardFlags); //found = findCirclesGrid( image, boardSize, pointBuf ); found = findCirclesGrid( image, boardSize, pointBuf, cv::CALIB_CB_ASYMMETRIC_GRID);
  2. Добрый день! Коллеги, подскажите пожалуйста при помощи каких codec можно уменьшить размер выходного видео файла? Задача получить минимальный размер при сохранении среднего качества картинки получаемой с Web камеры. Перепробовал различные комбинации кодеков/выходного формата: 'M', 'J', 'P', 'G' / .avi , 'M', 'P, '4', 'V' / .mp4 , 'D', 'I', 'V', 'X' / .avi , 'A', 'V', 'C', '1' / .avi . На данный момент 30 минут видео с 10 FPS весит > 1GB, в идеале хотелось бы добиться 200-300 мбайт. Вот код функции с помощью которого пишу видео файл с web камеры: int fcc = CV_FOURCC('M', 'J', 'P', 'G'); int fps = 25; string filelocation = "С:\\video.avi"; cv::Size frameSize(videoCapture.get(CV_CAP_PROP_FRAME_WIDTH), videoCapture.get(CV_CAP_PROP_FRAME_HEIGHT)); VideoWriter testwriter(filelocation, fcc, fps, cv::Size(640,480), true); while (true) { cv::Mat writefrm; //Get frame from webcam videoCapture >> writefrm; }
  3. Создание dll, использующей openCV (C++)

    Здравствуйте. Пытался ли кто-нибудь создать dll из С++-кода, использующего OpenCV, и использовать её в C++ или C#? Я столкнулся со следующим: Преодолев ошибки, связанные с созданием динамических типов данных в тестовой dll, я подумал, что проблема уже решена. Теперь я могу использовать контейнеры в коде dll, но как только я создаю что-то из OpenCV (я пробовал создать матрицу cv::Mat, заполненную нулями), то функция LoadLibrary возвращает нулевой указатель. Работаю в x64 Debug, opencv_world411.dll так же клал в папку проекта. Если потребуется код и его результаты (которые я описал, в принципе, про нулевой указатель), могу потом запостить его.
  4. Когда у меня была незамароженная модель я без труда определял размерность входного и выходного узла графа загруженной модели вот таким образом: using namespace std; using namespace tensorflow; using namespace tensorflow::ops; cout << "Step1" << endl; GraphDef graph_def(true); Session* session; SessionOptions sopt; Status status = NewSession(sopt, &session); if (!status.ok()) { std::cerr << "tf error: " << status.ToString() << "\n"; } const string export_dir = "/home/user/MyBuild/build_tftest2/models"; SavedModelBundle bundle; RunOptions run_options; status = LoadSavedModel(sopt, run_options, export_dir, {kSavedModelTagServe}, &bundle); if (!status.ok()) { std::cerr << "tf error: " << status.ToString() << "\n"; } else { GraphDef graph = bundle.meta_graph_def.graph_def(); auto shape = graph.node().Get(0).attr().at("shape").shape(); for (int i = 0; i < shape.dim_size(); i++) { std::cout << shape.dim(i).size()<<std::endl; } int node_count = graph.node_size(); for (int i = 0; i < node_count; i++) { auto n = graph.node(i); //graph.node(i).PrintDebugString(); cout<<"Names : "<< n.name() <<endl; } } А потом я захотел модель оптимизировать и для этого её заморозил и теперь код загрузки модели уже другой, using namespace std; using namespace tensorflow; using namespace tensorflow::ops; cout << "Step1" << endl; GraphDef graph_def(true); Session* session; SessionOptions sopt; Status status = NewSession(sopt, &session); if (!status.ok()) { std::cerr << "tf error: " << status.ToString() << "\n"; } cout << "Step2" << endl; // Читаем граф //status = ReadBinaryProto(Env::Default(), "/home/user/MyBuild/build_tftest2/models/saved_model.pb", &graph_def); status = ReadBinaryProto(Env::Default(), "/home/user/MySoftware/foreign code/netology_JN/Diplom/Models/optimized/optim_model.pb", &graph_def); //status = ReadBinaryProto(Env::Default(), "/home/user/MySoftware/foreign code/netology_JN/Diplom/Models/Raw/frozen_model.pb", &graph_def); if (!status.ok()) { std::cerr << "tf error: " << status.ToString() << "\n"; } else { int node_count = graph_def.node_size(); for (int i = 0; i < node_count; i++) { auto n = graph_def.node(i); //graph.node(i).PrintDebugString(); cout<<"Names : "<< n.name() <<endl; } auto shape = graph_def.node().Get(0).attr().at("shape").shape(); for (int i = 0; i < shape.dim_size(); i++) { std::cout << shape.dim(0).size()<<std::endl; } } Список узлов я по прежнему получаю, но при попытки получить размерность имею большой облом. Подскажите пожалуйста как получить размерность хотябы входного и выходного узла. Я же должен знать тензоры каких размерностей надо создавать для интеграции модели в приложение. Документации по теме нет и я буду рад любым рассуждениям, которые могут навести на путь истинный.
  5. Распознавание неба

    Всем привет. Передо мной стоит задача распознать небо на фото. Использую Visual Studio и OpenCV. Из результата хорошо видно что область неба более темная, но что делать дальше? Результатом может быть просто выведение части изображения с небом в отдельный файл. Возможно я спрашиваю что то совсем простое так как новичок в opencv. И за это прошу прощения. Заранее спасибо. int main(int argc, char** argv) { Mat src, src_gray; Mat grad; int scale = 1; int delta = 0; int ddepth = CV_64F; //int c; /// Load an image src = imread("1.jpg");; GaussianBlur(src, src, Size(3, 3), 0, 0, BORDER_DEFAULT); /// Convert it to gray cvtColor(src, src_gray, CV_BGR2GRAY); /// Generate grad_x and grad_y Mat gradient_image; Mat grad_x, grad_y; Mat abs_grad_x, abs_grad_y; /// Gradient X //Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT ); Sobel(src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_REPLICATE); convertScaleAbs(grad_x, abs_grad_x); /// Gradient Y //Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT ); Sobel(src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_REPLICATE); convertScaleAbs(grad_y, abs_grad_y); pow(abs_grad_x, 2, abs_grad_x); pow(abs_grad_y, 2, abs_grad_y); add(abs_grad_x, abs_grad_y, grad); gradient_image = grad; double ret, thresh = threshold(src_gray, src_gray,50, 255, THRESH_BINARY); imshow("gray", ret); imshow("sobel", src_gray); //imshow("sobel", grad); //imwrite("image01_res2.jpg", grad); //imshow("cobel1", abs_grad_y); //imshow("cobel2", abs_grad_x); imshow("orig", src); waitKey(0); return 0; }
  6. кто сможет реализовать? 1. Константирование - повышение контрастности изображения нелинейным оператором преобразования. 2. Фильтрация - Нелинейная локальная фильтрация медианным фильтром для подавления шумов. 3. Выделение границ оператором Собела. 4. Триангуляция. подробности и формулы пришлю в лс.
  7. компилирую и запускаю пример 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
  8. кто может помочь? Регулировка диаметра кристалла путем оптического сканирования величины диаметра с помощью телевизионной системы в C++ OpenCV. нужно найти яркую дугу и определить ее диаметр в пикселях, а потом перевести значение соответствующее реальному значению в миллиметрах. Пример как должно быть см. в приложении 6.pdf
  9. Доброго времени суток. Возникла необходимость считать количество людей заходящих в помещение и выходящих из него. Это я реализовал. Но еще необходимо реализовать подсчёт сколько людей находится еще в помещении.Пример: вошло 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); } } }
  10. Добрый день. Есть сцена: - лист белой бумаги с текстом, на этом листе лежит метка( белый кружок размером с 5 рублевую монету, с черным контуром и белой цифрой 8) и 3 монеты(любого номинала).Что я сделал:1. Перевел изображение в оттенки серого.2. Сделал бинаризацию(уже на этом этапе текст пропал с белого листа)3. Выделил контуры преобразованием лапласа.Что мне нужно сделать дальше? По логике думаю нужно сделать сегментацию, не получилось сделать kmeans. Проблема в том, что у нас несколько похожих объектов, как их разметить и разделить на разные участки для обработки, код распознавания метки(что это цифра 8, а не что-то другое) уже написан. Просто перебрать всё изображение целиком не получится, так как в будущем будет много меток.Прошу подсказать, как реализовать всё это.
  11. Реализация функции с 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 день не могу сообразить что не так.
  12. Есть цилиндр, нужно узнавать его диаметр. потому что цилиндр может через минуту увеличиваться или уменьшаться в объеме.
  13. Eсть ли какой то пример обучения сети без создания базы leveldb\lmdb, по идее это можно сделать через ImageDataLayer \ MemoryDataLayer? Есть пример как сделать forward pass https://github.com/BVLC/caffe/blob/master/examples/cpp_classification/classification.cpp Но непонятно должен ли при этом первый слой сети и последний иметь какой то специальный тип? https://github.com/BVLC/caffe/blob/master/examples/cpp_classification/classification.cpp#L150
  14. Пытаюсь рассчитать поле направлений отпечатка пальца по этой статье, часть 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 }
  15. OpenCV 3.0 RGBD DepthCleaner

    Hello, I am having some difficulties to use the function DepthCleaner () with method = DEPTH_CLEANER_NIL to clean a depth image. This function is released in OpenCV 3.0.0. So, it's too early to find useful documentation for this function. If anyone of you have already used this function, could you please inform me which set of functions and codes I use to get a clean depth image. Let's say, I have a depth image from Kinect1 named as 'Img1.png'. I am declaring the image and using DepthCleaner as follows: char fileName[64]; Mat depth_image = Mat(480, 640, CV_16UC1); Mat output = Mat(480, 640, CV_16U); snprintf(fileName, sizeof(fileName), "Depth_Image/Img1.png"); depth_image = imread(fileName, -1); namedWindow("Input image",WINDOW_AUTOSIZE); imshow ("Input image",depth_image); DepthCleaner* depthc = new DepthCleaner(CV_16U, 3, DepthCleaner::DEPTH_CLEANER_NIL); depthc->operator ()(depth_image,output); namedWindow("depthCleaner",WINDOW_AUTOSIZE); imshow ("depthCleaner",output); I am using C++. But, I am not having correct result. I guess I am doing something wrong in the codes. I have also tried using this set of codes: char fileName[64]; Mat depth_image = Mat(480, 640, CV_16UC1); Mat output = Mat(480, 640, CV_16U); float fx = 525.0f, // default fy = 525.0f, cx = 319.5f, cy = 239.5f; Mat cameraMatrix = Mat::eye(3,3,CV_32FC1); { cameraMatrix.at<float>(0,0) = fx; cameraMatrix.at<float>(1,1) = fy; cameraMatrix.at<float>(0,2) = cx; cameraMatrix.at<float>(1,2) = cy; } snprintf(fileName, sizeof(fileName), "Depth_Image/Img1.png"); depth_image = imread(fileName, -1); namedWindow("Input image",WINDOW_AUTOSIZE); imshow ("Input image",depth_image); Mat point3DMat; depthTo3d(depth_image, cameraMatrix, point3DMat); DepthCleaner* depthc = new DepthCleaner(CV_16U, 3, DepthCleaner::DEPTH_CLEANER_NIL); depthc->operator ()(point3DMat,output); namedWindow("depthCleaner",WINDOW_AUTOSIZE); imshow ("depthCleaner",output); But, it did not help me either. It would be a great help if you can point me to the right direction.
  16. Доброго времени суток! Пишу детектор знаков ограничения скорости(в компьютерном зрении новичек), реализация фильтра и поиска координат уже есть(детектирование красного кольца работает приемлемо), теперь осталось распознать текст внутри знаков (5,10,20,30,40... и т.д.), моя идея такова: создать по 300 положительных и по 600 отрицательных изображений для каждого знака(а конкретнее текста внутри знака, так как поиск изображения с текстом думаю делать в уже вырезанном изображении, согласно координатам и данным, полученных из предыдущих действий), с помощью программы: opencv_createsamples.exe и opencv_haartraining.exe - создать XML-файл "cascade.xml" для каждого знака(точнее для тех выборок 300х600 фотографий). После чего загрузить их в программу и выполнять поиск знаков по очереди подставляя каскады разных знаков, например как-то так: подставляем каскад знака 90 если в кадре находим 90 то выход, иначе подставляем каскад знака 80... и так в цикле. Каскад собираюсь делать согласно этой статье. Одна из положительных картинок 208.bmp (и да, я знаю что она большая,но пока не знаю какой размер конкретно нужен) Собственно вопрос: 1) подходит ли мой алгоритм? 2) если нет, как это лучше сделать? Предпочтительно: C# ,OpenCvSharp Библиотека: OpenCv СпаСиБо!
×