因为最近用到了有些数据库,里面的深度图片是.exr后缀的,但是在使用opencv读取的时候,发现imread读取的数据始终都是空的,甚是纳闷,网上查询使用opencv读取exr文件的资料也大多是基于python的,但是我使用是c++,没啥帮助,于是自己研究了一下。
首先,写个简单的demo来读取.exr图片,以及查看当前的opencv支不支持exr格式的读取。注:默认编译的opencv是不支持的。
首先cpp文件:
#include <iostream>
#include <chrono>
using namespace std;
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
int main ( int argc, char** argv )
{
// 读取 指定的图像
cv::Mat image;
image = cv::imread ("/home/wei/Documents/dataset/klg/car4-full/depth_original/Depth0003.exr",cv::IMREAD_UNCHANGED); // cv::imread 函数读取指定路径下的图像
// 判断图像文件是否正确读取
cerr << cv::getBuildInformation();
if ( image.data == nullptr ) // 数据不存在,可能是文件不存在
{
cerr<<"文件不存在."<<endl;
return 0;
}
// 文件顺利读取, 首先输出一些基本信息
cout<<"图像宽为"<<image.cols<<",高为"<<image.rows<<",通道数为"<<image.channels()<<endl;
cv::imshow ( "image", image ); // 用 cv::imshow 显示图像
cv::waitKey ( 0 ); // 暂停程序,等待一个按键输入
// 其他图像操作请参见 OpenCV 官方文档,查询每个函数的调用方法。
cv::destroyAllWindows();
return 0;
}
然后cmakeLists.txt文件
set( CMAKE_CXX_FLAGS "-std=c++11" )# 寻找 OpenCV 库
find_package( OpenCV REQUIRED )
# 添加头文件
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( imageBasics readPic.cpp )
# 链接 OpenCV 库
target_link_libraries( imageBasics ${OpenCV_LIBS} )
然后编译,运行,可以得到下面类似的输出:
可以发现指出的图片类型里面没有OpenEXR,而且 也输出:文件不存在。
因此,解决办法是重新编译opencv,编译的时候加上参数:
-DWITH_OPENEXR=ON
使得opencv支持.exr格式,然后重新执行,得到:
发现支持了OpenEXR了。