1
package org.opencv.samples.cameracalibration;
3
import java.util.ArrayList;
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;
15
import android.content.res.Resources;
17
abstract class FrameRender {
18
protected CameraCalibrator mCalibrator;
20
public abstract Mat render(CvCameraViewFrame inputFrame);
23
class PreviewFrameRender extends FrameRender {
25
public Mat render(CvCameraViewFrame inputFrame) {
26
return inputFrame.rgba();
30
class CalibrationFrameRender extends FrameRender {
31
public CalibrationFrameRender(CameraCalibrator calibrator) {
32
mCalibrator = calibrator;
36
public Mat render(CvCameraViewFrame inputFrame) {
37
Mat rgbaFrame = inputFrame.rgba();
38
Mat grayFrame = inputFrame.gray();
39
mCalibrator.processFrame(grayFrame, rgbaFrame);
45
class UndistortionFrameRender extends FrameRender {
46
public UndistortionFrameRender(CameraCalibrator calibrator) {
47
mCalibrator = calibrator;
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());
60
class ComparisonFrameRender extends FrameRender {
63
private Resources mResources;
64
public ComparisonFrameRender(CameraCalibrator calibrator, int width, int height, Resources resources) {
65
mCalibrator = calibrator;
68
mResources = resources;
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());
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
Imgproc.fillPoly(comparisonFrame, border, new Scalar(255, 255, 255));
85
Imgproc.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
Imgproc.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));
90
return comparisonFrame;
94
class OnCameraFrameRender {
95
private FrameRender mFrameRender;
96
public OnCameraFrameRender(FrameRender frameRender) {
97
mFrameRender = frameRender;
99
public Mat render(CvCameraViewFrame inputFrame) {
100
return mFrameRender.render(inputFrame);