我试图在javacv / opencv中进行图像压缩。
首先是代码:
CanvasFrame canvasOrig = new CanvasFrame("Original");
canvasOrig.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
CanvasFrame canvasOrig = new CanvasFrame("Original");
canvasOrig.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
CanvasFrame canvasGray = new CanvasFrame("Gray");
canvasGray.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
CanvasFrame canvasPCA = new CanvasFrame("PCA");
canvasPCA.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
OpenCVFrameConverter.ToIplImage t = new OpenCVFrameConverter.ToIplImage();
IplImage image = cvLoadImage("640x480.jpg");
Mat imageOriginal = t.convertToMat(t.convert(image));
Mat imageGray = new Mat();
cvtColor(imageOriginal, imageGray, CV_RGB2GRAY);
System.out.println("ArraySize-Original-Mat: "+imageGray.arraySize());
PCA pca = new PCA(imageGray,new Mat(), CV_PCA_DATA_AS_ROW, 48);
Mat eigValues = pca.eigenvalues().clone();
Mat eigVectors = pca.eigenvectors().clone();
Mat projectedMat = new Mat();
pca.project(imageGray, projectedMat);
在PCA计算过程中,方法就像我期望的那样。
我的问题是:
我怎么能从PCA的结果中压缩原始图像?
投影后,我得到一个Mat(projectedMat),其中包含给定组件的数量和图像的高度。在backProjection之后,ArraySize远远高于原始Image。这不是我所期望的。
谢谢
我找到了自己的答案。
问题或在此上下文中的解决方案是将图像转换为32F或64F类型以进行浮点运算。
在计算pca之后,必须将图像或偶数矩阵转换回类型8位数。