OpenCV: заменить ilLoadImage на cv::imread

Я использую hessgpu для эффективного вычисления гессиан-аффинных дескрипторов SIFT с использованием графических процессоров.

В этом проекте для чтения изображений используется Devil: если вызывается SiftGPU::RunSIFT(const char *imgpath) (реализовано здесь), затем ilLoadImage используется в GLTexImage.cpp для чтения изображений (в виде изображений RGB).

Однако в моем проекте я использую cv::imread для чтения изображений. Проект предоставляет SiftGPU::RunSIFT(int width, int height, const void * data, unsigned int gl_format, unsigned int gl_type) для вычисления дескрипторов на основе данных, предоставленных непосредственно пользователем.

Итак, я попытался:

cv::Mat img = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
sift.RunSIFT(img.cols, img.rows, img.data, GL_LUMINANCE, GL_UNSIGNED_BYTE);

Но это дает немного меньше ключевых точек, чем sift.RunSIFT("image.jpg");. Я пытался использовать:

cv::Mat img = cv::imread("image.jpg");
sift.RunSIFT(img.cols, img.rows, img.data, GL_RGB, GL_UNSIGNED_BYTE);

Но это дает 0 ключевых точек, поэтому происходит что-то очень неправильное. Я думаю:

  1. iLoadImage использует изображение RGB, в то время как единственный рабочий метод, который я нашел до сих пор, используя cv::imread, работает только с изображениями в градациях серого.
  2. Возможно, дьявол использует другой процесс для чтения изображений, чем OpenCV, особенно для изображений RGB (поскольку использование второго подхода дало 0 ключевых точек).

Как я могу сделать эквивалент ilLoadimage, используя cv::imread?


person justHelloWorld    schedule 29.03.2017    source источник


Ответы (2)


Кажется, что-то не так с типами, попробуйте этот:

Mat img = imread("image.jpg"); 
sift.RunSIFT(img.cols, img.rows, img.data, GL_BGR, GL_3_BYTES); 

Или этот

cv::Mat img = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
sift.RunSIFT(img.cols, img.rows, img.data, GL_RED, GL_UNSIGNED_BYTE);
person Dmitrii Z.    schedule 29.03.2017

Изменение строки runSift на:

sift.RunSIFT(img.cols, img.rows, img.data, GL_BGR, GL_UNSIGNED_BYTE);

Решил проблему и выдал точное количество дескрипторов.

person justHelloWorld    schedule 29.03.2017