我正在使用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个关键点,所以发生了一些非常错误的事情。我想:
iLoadImage
使用RGB图像,而我目前使用cv::imread
找到的唯一工作方法仅适用于灰度图像。如何使用ilLoadimage
执行相当于cv::imread
的操作?
答案 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);
解决了问题并产生了确切数量的描述符。