Merge pull request #1263 from abidrahmank:pyCLAHE_24
[profile/ivi/opencv.git] / samples / android / camera-calibration / src / org / opencv / samples / cameracalibration / OnCameraFrameRender.java
1 package org.opencv.samples.cameracalibration;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
7 import org.opencv.core.Core;
8 import org.opencv.core.Mat;
9 import org.opencv.core.MatOfPoint;
10 import org.opencv.core.Point;
11 import org.opencv.core.Range;
12 import org.opencv.core.Scalar;
13 import org.opencv.imgproc.Imgproc;
14
15 import android.content.res.Resources;
16
17 abstract class FrameRender {
18     protected CameraCalibrator mCalibrator;
19
20     public abstract Mat render(CvCameraViewFrame inputFrame);
21 }
22
23 class PreviewFrameRender extends FrameRender {
24     @Override
25     public Mat render(CvCameraViewFrame inputFrame) {
26         return inputFrame.rgba();
27     }
28 }
29
30 class CalibrationFrameRender extends FrameRender {
31     public CalibrationFrameRender(CameraCalibrator calibrator) {
32         mCalibrator = calibrator;
33     }
34
35     @Override
36     public Mat render(CvCameraViewFrame inputFrame) {
37         Mat rgbaFrame = inputFrame.rgba();
38         Mat grayFrame = inputFrame.gray();
39         mCalibrator.processFrame(grayFrame, rgbaFrame);
40
41         return rgbaFrame;
42     }
43 }
44
45 class UndistortionFrameRender extends FrameRender {
46     public UndistortionFrameRender(CameraCalibrator calibrator) {
47         mCalibrator = calibrator;
48     }
49
50     @Override
51     public Mat render(CvCameraViewFrame inputFrame) {
52         Mat renderedFrame = new Mat(inputFrame.rgba().size(), inputFrame.rgba().type());
53         Imgproc.undistort(inputFrame.rgba(), renderedFrame,
54                 mCalibrator.getCameraMatrix(), mCalibrator.getDistortionCoefficients());
55
56         return renderedFrame;
57     }
58 }
59
60 class ComparisonFrameRender extends FrameRender {
61     private int mWidth;
62     private int mHeight;
63     private Resources mResources;
64     public ComparisonFrameRender(CameraCalibrator calibrator, int width, int height, Resources resources) {
65         mCalibrator = calibrator;
66         mWidth = width;
67         mHeight = height;
68         mResources = resources;
69     }
70
71     @Override
72     public Mat render(CvCameraViewFrame inputFrame) {
73         Mat undistortedFrame = new Mat(inputFrame.rgba().size(), inputFrame.rgba().type());
74         Imgproc.undistort(inputFrame.rgba(), undistortedFrame,
75                 mCalibrator.getCameraMatrix(), mCalibrator.getDistortionCoefficients());
76
77         Mat comparisonFrame = inputFrame.rgba();
78         undistortedFrame.colRange(new Range(0, mWidth / 2)).copyTo(comparisonFrame.colRange(new Range(mWidth / 2, mWidth)));
79         List<MatOfPoint> border = new ArrayList<MatOfPoint>();
80         final int shift = (int)(mWidth * 0.005);
81         border.add(new MatOfPoint(new Point(mWidth / 2 - shift, 0), new Point(mWidth / 2 + shift, 0),
82                 new Point(mWidth / 2 + shift, mHeight), new Point(mWidth / 2 - shift, mHeight)));
83         Core.fillPoly(comparisonFrame, border, new Scalar(255, 255, 255));
84
85         Core.putText(comparisonFrame, mResources.getString(R.string.original), new Point(mWidth * 0.1, mHeight * 0.1),
86                 Core.FONT_HERSHEY_SIMPLEX, 1.0, new Scalar(255, 255, 0));
87         Core.putText(comparisonFrame, mResources.getString(R.string.undistorted), new Point(mWidth * 0.6, mHeight * 0.1),
88                 Core.FONT_HERSHEY_SIMPLEX, 1.0, new Scalar(255, 255, 0));
89
90         return comparisonFrame;
91     }
92 }
93
94 class OnCameraFrameRender {
95     private FrameRender mFrameRender;
96     public OnCameraFrameRender(FrameRender frameRender) {
97         mFrameRender = frameRender;
98     }
99     public Mat render(CvCameraViewFrame inputFrame) {
100         return mFrameRender.render(inputFrame);
101     }
102 }