OpenCV:用 cv::imread 替换 ilLoadImage

Posted

技术标签:

【中文标题】OpenCV:用 cv::imread 替换 ilLoadImage【英文标题】:OpenCV: Replace ilLoadImage with cv::imread 【发布时间】:2017-03-29 08:32:46 【问题描述】:

我正在使用hessgpu 使用 GPU 高效计算 hessian 仿射 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 个关键点,所以会发生一些非常错误的事情。我认为:

    iLoadImage 使用 RGB 图像,而到目前为止我发现使用 cv::imread 的唯一工作方法仅适用于灰度图像。 devil 可能使用与 OpenCV 不同的过程来读取图像,尤其是 RGB 图像(因为使用第二种方法产生 0 个关键点)。

如何使用cv::imread 完成与ilLoadimage 等效的操作?

【问题讨论】:

【参考方案1】:

类型好像有问题,试试这个:

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

【讨论】:

【参考方案2】:

runSift 行更改为:

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

解决了问题并生成了准确数量的描述符。

【讨论】:

以上是关于OpenCV:用 cv::imread 替换 ilLoadImage的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV中图像的读取,显示与保存

opencv

OpenCV的图像读取显示及保存

OpenCV-Python中的函数cv.imread()读取到的图像的数据存储结构是怎样的?

OpenCV“对'cv :: imread'等C ++的未定义引用

在 OpenCv 中使用“cv::imread”函数读取图像的问题