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 Core.fillPoly(comparisonFrame, border, new Scalar(255, 255, 255));
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));
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);