将本机的图像处理程序移植到Debian上,apt-get install libopencv-dev
安装默认的OpenCV开发包;然后编译程序后,发现有一个问题;图片总是丢失透明通道。下载GDB调试,发现读取特定的PNG文件时读取进来的Mat总是 CV_8UC3 类型; 但是PNG文件是有alpha通道的;
丢失透明通道的PNG图片头信息如上; IHDR头里面的信息关键信息是08030000,比对下正确读取到alpha通道的的PNG文件,此处是08060000;
以下是libpng/png.h头文件里面COLOR_TYPE类型的定义:
#define PNG_COLOR_TYPE_GRAY 0
#define PNG_COLOR_TYPE_PALETTE (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE)
#define PNG_COLOR_TYPE_RGB (PNG_COLOR_MASK_COLOR)
#define PNG_COLOR_TYPE_RGB_ALPHA (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA)
#define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA)
该处 08 代表一个图像的depth;03是PNG_COLOR_TYPE_PALETTE类型;所以这应该是一个特定类型PNG文件读取错误;
推测可能的原因有两个,一个是相关的PNG开发包的版本问题,另一个是Debian系统默认的OpenCV的版本问题;先升级下OpenCV的版本试试;
首先,卸载系统安装的OpenCV开发包;
apt-get remove libopencv-calib3d-dev libopencv-calib3d2.3 libopencv-contrib-dev libopencv-contrib2.3 libopencv-core-dev libopencv-core2.3 libopencv-features2d-dev libopencv-features2d2.3 libopencv-flann-dev libopencv-flann2.3 libopencv-gpu-dev libopencv-gpu2.3 libopencv-highgui-dev libopencv-highgui2.3 libopencv-imgproc-dev libopencv-imgproc2.3 libopencv-legacy-dev libopencv-legacy2.3 libopencv-ml-dev libopencv-ml2.3 libopencv-objdetect-dev libopencv-objdetect2.3 libopencv-video-dev libopencv-video2.3 libopencv-dev
从OpenCV官网下载一个2.4.13.2版本的Release;
根据官方指引;开始编译;中间ffmpeg报错;因为不涉及到视频相关的处理;直接编辑 build/cvconfig.h 将
#define HAVE_FFMPEG
注释掉;重新编译静态库
cmake -D BUILD_SHARED_LIBS=OFF -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/ ..
编译成功,然后make install 安装;然后重新编译项目;重新测试;发现问题解决了。
网友评论