我正在寻找将图像像素数据提取到整数列表(或任何数字表示(中。例如,具有2 x 2的白色图像,结果将为[255,255,255,255]。如果图像是代码生成的,并且未读取磁盘:
Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
System.out.println("OpenCV Mat: " + m);
Mat mr1 = m.row(1);
mr1.setTo(new Scalar(1));
Mat mc5 = m.col(5);
mc5.setTo(new Scalar(5));
System.out.println("OpenCV Mat data, "+m.total()+" elements:n" +
m.dump());
准确打印=>
OpenCV Mat: Mat [ 5*10*CV_8UC1, isCont=true, isSubmat=false,
nativeObj=0x1415d50, dataAddr=0x13a6880 ]
OpenCV Mat data, 50 elements:
[ 0, 0, 0, 0, 0, 5, 0, 0, 0, 0;
1, 1, 1, 1, 1, 5, 1, 1, 1, 1;
0, 0, 0, 0, 0, 5, 0, 0, 0, 0;
0, 0, 0, 0, 0, 5, 0, 0, 0, 0;
0, 0, 0, 0, 0, 5, 0, 0, 0, 0]
但是,如果我在磁盘上写下垫子" m"内容,然后我再次阅读,dump((方法吐出奇怪的输出:
Imgcodecs.imwrite(TRAIN_PATH_PROC+"m.jpg",m);
m = null;
m = Imgcodecs.imread(TRAIN_PATH_PROC+"m.jpg");
System.out.println("Fresly read m, "+m.total()+" elements:n"+m.dump());
打印
Fresly read m, 50 elements:
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
5, 5, 5, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0;
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
5, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1;
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 5,
5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,
4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
5, 5, 5, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
由于我需要从读取映像中提取int值,并依靠dump((用于字符串表示,这会使我麻烦。
编辑:
我只是使用
来提取数据 List<Integer> values = new ArrayList<>();
for (int i = 0; i < m.rows(); i++) {
for (int j = 0; j < m.cols(); j++) {
values.add((int)m.get(i,j)[0]);
}
}
mat.dump((是我们的朋友,正在打印垫子名称以揭示其属性。(应将问题标题更改为不贬低转储((。(IMREAD自动假设转换为BGR,因此数据的3个通道而不是预期的1个通道。IMWRITE JPEG会自动压缩。您可以控制IMREAD转换并减少压缩,但仍然有些失去。
MatOfInt imwrite_flags = new MatOfInt();
imwrite_flags.fromArray(Imgcodecs.IMWRITE_JPEG_QUALITY , 100);
Imgcodecs.imwrite(TRAIN_PATH_PROC+"m.jpg",m, imwrite_flags);
m = Imgcodecs.imread(TRAIN_PATH_PROC+"m.jpg", Imgcodecs.IMREAD_UNCHANGED);
您需要的是无或无损压缩,因此请使用TIFF格式 - 以下tiff的示例。(请参阅在OpenCV中保存TIFF文件时设置特定压缩方案的方法?(
String TRAIN_PATH_PROC = "";
Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
System.out.println("OpenCV Mat: " + m);
Mat mr1 = m.row(1);
mr1.setTo(new Scalar(1));
Mat mc5 = m.col(5);
mc5.setTo(new Scalar(5));
System.out.println("OpenCV Mat data, "+m.total()+" elements:n" +
m.dump());
MatOfInt imwrite_flags = new MatOfInt();
imwrite_flags.fromArray(Imgcodecs.IMWRITE_TIFF_COMPRESSION , 1); // no compression
Imgcodecs.imwrite(TRAIN_PATH_PROC+"m2.tif",m, imwrite_flags);// note name change so both examples can run
// OR
Imgcodecs.imwrite(TRAIN_PATH_PROC+"m.tif",m); // default compression LZW grayscale but lossless, I think
m = null;
m = Imgcodecs.imread(TRAIN_PATH_PROC+"m.tif", Imgcodecs.IMREAD_UNCHANGED);
System.out.println("OpenCV Mat: " + m);
System.out.println("Fresly read m, "+m.total()+" elements:n"+m.dump());