OpenCV:用cv :: imread替换ilLoadImage

时间:2017-03-29 08:32:46

标签: c++ image opencv opengl devil

我正在使用hessgpu来有效地使用GPU计算hessian-affine SIFT描述符。

在此项目中,Devil用于阅读图片:如果调用SiftGPU::RunSIFT(const char *imgpath)(已实施here),则在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个关键点)。
  3. 如何使用ilLoadimage执行相当于cv::imread的操作?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

runSift行更改为:

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

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