Я использую 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 ключевых точек, поэтому происходит что-то очень неправильное. Я думаю:
iLoadImage
использует изображение RGB, в то время как единственный рабочий метод, который я нашел до сих пор, используяcv::imread
, работает только с изображениями в градациях серого.- Возможно, дьявол использует другой процесс для чтения изображений, чем OpenCV, особенно для изображений RGB (поскольку использование второго подхода дало 0 ключевых точек).
Как я могу сделать эквивалент ilLoadimage
, используя cv::imread
?