package org.hipi.tools.covar;
import org.hipi.image.FloatImage;
import org.hipi.image.HipiImageHeader;
import org.hipi.opencv.OpenCVMatWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Mapper;
import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_core.Mat;
import org.bytedeco.javacpp.opencv_core.Rect;
import org.bytedeco.javacpp.opencv_core.Scalar;
import java.io.IOException;
public class MeanMapper extends
Mapper<HipiImageHeader, FloatImage, IntWritable, OpenCVMatWritable> {
@Override
public void map(HipiImageHeader header, FloatImage image, Context context) throws IOException,
InterruptedException {
/////
// Perform conversion to OpenCV
/////
Mat cvImage = new Mat(image.getHeight(), image.getWidth(), opencv_core.CV_32FC1);
// if unable to convert input FloatImage to grayscale Mat, skip image and move on
if(!Covariance.convertFloatImageToGrayscaleMat(image, cvImage)) {
System.out.println("MeanMapper is skipping image with invalid color space.");
return;
}
/////
// Compute mean using OpenCV
/////
//patch dimensions (N X N)
int N = Covariance.patchSize;
Mat mean = new Mat(N, N, opencv_core.CV_32FC1, new Scalar(0.0));
//specify number of patches to use in mean patch computation (iMax * jMax patches)
int iMax = 10;
int jMax = 10;
//collect patches and add their values to mean patch mat
for (int i = 0; i < iMax; i++) {
int x = ((cvImage.cols() - N) * i) / iMax;
for (int j = 0; j < jMax; j++) {
int y = ((cvImage.rows() - N) * j) / jMax;
Mat patch = cvImage.apply(new Rect(x, y, N, N));
opencv_core.add(patch, mean, mean);
}
}
//scale mean patch mat based on total number of patches
mean = opencv_core.divide(mean, ((double) (iMax * jMax))).asMat();
context.write(new IntWritable(0), new OpenCVMatWritable(mean));
}
}