я использую hessgpu
для эффективного вычисления аффинно-гессианских SIFT дескрипторов с использованием графических процессоров.
В этом проекте дьявол используется для чтения изображений: если 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 ключевых точек, поэтому происходит нечто очень неправильное. Я думаю:
iLoadImage
использует RGB-изображение, пока единственный рабочий метод, который я нашел до сих пор, использует cv::imread
работает только с изображениями в оттенках серого.Как я могу сделать эквивалент ilLoadimage
с помощью cv::imread
?
Кажется, что-то не так с типами, попробуйте это:
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);
Изменение runSift
линия к:
sift.RunSIFT(img.cols, img.rows, img.data, GL_BGR, GL_UNSIGNED_BYTE);
Решил проблему и выдал точное количество дескрипторов.