mirror of https://github.com/opencv/opencv.git
parent
4100cbd997
commit
699216436c
4 changed files with 243 additions and 34 deletions
@ -0,0 +1,124 @@ |
|||||||
|
package com.opencv.calibration; |
||||||
|
|
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.IOException; |
||||||
|
import java.util.concurrent.locks.ReentrantLock; |
||||||
|
|
||||||
|
import android.os.AsyncTask; |
||||||
|
|
||||||
|
import com.opencv.camera.NativeProcessor; |
||||||
|
import com.opencv.camera.NativeProcessor.PoolCallback; |
||||||
|
import com.opencv.jni.Calibration; |
||||||
|
import com.opencv.jni.Size; |
||||||
|
import com.opencv.jni.image_pool; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class Calibrator implements PoolCallback { |
||||||
|
private Calibration calibration; |
||||||
|
|
||||||
|
static public interface CalibrationCallback{ |
||||||
|
public void onFoundChessboard(Calibrator calibrator); |
||||||
|
public void onDoneCalibration(Calibrator calibration, File calibfile); |
||||||
|
public void onFailedChessboard(Calibrator calibrator); |
||||||
|
} |
||||||
|
private CalibrationCallback callback; |
||||||
|
public Calibrator(CalibrationCallback callback) { |
||||||
|
calibration = new Calibration(); |
||||||
|
this.callback = callback; |
||||||
|
} |
||||||
|
|
||||||
|
public void resetCalibration(){ |
||||||
|
calibration.resetChess(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setPatternSize(Size size){ |
||||||
|
Size csize = calibration.getPatternsize(); |
||||||
|
if(size.getWidth() == csize.getWidth()&& |
||||||
|
size.getHeight() == csize.getHeight()) |
||||||
|
return; |
||||||
|
calibration.setPatternsize(size); |
||||||
|
resetCalibration(); |
||||||
|
} |
||||||
|
public void setPatternSize(int width, int height){ |
||||||
|
Size patternsize = new Size(width,height); |
||||||
|
setPatternSize(patternsize); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean capture_chess; |
||||||
|
|
||||||
|
ReentrantLock lock = new ReentrantLock(); |
||||||
|
public void calibrate(File calibration_file) throws IOException{ |
||||||
|
if(getNumberPatternsDetected() < 3){ |
||||||
|
return; |
||||||
|
} |
||||||
|
CalibrationTask calibtask = new CalibrationTask(calibration_file); |
||||||
|
calibtask.execute((Object[])null); |
||||||
|
} |
||||||
|
|
||||||
|
public void queueChessCapture(){ |
||||||
|
capture_chess = true; |
||||||
|
} |
||||||
|
|
||||||
|
private class CalibrationTask extends AsyncTask<Object, Object, Object> { |
||||||
|
File calibfile; |
||||||
|
|
||||||
|
public CalibrationTask(File calib) throws IOException{ |
||||||
|
super(); |
||||||
|
calibfile = calib; |
||||||
|
calibfile.createNewFile(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected Object doInBackground(Object... params) { |
||||||
|
lock.lock(); |
||||||
|
try{ |
||||||
|
calibration.calibrate(calibfile.getAbsolutePath()); |
||||||
|
} |
||||||
|
finally{ |
||||||
|
lock.unlock(); |
||||||
|
} |
||||||
|
return null; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onPostExecute(Object result) { |
||||||
|
callback.onDoneCalibration(Calibrator.this, calibfile); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void process(int idx, image_pool pool, long timestamp, |
||||||
|
NativeProcessor nativeProcessor) { |
||||||
|
if(lock.tryLock()){ |
||||||
|
try{ |
||||||
|
if(capture_chess){ |
||||||
|
if(calibration.detectAndDrawChessboard(idx, pool)){ |
||||||
|
callback.onFoundChessboard(this); |
||||||
|
|
||||||
|
}else |
||||||
|
callback.onFailedChessboard(this); |
||||||
|
capture_chess = false; |
||||||
|
} |
||||||
|
}finally{ |
||||||
|
lock.unlock(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public int getNumberPatternsDetected(){ |
||||||
|
return calibration.getNumberDetectedChessboards(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setCallback(CalibrationCallback callback) { |
||||||
|
this.callback = callback; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue