LoginSignup
0
2

More than 3 years have passed since last update.

Desktop : OpenCV HDR

Posted at
Goal

Test OpenCV HDR.

OpenCV_HDR.java
import java.util.ArrayList;
import java.util.List;

public class OpenCV_HDR {

    public static void main( String[] args )
    {
        try{
            System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
            Mat source1 = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\HDRmantis1.jpg", Imgcodecs.CV_LOAD_IMAGE_COLOR);
            Mat source2 = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\HDRmantis2.jpg", Imgcodecs.CV_LOAD_IMAGE_COLOR);
            Mat source3 = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\HDRmantis3.jpg", Imgcodecs.CV_LOAD_IMAGE_COLOR);
            Mat source4 = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\HDRmantis4.jpg", Imgcodecs.CV_LOAD_IMAGE_COLOR);
            Mat source5 = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\HDRmantis5.jpg", Imgcodecs.CV_LOAD_IMAGE_COLOR);
            Mat source6 = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\HDRmantis6.jpg", Imgcodecs.CV_LOAD_IMAGE_COLOR);
            Mat source7 = Imgcodecs.imread("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\HDRmantis7.jpg", Imgcodecs.CV_LOAD_IMAGE_COLOR);

            Mat response=new Mat();

            Photo photo=new Photo();
            //CalibrateDebevec calibrate=photo.createCalibrateDebevec();
            CalibrateDebevec calibrateDebevec=photo.createCalibrateDebevec(70,10.0f,false);

            Mat calibrateRobertsonMat=new Mat();
            CalibrateRobertson calibrateRobertson= photo.createCalibrateRobertson(30,0.01f);

            //Load images and exposure times
            List<Mat> listMat=new ArrayList<Mat>();
            listMat.add(source1);
            listMat.add(source2);
            listMat.add(source3);
            listMat.add(source4);
            listMat.add(source5);
            listMat.add(source6);
            listMat.add(source7);


            Mat times=new Mat(7,1, CvType.CV_32FC1);
            times.put(0, 0, 32);
            times.put(1, 0, 16);
            times.put(2, 0, 8);
            times.put(3, 0, 4);
            times.put(4, 0, 1);
            times.put(5, 0, 0.5);
            times.put(6, 0, 0.25);

            /*
            times.put(0, 0, 100);
            times.put(1, 0, 225);
            times.put(2, 0, 325);
            times.put(3, 0, 525);
            times.put(4, 0, 625);
            times.put(5, 0, 785);
            times.put(6, 0, 1024);
             */

            //Estimate camera response
            calibrateDebevec.process(listMat, response, times);
            calibrateRobertson.process(listMat, calibrateRobertsonMat, times);
            System.out.println("response="+response.dump());
            System.out.println("calibrateRobertsonMat="+calibrateRobertsonMat.dump());
            System.out.println("times="+times.dump());


            //Make HDR image
            Mat hdr=new Mat();
            Mat hdrRobertson=new Mat();
            MergeDebevec mergeDebevec=photo.createMergeDebevec();
            mergeDebevec.process(listMat, hdr, times,response);
            mergeDebevec.process(listMat, hdrRobertson, times,calibrateRobertsonMat);
            // System.out.println("hdr="+hdr.dump());




            Mat ldr=new Mat();
            Mat ldrRobertson=new Mat();
            //TonemapDurand tonemapDurand=photo.createTonemapDurand(2.2f,11.5f,31.9f,31.1f,31.1f);
            TonemapDurand tonemapDurand=photo.createTonemapDurand(1.0f,4.0f,1.0f,2.0f,2.0f);
            tonemapDurand.process(hdr, ldr);
            tonemapDurand.process(hdrRobertson, ldrRobertson);

            ldr=EachPixelMultiplyNum(ldr,255);
            ldrRobertson=EachPixelMultiplyNum( ldrRobertson,255);


            //Perform exposure fusion
            Mat fusion=new Mat();
            MergeMertens mergeMertens =photo.createMergeMertens();
            mergeMertens.process(listMat, fusion);
            fusion=EachPixelMultiplyNum(fusion,255);


            Mat mergeRobertsonMat=new Mat();
            MergeRobertson mergeRobertson=  photo.createMergeRobertson();
            mergeRobertson.process(listMat, mergeRobertsonMat, times);
            mergeRobertsonMat=EachPixelMultiplyNum(mergeRobertsonMat,255);


//          List<Mat> alignMTBMatList=new ArrayList<Mat>();
//          AlignMTB  alignMTB=photo.createAlignMTB(6, 4, true);
//          alignMTB.process(listMat, alignMTBMatList, times, response);


            //Tonemap HDR image
            Mat tonemapMat=new Mat();
            Tonemap tonemap= photo.createTonemap(1.0f);
            tonemap.process(hdr, tonemapMat);
            tonemapMat=EachPixelMultiplyNum(tonemapMat,255);

            Mat tonemapDragoMat=new Mat();
            TonemapDrago tonemapDrago=photo.createTonemapDrago(1.0f,1.0f,0.85f);
            tonemapDrago.process(hdr, tonemapDragoMat);
            tonemapDragoMat=EachPixelMultiplyNum(tonemapDragoMat,255);


            Mat tonemapMantiukMat=new Mat();
            TonemapMantiuk tonemapMantiuk=  photo.createTonemapMantiuk(1.0f,0.7f,1.0f);
            tonemapMantiuk.process(hdr, tonemapMantiukMat);
            tonemapMantiukMat=EachPixelMultiplyNum(tonemapMantiukMat,255);


            Mat tonemapReinhardMat=new Mat();
            TonemapReinhard tonemapReinhard=   photo.createTonemapReinhard(1.0f, 0.0f, 1.0f, 0.0f);
            tonemapReinhard.process(hdr, tonemapReinhardMat);
            tonemapReinhardMat=EachPixelMultiplyNum(tonemapReinhardMat,255);


            //Write results
            Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\CalibrateDebevec-ldr.jpg", ldr);
            Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\CalibrateDebevec-lena-ldrRobertson.jpg",    ldrRobertson);

            Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\CalibrateDebevec-mantis-fusion.jpg", fusion);
            Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\CalibrateDebevec-mantis-mergeRobertsonMat.jpg", mergeRobertsonMat);

            //Imgcodecs.imwrite("C://opencv3.1//samples//CalibrateDebevec-hdr.hdr", hdr);
            Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\CalibrateDebevec-mantis-tonemapMat.jpg", tonemapMat);
            Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\CalibrateDebevec-mantis-tonemapDragoMat.jpg", tonemapDragoMat);
            Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\CalibrateDebevec-mantis-tonemapMantiukMat.jpg", tonemapMantiukMat);
            Imgcodecs.imwrite("D:\\projects\\Java\\OpenCV_Samples\\resource\\imgs\\CalibrateDebevec-mantis-tonemapReinhardMat.jpg",  tonemapReinhardMat);

            //Imgcodecs.imwrite("C://opencv3.1//samples//CalibrateDebevec-AlignMTB.jpg", alignMTBMatList.get(0));
            // Imgcodecs.imwrite("C://opencv3.1//samples//CalibrateDebevec-Robertson.jpg",  calibrateRobertsonMat);
            //System.out.println("hdr="+hdr.dump());

        }catch (Exception e) {
            System.out.println("error: " + e.getMessage());
        }
    }

    public static Mat EachPixelMultiplyNum(Mat inputMat, int Val){
        for (int i=0;i<inputMat.rows();i++){
            for (int j=0;j<inputMat.cols();j++){
                double[] data=new double[3];
                data=inputMat.get(i, j);
                data[0]= data[0]*Val;
                data[1]= data[1]*Val;
                data[2]= data[2]*Val;

                inputMat.put(i, j, data);
            }

        }
        return inputMat;
    }
}
Result

CalibrateDebevec-ldr.jpg
CalibrateDebevec-mantis-fusion.jpg
CalibrateDebevec-mantis-tonemapDragoMat.jpg
CalibrateDebevec-mantis-tonemapMantiukMat.jpg
CalibrateDebevec-mantis-tonemapMat.jpg
CalibrateDebevec-mantis-tonemapReinhardMat.jpg

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2