Перейти к содержимому
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. Доброе время суток! Необходимо распознать автомобильный номер на изображении, для увеличения точности решил трансформировать номер так, будто камера смотрит прямо на него. Для выполнения задачи решил найти верхнюю и левую линии, и из них рассчитать углы, но столкнулся с проблемой. Метод CvInv oke.HoughLines находит большое количество линий, но даже при увеличении порога правильная линия попадается редко. Написал аналог данного метода C# но для поиска только самой явной линии, однако он страдает той же проблемой. Разница где то в 15 градусов, если "докинуть" их вручную выходит почти правильно. За основу алгоритма был взят CvInv oke.HoughLines, сам метод: public static unsafe LineSegment2D FindBestLineD(Mat input, double minTheta, double maxTheta, double theta, int rho) { int width = input.Width; int height = input.Height; int max_rho = (int)Math.Sqrt(width * width + height * height); int min_rho = -max_rho; int thetaCount = (int)((maxTheta - minTheta) / theta); int rhoCount = (int)(((max_rho - min_rho) + 1) / rho); double[] thetaArr = new double[thetaCount]; double tmp = minTheta; double[] sinTheta = new double[thetaCount]; double[] cosTheta = new double[thetaCount]; for (int i = 0; i < thetaCount; i++) { thetaArr = tmp; sinTheta = Math.Sin(tmp); cosTheta = Math.Cos(tmp); tmp += theta; } int[,] accum = new int[rhoCount, thetaCount]; Bitmap bitmap = input.Bitmap; BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat); byte* Pixels = (byte*)bitmapData.Scan0.ToPointer(); int stride = bitmapData.Stride; int shift = 0; for (int h = 0; h < height; h++) { shift = stride * h; for (int w = 0; w < width; w++) { if (Pixels[shift + w] != 0) { for (int i = 0; i < thetaCount; i++) { int r = (int)(h * sinTheta + w * cosTheta); r += rhoCount / 2; accum[r, i]++; } } } } bitmap.UnlockBits(bitmapData); int MaxValue = 0; int BestRho = 0; double BestTheta = 0; for (int t = 0; t < thetaArr.Length; t++) { for (int r = 0; r < rhoCount; r++) { if (accum[r, t] > MaxValue) { MaxValue = accum[r, t]; BestTheta = thetaArr[t]; BestRho = r - rhoCount / 2; } } } //BestTheta += theta * 15; var pt1 = new Point(); var pt2 = new Point(); var a = Math.Cos(BestTheta); var b = Math.Sin(BestTheta); var x0 = a * BestRho; var y0 = b * BestRho; pt1.X = (int)Math.Round(x0 + input.Width * (-b)); pt1.Y = (int)Math.Round(y0 + input.Height * (a)); pt2.X = (int)Math.Round(x0 - input.Width * (-b)); pt2.Y = (int)Math.Round(y0 - input.Height * (a)); return new LineSegment2D(pt1, pt2); } Если бы проблема была только с ним, продолжал бы сам искать ошибку, но предложенный в библиотеке вариант тоже "недокручивает" градусы. Есть ли у кого предположение с чем может быть связан данный феномен, может ли быть тому причиной малый размер изображения (ширина до 200 px )? Или может существуют более удобные решения данной проблемы, при условии что быстродействие является критичным?
  2. Распознавание неба

    Всем привет. Передо мной стоит задача распознать небо на фото. Использую 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; }
  3. Коллеги, суть проблемы: не удается загрузить мной созданную модель tensorFlow в opencv.dnn методом cv2.dnn.readNetFromTensorflow(weights,config) выдается ошибка распарсивания графа вида Error parsing text-format opencv_tensorflow.GraphDef: 4059:5: Unknown enumeration value of "DT_RESOURCE" for field "type". гугление приводит к рецептам вроде заморозьте граф, преобразуйте файл *.pbtxt с помощью файлов, входящих в opencv, конфиг для сети при этом скачайте по ссылке, везде рекомендации, примерно как тут: https://github.com/opencv/opencv/wiki/TensorFlow-Object-Detection-API вопрос: но ведь это-же для конкретной заранее спроектированной сети - mobilenet, rcnn, yolo и других известных, я правильно понимаю или нет? и если да, то, что делать, если моя структура самописная? это не lenet, не guglonet, не yolo, это моя собственная сетка. мне что, не удастся ее в dnn прочитать? Спасибо.
  4. А кто мне подскажет, как найти контуры прямоугольников в такой сложной ситуации? Выделил красным желаемый результат разделения. Вероятно, можно нейросетями (не пробовал, но уверен, что получится), но хотелось бы классическими методами OpenCV.
  5. Для системы управления складскими роботами необходимо определять погрешности монтажников при варке стеллажей. С этой целью для каждой ячейки делается фото, и сейчас живой человечек рисует в каждом таком фото желтый крестик (см. фото с красным кружочком и зеленым контуром). Пока ячеек было 2-3000, было терпимо. Сейчас планируется робосклад на 100000 ячеек, и решили делать распознавание образов (нужно определить край уголка). Образы могут быть сами разные, в т.ч. с перегороженным куском уголка (см. другие фото). Хотим использовать библиотеку OpenCV (emgucv для C#). Вопрос - в какую сторону копать? - анализ изображений (выбор отличительных признаков, морфология, поиск контуров, гистограммы) - или обнаружение объектов, в частности лиц - или еще что? Сгодятся ли для этой задачи контуры? Или, из-за игры теней и частичного перекрытия самим роботом, контуры использовать не получится? Еще чисто теоретически задача решаема для дневного освещения? Или только ночью (см. фото в аттаче)?
  6. Добрый день. Подскажите, какие есть варианты для очистки изображения от "шума"? Под шумом подразумеваю печатный текст "пiдпис" и "№". Нюанс еще в том, что этот текст может быть напечатан разными шрифтами и разного размера. Пробовал удалить наложением эталона с логическим AND. Получается, но далеко не идеально. Возможно, есть другой вариант очистки? P.S. Угловой перекос устранил, линии удалил. Вопрос исключительно по очистке от печатного текста.
  7. Доброго времени суток. Интересует такая тема, как нахождение недвижимого предмета на переднем плане(т.е изначально он отсутствовал), перепробована куча вариантов и алгоритмов, но ничего стабильного так и не найдено, возможно кто то что то реализовывал похожее?
  8. Здравствуйте, пытался обучить SVM hog дескрипторами. Но в момент установки svm модели , выбрасывает исключение Находил похожие вопросы на answer opencv (Вопрос), от туда выяснил, как добавлять rho и автор советовал перейти на float массив попытался, но ситуация не изменилась Код обучения (свой картинки, 28*28) (Ошибок не возникает, файл создается ) HOGDescriptor hog = new HOGDescriptor(new Size(28,28),new Size(8,8),new Size(4,4),new Size(4,4),9); Mat trainingLabels = new Mat(); MatOfFloat temp = new MatOfFloat(); File negativeDir = new File("/home/kurenchuksergey/HogSignTrainingData/negative"); File positiveDir = new File("/home/kurenchuksergey/HogSignTrainingData/positive"); int i = -1; float[][] hogdescriptor = new float[13992][]; //13992 - image count for(File file:negativeDir.listFiles()){ Mat con = Imgcodecs.imread(file.getAbsolutePath(),Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE); hog.compute(con, temp); trainingLabels.push_back(Mat.zeros(new Size(1,1),CvType.CV_32S)); } for(File file:negativeDir.listFiles()){ Mat con = Imgcodecs.imread(file.getAbsolutePath(),Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE); hog.compute(con, temp); hogdescriptor[++i] = temp.toArray(); trainingLabels.push_back(Mat.ones(new Size(1,1),CvType.CV_32S)); } Mat Labels = new Mat(); trainingLabels.copyTo(Labels); Labels.convertTo(Labels,CvType.CV_32S); Mat mat = new Mat(hogdescriptor.length,hogdescriptor[0].length,CvType.CV_32FC1); for(int j = 0;j<hogdescriptor.length;j++) mat.put(i,0,hogdescriptor[i]); TrainData trainDataHog = TrainData.create(mat,Ml.ROW_SAMPLE,Labels); SVM svm = SVM.create(); svm.setType(SVM.C_SVC); svm.setKernel(SVM.RBF); svm.setDegree(0.1); // 1.4 bug fix: old 1.4 ver gamma is 1 svm.setGamma(0.1); svm.setCoef0(0.1); svm.setC(1); svm.setNu(0.1); svm.setP(0.1); svm.setTermCriteria(new TermCriteria(1, 20000, 0.0001)); svm.train(trainDataHog.getSamples(),Ml.ROW_SAMPLE,trainDataHog.getResponses()); svm.save("SVMHog"); Далее пытаюсь воспользоваться моделью (Test.java) SVM svm1 = SVM.load("SVMHog"); HOGDescriptor hog = new HOGDescriptor(new Size(28,28),new Size(8,8),new Size(4,4),new Size(4,4),9); Double rho = svm1.getDecisionFunction(0,new Mat(),new Mat()); int size = (int)(svm1.getSupportVectors().total() + 1) * svm1.getSupportVectors().channels(); float[] temp = new float[size]; svm1.getSupportVectors().get(0, 0, temp); temp[temp.length - 1] = (float)-rho; MatOfFloat vector = new MatOfFloat(temp); hog.setSVMDetector(vector); И получаю исключение (47 - строка - hog.setSVMDetector(vector); ) OpenCV Error: Assertion failed (checkDetectorSize()) in setSVMDetector, file /home/kurenchuksergey/opencv/modules/objdetect/src/hog.cpp, line 117 Exception in thread "main" CvException [org.opencv.core.CvException: cv::Exception: /home/kurenchuksergey/opencv/modules/objdetect/src/hog.cpp:117: error: (-215) checkDetectorSize() in function setSVMDetector ] at org.opencv.objdetect.HOGDescriptor.setSVMDetector_0(Native Method) at org.opencv.objdetect.HOGDescriptor.setSVMDetector(HOGDescriptor.java:306) at com.company.Test.main(Test.java:47)
  9. Добрый день, есть фотография шахматной доски расположенной под определенным углом, я нашел ключевые точки, скажите как найти нормаль к этой шахматной доске?
  10. Создаю андроид программу которая с использованием opencv(dnn) загружает модель нейронной сети Enet и производит сегментацию входного изображения. Все идет гладко до обработки полученных результатов. На языке python обработка производится довольно просто - в цикле проходимся по матрице пикселей и в зависимости от значения присваиваем ему цвет. В java все не так: после работы возвращается объект типа Mat со следующими параметрами: res = Mat [ -1*-1*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0x7f3e56fff160, dataAddr=0x7f3e44806000 ] res.total() = 1036800 res.channels() = 1 res.size() = 6x1 res.dims() = 4 res.cols() = -1 res.rows() = -1 Более того если все таки достать(http://answers.opencv.org/question/175676/javaandroid-access-4-dim-mat-planes/) значения пикселей из полученного результата то они не соответствуют ожиданиям. Т.е. каждому классу соответствует число например если 5 классов то возвращаются числа от 0 до 4(так работает на python). Здесь же мне возвращаются числа вида: -26.287221908569336, -14.588539123535156, -7.386473655700684, 1.4765703678131104, 15.550891876220703. Кто нибудь знает как преодолеть данную проблему? Почему объект Mat возвращает не те значения?
  11. Одно видео внутрь другого

    Добрый день, работаю на opencv версии 3.3. Мне нужно сделать следующее, есть frame получаемый из камеры (условно 1280х720), нужно на данный frame наложить второй видеоролик, уже меньшего размера (условно, 300х300). Как мне это реализовать, подскажите пожалуйста. Спасибо!! Пишу на Си. Наброски кода: CvCapture* bigframe = cvCaptureFromCAM(0); Cvcapture* smallframe=cvCreateFileCapture("1.avi"); CvMat* display; cvNamedWindow("video", CV_WINDOW_AUTOSIZE); while(1) { display=cvQueryFrame(bigframe); cvShowImage("video", display); }
  12. Здравствуйте. Есть вот такая картинка: Необходимо определить область каждой клетки, отделить ее от соседней, обвести контуром. Некоторые клетки находятся в процессе деления, их необходимо выделить особенно (другим цветом). Также надо посчитать количество клеток. Каждая клетка должна превратится в некий объект для дальнейшего анализа. Вот такая задача сегментации. Пытаюсь решать ее с помощью opencv и python. В opencv я совсем новичок, поэтому для начала попробовал алгоритм из документации для сегментации монет: https://docs.opencv.org/3.3.1/d3/db4/tutorial_py_watershed.html Но для моей картинки это не подходит, контуры плохо выделяются, получается каша. Видимо это из-за того что внутренности клетки примерно одно цвета с фоном. Пробовал играться с параметрами, но безуспешно. Добился вот такой картинки: На этом этапе и застрял. Сомневаюсь что я двигаюсь в правильном направлении. Мой вопрос: 1. Какой алгоритм подошел бы мне? 2. С чего начинать? 3. Что почитать на этот счет? Заранее благодарю.
  13. Тренировка (haar cascade training)

    Всем привет! Вот и закончились праздники. Пока они были - успел заинтересоваться возможностями openCV. Прошу не кидаться камнями, ибо относительно недавно занялся изучением, и могу делать глупые ошибки. В общем, поигрался с мануалами (детектирование лица на видео, котики на фото). Захотел попробовать натренировать свою xml (haar cascade training) для определения, есть ли на видео рыбки (аквариумные). Правильно ли я вижу процесс тренировки? : 1. Я должен подготовить две выборки фотографий (позитивные и негативны) c (например) ~1000 и 3000 примеров соответственно ; 2. Разложить их по папкам good и bad; на уровне корня создать два файла: good.dat и bad.dat 3. Привожу к общему формату положительные : opencv_createsamples.exe -info something\Good.dat -vec samples.vec -w 20 -h 20 4. Создаю финальный каскад xml: opencv_traincascade.exe -data haarcascade -vec samples.vec -bg something\Bad.dat -numStages 16 -minhitrate 0.999 -maxFalseAlarmRate 0.4 -numPos 200 -numNeg 500 -w 20 -h 20 -mode ALL -precalcValBufSize 1024 -precalcIdxBufSize 1024 на втором пункте у меня возникают некоторые вопросы: - какого размера должны быть good и bad фотографии? Нужно делать их на профессиональный фотоаппарат, или хватит камеры телефона? Должен ли быть у них одинаковый размер? - если в файле bad.dat, согласно статьи с хабра, должно быть просто перечисление фотографий, то в файле good.dat, цитирую "Кроме пути должно быть указанно положение рассматриваемого объекта и его размер.". если я сделаю несколько фотографий рыбки в аквариуме, мне нужно будет потом эти фотографии в ручную обрезать, найти у каждой фотографии координаты рыбки и указать? Пока больше вопросов нет. Искал по форуму ответы - не смог найти. Заранее спасибо!)
  14. Добрый день! Есть обычное трафик видео. Задача состоит в том чтобы на выходе получить сжатое видео в котором объекты накладываются большим количеством на статический задний фон. Чтобы накладывать объекты большим количеством надо каждый объект (его координаты и значения пикселей) записывать в отдельный массив, либо создавать маски numpy для каждого, и затем уже накладывать. Пытаюсь через контуры, фильтрую изображение, получаю белые блобы, нахожу контуры, но не понимаю как данные каждого контура записывать в отельные массивы. Вот кусочек кода начиная после нахождения контуров: # Находим координаты контура mask = np.zeros(thresh.shape,np.uint8) cont2 = cv2.drawContours(mask,contours,0,255,-1) pixelpoints = np.transpose(np.nonzero(mask)) # Находим значения пикселей for k in range(0,(len(pixelpoints))): a = (frame[pixelpoints[k][0]][pixelpoints[k][1]]) pix_list.append(a)
  15. ASM/AAM в OpenCV

    Добрый день! Хочу написать программу, распознающую основные эмоции человека по видеопотоку вебки, используя opencv. Насколько я понимаю, наиболее подходящими для меня будут алгоритмы aam/asm, позволяющие выделить основные морфологические точки лица, по взаимному расположению которых я и определю эмоцию. Вопрос - эти алгоритмы реализованы в opencv? Если да - есть ли демки/примеры, как называются классы? В ходе непродолжительного гуглинга актуальный ответ найти не удалось.
  16. Доброго времени суток.Помоги написать программу на Питоне 3.6, либо на ++.Которая бы: детектировала лицо (сделано),далее находила AU's (ЕД, Пол Экман),на основе этих AU'sов предполагала эмоцию.На счет кода почти неважно чей он будет (e.c, copypast github) и по какой концепции будет реализован, главное чтобы можно было разобраться с распознаванием AU'sов.Есть пару проектов с гита по теме, но у меня они плюются ошибками:) Дедлайн по теме 15 января.
  17. Contours detection

    Всем привет, Для удобства работы с результатами semantic segmentation хочу векторизовать label map. Т.е. у нас есть картинка, где каждому пикселю соответствует номер класса и мы хотим все такие блобы закодировать полигонами, соответствующими границам объектов. Но, я внезапно обнаружил, что cv::findContours() работает только с бинарными изображениями (т.е. там только 2 лэйбла 'фон'/'не фон'). Теоретически я могу свести задачу к предыдущей, довольно просто генерируя для каждого класса соответствующую бинарную маску. Таким образом у меня получится куча контуров, но вот их иерархия вложенности, которая строится внутри findContours, будет невалидной, и придется делать какие-то дополнительные (не самые вычислительно-дешевые) телодвижения для того, чтобы определить корректный порядок отрисовки вложенных полигонов. Может быть кто-то сталкивался с подобной задачей и знает уже существующую имплементацию для конвертации label map'ов в полигоны для небинарных масок, с поддержкой древовидных иерархий?
  18. Распознавание лиц

    Здраствуйте! Мне нужна программа для распознования лиц с картинки используя нейросети с помощью метода HOG. Хорошо если на С#. Можете мне как-то помочь??
  19. Подскажите, пожалуйста, чем лучше распознать слабо отличимые от фона линии, например линии на руке. Я понимаю что скорее всего надо применять усиливающие фильтры (или поднимать контраст), но может есть какие-то специальные алгоритмы, упрощающие жизнь?
  20. Здравствуйте! Есть следующая задача: необходимо найти 2 ярких красных светодиода в real-time. Сделал это с помощью перехода в HSV и поиска блобов по каждому из каналов - скорость получилась неподходяще малой, зато точность прекрасна. Теперь нужно это ускорить, есть идея попробовать уйти от блобов - но итог этого не порадовал по точности абсолютно - система получилась очень сильно зависимая от окружающего освещения. Как можно это решить, какие методы использовать? Необходимо найти яркие диоды (2 штуки), окружающее освещение - лампы дневного света, в идеале более 20fps.
  21. Доброго времени суток. Как возможно установить 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?
  22. Установка opencv на python

    Что делать если после установки opencv на python, при наборе а командной строке import cv2 возникает ошибка? При это если набирать в idle ошибки нет.
  23. Привет коллеги! Прошу помощи! Как написать собственную прошивку для камер Hikvision? Есть алгоритмы детектор огня, оставленных предметов, распознавание номеров, трекинг, автотрекинг. Хочу, чтобы эти алгоритмы работали в голове камеры и выдавали результат в виде текста на изображении, либо выделением области цветом. Как это сделать? Что почитать? Как нужно откомпилировать проект Opencv, чтобы его библиотеки тоже вошли в прошивку? Любой информации буду рад.
  24. кто сможет реализовать? 1. Константирование - повышение контрастности изображения нелинейным оператором преобразования. 2. Фильтрация - Нелинейная локальная фильтрация медианным фильтром для подавления шумов. 3. Выделение границ оператором Собела. 4. Триангуляция. подробности и формулы пришлю в лс.
  25. Здравствуйте. Мне нужно найти грузовики на видео. Подскажите, пожалуйста, какие-нибудь идеи на этот счет. Я понимаю, что самый простой способ это вычитание фона и по размеру блобов, но он не слишком надежный. Мне кажется, что стоит искать параллелепипед кузова, но мне не совсем понятно, как это сделать. Пробовал искать 3 близких четырехугольника, но не очень работает.
×