1.定义问题
如何加载图片,并把它转化为Mat进行数据操作?
2.方案尝试
opencv中有个imread函数,可以理解为‘image read’方便记忆。其中第一个参数是文件的路径,还有一个是缺省值。
3.工作原理分析
imread函数位于Imgcodecs类的同名包下。 imread(String filename,int flags)。
以小猫咪(本人猫奴)为例的图片,结合代码观察如何加载图片。
public class Test {
static {
// 这个必须要写,不写报java.lang.UnsatisfiedLinkError
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
@org.junit.Test
public void test(){
this.test5();
}
/**
* 加载图像
*/
public void test5(){
Mat mat = Imgcodecs.imread("D:\\GX-work\\opencv-in\\kitten.jpg");
System.out.println("输出像素大小:"+mat.width()+" * "+mat.height()+" 类型:"+mat.type());
}
}
// 控制台输入打印
输出像素大小:500 * 373 类型:16
Process finished with exit code 0
需要注意的是,如果找不到该文件,opencv也不会报错,而是现实加载的mat对象是空,所以没有行和列 mat = 0*0 类型:0 如下列错误示范:
也可以根据自己的现实情况,尝试封装检查Mat大小的代码,确保可以找到最合适图片的解码。
imread()方法也可以加载灰度图像,是通过另外一个参数控制。上代码:
/**
* 加载灰度图像
*/
public void test6(){
String fileName = "kitten.jpg";
Mat mat = Imgcodecs.imread(inPath+fileName,Imgcodecs.IMREAD_GRAYSCALE);
//写出文件
Imgcodecs.imwrite(outPath+fileName,mat);
System.out.println(mat.dump());
}
(感觉小猫咪瞬间不可爱了)
这个IMREAD_GRAYSCALE参数来自同一个Imgcodecs类。其中在写出图片文件时用到了函数imwrite()方法,方便记忆读作 image write。
其它扩展参数说明
1、IMREAD_REDUCED_GRAYSCALE_2
2、IMREAD_REDUCED_GRAYSCALE_4
3、IMREAD_REDUCED_GRAYSCALE_8
4、IMREAD_REDUCED_COLOR_2
5、IMREAD_REDUCED_COLOR_4
6、IMREAD_REDUCED_COLOR_8
通过数值_2、_4、_8来减小加载图片的像素大小。同时指定颜色或者灰度模式。GRAYSCALE表示单通道灰度模式,COLOR表示RGB的三通道模式。
7、IMREAD_LOAD_GDAL 使用GDAL驱动程序加载栅格格式图片
8、IMREAD_GRAYSCALE 单通道灰度模式图片
9、IMREAD_IGNORE_ORIENTAT 如果设置,会根据EXIF的方向表示旋转图像