Nano Hash - криптовалюты, майнинг, программирование

Использование cuda::morphologyex в opencv 3

Я работаю над проектом opencv, в котором используется функция morphologyex. Теперь я пытаюсь сделать это с поддержкой GPU.

Когда я компилирую свою программу с поддержкой opencv 3.0 и cuda 7.5, она принимает большинство функций (таких как cuda::threshold, cuda::cvtcolor и т. д.), кроме morphologyEx. Обратите внимание, что morphologyex вызывается в opencv 2.4.9 как gpu::morphologyEx.

Как я могу использовать эту функцию в OpenCV 3.0 или 3.1? Если она не поддерживается, есть ли альтернатива этой функции?

На самом деле я использую эту функцию для определения фона при неравномерном освещении. Я добавляю код к вопросу. Пожалуйста, предложите мне, как я могу заменить функцию morphologyEx.

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{   
// Step 1: Read Image
Mat1b img = imread("path_to_image", IMREAD_GRAYSCALE);

// Step 2: Use Morphological Opening to Estimate the Background
Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(15,15));
Mat1b background;
morphologyEx(img, background, MORPH_OPEN, kernel);

// Step 3: Subtract the Background Image from the Original Image
Mat1b img2;
absdiff(img, background, img2);

// Step 4: Increase the Image Contrast
// Don't needed it here, the equivalent would be  cv::equalizeHist

// Step 5(1): Threshold the Image
Mat1b bw;
threshold(img2, bw, 50, 255, THRESH_BINARY);

// Step 6: Identify Objects in the Image
vector<vector<Point>> contours;
findContours(bw.clone(), contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);


for(int i=0; i<contours.size(); ++i)
{
    // Step 5(2): bwareaopen
    if(contours[i].size() > 50)
    {
        // Step 7: Examine One Object
        Mat1b object(bw.size(), uchar(0));
        drawContours(object, contours, i, Scalar(255), CV_FILLED);

        imshow("Single Object", object);
        waitKey();
    }
}

return 0;
}

================================================== ======================= Спасибо @Roy Falk Прочитав ценные комментарии и документацию, я почувствовал, что функция morphologyEX

morphologyEx(img, background, MORPH_OPEN, kernel);

можно заменить на

cv::Ptr<cv::cuda::Filter>morph = cuda::createMorphologyFilter(MORPH_OPEN, out.type(), kernel);
    morph->apply(out, bc);

не стесняйтесь сказать, если я ошибаюсь

10.02.2016

  • Этот вопрос кажется более подходящим для Google. Я предполагаю, что здесь добросовестно, и что openCSV+cuda7.5 как-то усложняет это, но вам следует потратить немного больше времени на объяснение, почему это трудно найти в Google. Создание сценария с сообщением об ошибке и архитектурой будет иметь большое значение для создания доброй воли и привлечения людей к этому вопросу. Например: я пытаюсь запустить OpenCSV на работающей устаревшей встроенной системе... Он доступен только с Cuda7.5 (устаревший), и примеры кода не работают, потому что... Я думаю, что мне нужен определенный заголовочный файл, который не не там... 10.02.2016
  • Теперь вопрос отредактирован, спасибо 12.02.2016
  • morphologyex отсутствует в docs.opencv.org/3.0- бета/модули/cudafilters/doc/filtering.html. Можете ли вы опубликовать точный вызов morpholyex? 12.02.2016

Ответы:


1

Как отмечено в комментарии выше, morphologyex не входит в API версии 3.1.

Я предполагаю, что вам нужно сопоставить вызов, как описано в документации 2.4. к тому, как это сделано в 3.1 .

В частности, morphologyex имеет следующие параметры:

  • src Исходное изображение. Используйте cuda::Filter и cuda::Filter::apply
  • dst Целевое изображение такое же, как указано выше
  • op Тип морфологической операции. Попробуйте cuda::createMorphologyFilter

...так далее.

Другими словами, 2.4 проделал операцию за один раз (morphologyex). В версии 3.1 вы сначала создаете фильтр с помощью createFooFilter, а затем вызываете фильтр Apply.

На самом деле это не окончательный ответ, а скорее предложение, но я не мог написать все это в комментарии. Удачи.

=================================================================

Изменить: Попробуйте посмотреть на https://github.com/Itseez/opencv/blob/master/samples/gpu/morphology.cpp. Он показывает, как использовать cuda::createMorphologyFilter.

12.02.2016
  • Во-первых, спасибо за ваш быстрый ответ. и извините за отсутствие знаний в opencv. 12.02.2016
  • Я добавил код к вопросу для лучшего понимания ситуации 12.02.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..