OpenCV:将 ilLoadImage 替换为 cv::imread

OpenCV: Replace ilLoadImage with cv::imread

本文关键字:cv imread ilLoadImage OpenCV 替换      更新时间:2023-10-16

我正在使用hessgpu来有效地计算使用GPU的Hessian-affine 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个关键点)。

如何使用cv::imread执行等效的ilLoadimage

类型似乎有问题,试试这个:

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);

解决了问题并产生了确切数量的描述符。