OpenCV:将 ilLoadImage 替换为 cv::imread
OpenCV: Replace ilLoadImage with cv::imread
我正在使用 hessgpu
使用 GPU 高效计算粗麻仿射 SIFT 描述符。
在这个项目中,Devil is used for reading images: if SiftGPU::RunSIFT(const char *imgpath)
is called (implemented here), then ilLoadImage
is used in 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 个关键点)。
我怎样才能使用 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);
解决了问题并生成了准确数量的描述符。
我正在使用 hessgpu
使用 GPU 高效计算粗麻仿射 SIFT 描述符。
在这个项目中,Devil is used for reading images: if SiftGPU::RunSIFT(const char *imgpath)
is called (implemented here), then ilLoadImage
is used in 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 个关键点)。
我怎样才能使用 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);
解决了问题并生成了准确数量的描述符。