Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
72c3db01bf |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -69,3 +69,6 @@ build/
|
|||||||
|
|
||||||
## Emacs backup files
|
## Emacs backup files
|
||||||
*~
|
*~
|
||||||
|
|
||||||
|
## Packr dist folder
|
||||||
|
dist/
|
8
Makefile
Normal file
8
Makefile
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
PACKR = java -jar /home/miky/Descargas/packr.jar
|
||||||
|
PACKR_CONF = packr.json
|
||||||
|
|
||||||
|
all:
|
||||||
|
cd desktop/jni; $(MAKE) $(MFLAGS)
|
||||||
|
cd ../..
|
||||||
|
./gradlew desktop:dist
|
||||||
|
$(PACKR) $(PACKR_CONF)
|
@@ -13,16 +13,15 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch;
|
|||||||
import com.badlogic.gdx.graphics.g3d.Model;
|
import com.badlogic.gdx.graphics.g3d.Model;
|
||||||
import com.badlogic.gdx.graphics.g3d.ModelBatch;
|
import com.badlogic.gdx.graphics.g3d.ModelBatch;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the core class of the demo. It handles all resource loading and rendering.
|
||||||
|
*
|
||||||
|
* @author Miguel Angel Astor Romero
|
||||||
|
*/
|
||||||
public class EviDemo extends ApplicationAdapter {
|
public class EviDemo extends ApplicationAdapter {
|
||||||
private static final String TAG = "EVI DEMO - CORE";
|
private static final String TAG = "EVI DEMO - CORE";
|
||||||
private static final String CLASS_NAME = EviDemo.class.getSimpleName();
|
private static final String CLASS_NAME = EviDemo.class.getSimpleName();
|
||||||
|
|
||||||
private static final int W = 640;
|
|
||||||
private static final int H = 360;
|
|
||||||
private static final float NEAR = 0.01f;
|
|
||||||
private static final float FAR = 10.0f;
|
|
||||||
private static final int CODE = 213;
|
|
||||||
|
|
||||||
private ImageProcessor cvProc;
|
private ImageProcessor cvProc;
|
||||||
private Texture tex;
|
private Texture tex;
|
||||||
private Pixmap frame;
|
private Pixmap frame;
|
||||||
@@ -61,9 +60,9 @@ public class EviDemo extends ApplicationAdapter {
|
|||||||
manager = new AssetManager();
|
manager = new AssetManager();
|
||||||
manager.load("monkey.g3db", Model.class);
|
manager.load("monkey.g3db", Model.class);
|
||||||
|
|
||||||
camera = new CustomPerspectiveCamera(67, W, H);
|
camera = new CustomPerspectiveCamera(67, ProjectConstants.W, ProjectConstants.H);
|
||||||
camera.near = NEAR;
|
camera.near = ProjectConstants.NEAR;
|
||||||
camera.far = FAR;
|
camera.far = ProjectConstants.FAR;
|
||||||
camera.translate(0.0f, 0.0f, 0.0f);
|
camera.translate(0.0f, 0.0f, 0.0f);
|
||||||
camera.lookAt(0.0f, 0.0f, -1.0f);
|
camera.lookAt(0.0f, 0.0f, -1.0f);
|
||||||
camera.update();
|
camera.update();
|
||||||
@@ -81,10 +80,13 @@ public class EviDemo extends ApplicationAdapter {
|
|||||||
public void render () {
|
public void render () {
|
||||||
float focalPointX, focalPointY, cameraCenterX, cameraCenterY;
|
float focalPointX, focalPointY, cameraCenterX, cameraCenterY;
|
||||||
|
|
||||||
Gdx.gl.glClearColor(1, 0, 0, 1);
|
Gdx.gl.glClearColor(0, 0, 0, 1);
|
||||||
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
|
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
if(doneLoading) {
|
if(doneLoading) {
|
||||||
|
/*
|
||||||
|
* When all resources are loaded we can start the rendering.
|
||||||
|
*/
|
||||||
|
|
||||||
if(cvProc.isCameraCalibrated()) {
|
if(cvProc.isCameraCalibrated()) {
|
||||||
data = cvProc.findMarkersInFrame();
|
data = cvProc.findMarkersInFrame();
|
||||||
@@ -92,7 +94,7 @@ public class EviDemo extends ApplicationAdapter {
|
|||||||
if(data != null) {
|
if(data != null) {
|
||||||
|
|
||||||
for(int i = 0; i < ProjectConstants.MAXIMUM_NUMBER_OF_MARKERS; i++) {
|
for(int i = 0; i < ProjectConstants.MAXIMUM_NUMBER_OF_MARKERS; i++) {
|
||||||
if(data.markerCodes[i] == CODE) {
|
if(data.markerCodes[i] == ProjectConstants.CODE) {
|
||||||
monkey.position.set(data.translationVectors[i]);
|
monkey.position.set(data.translationVectors[i]);
|
||||||
monkey.rotation.set(data.rotationMatrices[i]);
|
monkey.rotation.set(data.rotationMatrices[i]);
|
||||||
monkey.applyWorldTransform();
|
monkey.applyWorldTransform();
|
||||||
@@ -104,7 +106,16 @@ public class EviDemo extends ApplicationAdapter {
|
|||||||
focalPointY = cvProc.getFocalPointY();
|
focalPointY = cvProc.getFocalPointY();
|
||||||
cameraCenterX = cvProc.getCameraCenterX();
|
cameraCenterX = cvProc.getCameraCenterX();
|
||||||
cameraCenterY = cvProc.getCameraCenterY();
|
cameraCenterY = cvProc.getCameraCenterY();
|
||||||
camera.setCustomARProjectionMatrix(focalPointX, focalPointY, cameraCenterX, cameraCenterY, NEAR, FAR, W, H);
|
camera.setCustomARProjectionMatrix(
|
||||||
|
focalPointX,
|
||||||
|
focalPointY,
|
||||||
|
cameraCenterX,
|
||||||
|
cameraCenterY,
|
||||||
|
ProjectConstants.NEAR,
|
||||||
|
ProjectConstants.FAR,
|
||||||
|
ProjectConstants.W,
|
||||||
|
ProjectConstants.H
|
||||||
|
);
|
||||||
camera.update(camera.projection);
|
camera.update(camera.projection);
|
||||||
|
|
||||||
frame = new Pixmap(data.outFrame, 0, data.outFrame.length);
|
frame = new Pixmap(data.outFrame, 0, data.outFrame.length);
|
||||||
@@ -135,7 +146,6 @@ public class EviDemo extends ApplicationAdapter {
|
|||||||
|
|
||||||
// Save the calibration points to the samples array.
|
// Save the calibration points to the samples array.
|
||||||
for(int i = 0; i < calib.calibrationPoints.length; i += 2){
|
for(int i = 0; i < calib.calibrationPoints.length; i += 2){
|
||||||
Gdx.app.log(TAG, CLASS_NAME + ".render(): Value " + Integer.toString(i) + " = (" + Float.toString(calib.calibrationPoints[i]) + ", " + Float.toString(calib.calibrationPoints[i + 1]) + ")");
|
|
||||||
calibrationSamples[lastSampleTaken][i] = calib.calibrationPoints[i];
|
calibrationSamples[lastSampleTaken][i] = calib.calibrationPoints[i];
|
||||||
calibrationSamples[lastSampleTaken][i + 1] = calib.calibrationPoints[i + 1];
|
calibrationSamples[lastSampleTaken][i + 1] = calib.calibrationPoints[i + 1];
|
||||||
}
|
}
|
||||||
@@ -164,6 +174,9 @@ public class EviDemo extends ApplicationAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
/*
|
||||||
|
* Keep loading the models until the AssetsManager finishes.
|
||||||
|
*/
|
||||||
doneLoading = manager.update();
|
doneLoading = manager.update();
|
||||||
if(doneLoading)
|
if(doneLoading)
|
||||||
monkey.setModel(manager.get("monkey.g3db", Model.class));
|
monkey.setModel(manager.get("monkey.g3db", Model.class));
|
||||||
|
@@ -21,4 +21,10 @@ public abstract class ProjectConstants{
|
|||||||
public static final int MAXIMUM_NUMBER_OF_MARKERS = 5;
|
public static final int MAXIMUM_NUMBER_OF_MARKERS = 5;
|
||||||
public static final int CALIBRATION_PATTERN_POINTS = 54;
|
public static final int CALIBRATION_PATTERN_POINTS = 54;
|
||||||
public static final int CALIBRATION_SAMPLES = 10;
|
public static final int CALIBRATION_SAMPLES = 10;
|
||||||
|
|
||||||
|
public static final int W = 640;
|
||||||
|
public static final int H = 360;
|
||||||
|
public static final float NEAR = 0.01f;
|
||||||
|
public static final float FAR = 10.0f;
|
||||||
|
public static final int CODE = 213;
|
||||||
}
|
}
|
||||||
|
@@ -14,20 +14,54 @@ import com.badlogic.gdx.math.Vector3;
|
|||||||
import ve.ucv.ciens.icaro.ardemo.ImageProcessor;
|
import ve.ucv.ciens.icaro.ardemo.ImageProcessor;
|
||||||
import ve.ucv.ciens.icaro.ardemo.ProjectConstants;
|
import ve.ucv.ciens.icaro.ardemo.ProjectConstants;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class implements the glue methods needed to use the OpenCV native methods. All
|
||||||
|
* image processing is done through this class.
|
||||||
|
*
|
||||||
|
* @author Miguel Angel Astor Romero.
|
||||||
|
*/
|
||||||
public class CVProcessor implements ImageProcessor {
|
public class CVProcessor implements ImageProcessor {
|
||||||
private static final String TAG = "NXTAR_ANDROID_MAIN";
|
private static final String TAG = "NXTAR_ANDROID_MAIN";
|
||||||
private static final String CLASS_NAME = CVProcessor.class.getSimpleName();
|
private static final String CLASS_NAME = CVProcessor.class.getSimpleName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates if the external native libraries were loaded successfully.
|
||||||
|
*/
|
||||||
private static boolean ocvOn = false;
|
private static boolean ocvOn = false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These two matrices represent the camera parameters calculated during camera calibration.
|
||||||
|
* Both parameters are needed to render the virtual objects correctly.
|
||||||
|
*/
|
||||||
private Mat cameraMatrix;
|
private Mat cameraMatrix;
|
||||||
private Mat distortionCoeffs;
|
private Mat distortionCoeffs;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These objects are used to capture data from the video files.
|
||||||
|
*/
|
||||||
private VideoCapture markerCap;
|
private VideoCapture markerCap;
|
||||||
private VideoCapture calibCap;
|
private VideoCapture calibCap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates if the camera calibration procedure completed sucessfully.
|
||||||
|
*/
|
||||||
private boolean cameraCalibrated;
|
private boolean cameraCalibrated;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This block is executed when this class is loaded by the Java VM. It attempts to load
|
||||||
|
* the external native libraries.
|
||||||
|
*/
|
||||||
|
static{
|
||||||
|
try{
|
||||||
|
System.loadLibrary("opencv_java248");
|
||||||
|
System.loadLibrary("evi_10");
|
||||||
|
ocvOn = true;
|
||||||
|
}catch(UnsatisfiedLinkError e){
|
||||||
|
e.printStackTrace();
|
||||||
|
ocvOn = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private native void getMarkerCodesAndLocations(
|
private native void getMarkerCodesAndLocations(
|
||||||
long inMat,
|
long inMat,
|
||||||
long outMat,
|
long outMat,
|
||||||
@@ -51,17 +85,6 @@ public class CVProcessor implements ImageProcessor {
|
|||||||
float[] calibrationPoints
|
float[] calibrationPoints
|
||||||
);
|
);
|
||||||
|
|
||||||
static{
|
|
||||||
try{
|
|
||||||
System.loadLibrary("opencv_java248");
|
|
||||||
System.loadLibrary("evi_10");
|
|
||||||
ocvOn = true;
|
|
||||||
}catch(UnsatisfiedLinkError e){
|
|
||||||
e.printStackTrace();
|
|
||||||
ocvOn = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isOcvOn() {
|
public static boolean isOcvOn() {
|
||||||
return ocvOn;
|
return ocvOn;
|
||||||
}
|
}
|
||||||
@@ -71,8 +94,8 @@ public class CVProcessor implements ImageProcessor {
|
|||||||
cameraMatrix = new Mat();
|
cameraMatrix = new Mat();
|
||||||
distortionCoeffs = new Mat();
|
distortionCoeffs = new Mat();
|
||||||
|
|
||||||
markerCap = new VideoCapture(arg[0]);
|
markerCap = new VideoCapture(arg[1]);
|
||||||
calibCap = new VideoCapture(arg[1]);
|
calibCap = new VideoCapture(arg[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@@ -1,10 +1,17 @@
|
|||||||
package ve.ucv.ciens.icaro.ardemo.desktop;
|
package ve.ucv.ciens.icaro.ardemo.desktop;
|
||||||
|
|
||||||
import ve.ucv.ciens.icaro.ardemo.EviDemo;
|
import ve.ucv.ciens.icaro.ardemo.EviDemo;
|
||||||
|
import ve.ucv.ciens.icaro.ardemo.ProjectConstants;
|
||||||
|
|
||||||
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
|
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
|
||||||
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
|
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the main class of the applicaton. It is in charge of creating the {@link CVProcessor} instance
|
||||||
|
* used throught the rest of the application and launching the {@link EviDemo} class.
|
||||||
|
*
|
||||||
|
* @author Miguel Angel Astor Romero.
|
||||||
|
*/
|
||||||
public class DesktopLauncher{
|
public class DesktopLauncher{
|
||||||
private static final String TAG = "NXTAR_ANDROID_MAIN";
|
private static final String TAG = "NXTAR_ANDROID_MAIN";
|
||||||
private static final String CLASS_NAME = DesktopLauncher.class.getSimpleName();
|
private static final String CLASS_NAME = DesktopLauncher.class.getSimpleName();
|
||||||
@@ -14,14 +21,14 @@ public class DesktopLauncher{
|
|||||||
throw new RuntimeException(TAG + " : " + CLASS_NAME + ": OpenCV failed to load.");
|
throw new RuntimeException(TAG + " : " + CLASS_NAME + ": OpenCV failed to load.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(arg.length != 2) {
|
if(arg.length != 3) {
|
||||||
System.err.println("Usage: EVI07 <markers video file> <calibration video file>");
|
System.err.println("Usage: " + arg[0] + " <markers video file> <calibration video file>");
|
||||||
System.exit(1);
|
System.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
|
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
|
||||||
config.width = 640;
|
config.width = ProjectConstants.W;
|
||||||
config.height = 360;
|
config.height = ProjectConstants.H;
|
||||||
new LwjglApplication(new EviDemo(new CVProcessor(arg)), config);
|
new LwjglApplication(new EviDemo(new CVProcessor(arg)), config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
17
packr.json
Normal file
17
packr.json
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"platform": "linux64",
|
||||||
|
"jdk": "/home/miky/Descargas/openjdk-1.7.0-u80-unofficial-linux-amd64-image.zip",
|
||||||
|
"executable": "Evidemo_amd64",
|
||||||
|
"appjar": "desktop/build/libs/desktop-1.0.jar",
|
||||||
|
"mainclass": "ve/ucv/ciens/icaro/ardemo/desktop/DesktopLauncher",
|
||||||
|
"vmargs": [
|
||||||
|
"-Xmx1G",
|
||||||
|
"-Djava.library.path=."
|
||||||
|
],
|
||||||
|
"resources": [
|
||||||
|
"desktop/libevi_10.so",
|
||||||
|
"desktop/libopencv_java248.so"
|
||||||
|
],
|
||||||
|
"minimizejre": "hard",
|
||||||
|
"outdir": "dist"
|
||||||
|
}
|
Reference in New Issue
Block a user