Added more comments.

This commit is contained in:
2014-05-06 18:28:18 -04:30
parent 31dd89f30e
commit e5b9bd681b
2 changed files with 112 additions and 25 deletions

View File

@@ -20,11 +20,11 @@
#include "marker.hpp"
//#define CAN_LOG
//#define LOG_ENABLED
#define POINTS_PER_CALIBRATION_SAMPLE 54
#define CALIBRATION_SAMPLES 10
#ifdef CAN_LOG
#ifdef LOG_ENABLED
#define log(TAG, MSG) (__android_log_write(ANDROID_LOG_DEBUG, TAG, MSG))
#else
#define log(TAG, MSG) ;
@@ -35,65 +35,79 @@ const char * TAG = "CVPROC_NATIVE";
extern "C"{
/**
*
* JNI wrapper around the nxtar::getAllMarkers() method.
*/
JNIEXPORT void JNICALL Java_ve_ucv_ciens_ccg_nxtar_MainActivity_getMarkerCodesAndLocations(JNIEnv* env, jobject jobj, jlong addrMatIn, jlong addrMatOut, jintArray codes){
char codeMsg[128];
std::vector<int> vCodes;
cv::Mat temp;
log(TAG, "getMarkerCodesAndLocations(): Requesting native data.");
// Get the native object addresses.
cv::Mat& myuv = *(cv::Mat*)addrMatIn;
cv::Mat& mbgr = *(cv::Mat*)addrMatOut;
jint * _codes = env->GetIntArrayElements(codes, 0);
cv::Mat temp;
// Convert the input image to the BGR color space.
log(TAG, "getMarkerCodesAndLocations(): Converting color space before processing.");
cv::cvtColor(myuv, temp, CV_RGB2BGR);
// Find all markers in the input image.
log(TAG, "getMarkerCodesAndLocations(): Finding markers.");
nxtar::getAllMarkers(vCodes, temp);
// Copy the marker codes to the output vector.
log(TAG, "getMarkerCodesAndLocations(): Copying marker codes.");
for(int i = 0; i < vCodes.size() && i < 15; i++){
_codes[i] = (jint)vCodes[i];
}
vCodes.clear();
// Convert the output image back to the RGB color space.
cv::cvtColor(temp, mbgr, CV_BGR2RGB);
// Release native data.
log(TAG, "getMarkerCodesAndLocations(): Releasing native data.");
env->ReleaseIntArrayElements(codes, _codes, 0);
}
/**
*
* JNI wrapper around the nxtar::findCalibrationPattern() method.
*/
JNIEXPORT jboolean JNICALL Java_ve_ucv_ciens_ccg_nxtar_MainActivity_findCalibrationPattern(JNIEnv* env, jobject jobj, jlong addrMatIn, jlong addrMatOut, jfloatArray points){
nxtar::points_vector v_points;
bool found;
cv::Mat temp;
log(TAG, "findCalibrationPattern(): Requesting native data.");
// Get the native object addresses.
cv::Mat& myuv = *(cv::Mat*)addrMatIn;
cv::Mat& mbgr = *(cv::Mat*)addrMatOut;
jfloat * _points = env->GetFloatArrayElements(points, 0);
cv::Mat temp;
// Convert the input image to the BGR color space.
log(TAG, "findCalibrationPattern(): Converting color space before processing.");
cv::cvtColor(myuv, temp, CV_RGB2BGR);
// Find the calibration points in the input image.
log(TAG, "findCalibrationPattern(): Finding calibration pattern.");
found = nxtar::findCalibrationPattern(v_points, temp);
log(TAG, "findCalibrationPattern(): Copying calibration points.");
for(size_t i = 0, p = 0; i < v_points.size(); i++, p += 2){
_points[p] = (jfloat)v_points[i].x;
_points[p + 1] = (jfloat)v_points[i].y;
// If the points were found then save them to the output array.
if(found){
log(TAG, "findCalibrationPattern(): Copying calibration points.");
for(size_t i = 0, p = 0; i < v_points.size(); i++, p += 2){
_points[p] = (jfloat)v_points[i].x;
_points[p + 1] = (jfloat)v_points[i].y;
}
}
// Convert the output image back to the RGB color space.
cv::cvtColor(temp, mbgr, CV_BGR2RGB);
// Release native data.
log(TAG, "findCalibrationPattern(): Releasing native data.");
env->ReleaseFloatArrayElements(points, _points, 0);
@@ -101,7 +115,7 @@ JNIEXPORT jboolean JNICALL Java_ve_ucv_ciens_ccg_nxtar_MainActivity_findCalibrat
}
/**
*
* JNI wrapper around the nxtar::getCameraParameters() method.
*/
JNIEXPORT jdouble JNICALL Java_ve_ucv_ciens_ccg_nxtar_MainActivity_calibrateCameraParameters(JNIEnv* env, jobject jobj, jlong addrMatIn, jlong addrMatOut, jlong addrMatFrame, jfloatArray points){
double error;

View File

@@ -50,23 +50,95 @@ import com.badlogic.gdx.controllers.mappings.Ouya;
* independant code, and handles OpenCV initialization and api calls.</p>
*/
public class MainActivity extends AndroidApplication implements OSFunctionalityProvider, CVProcessor{
/**
* Tag used for logging.
*/
private static final String TAG = "NXTAR_ANDROID_MAIN";
/**
* Class name used for logging.
*/
private static final String CLASS_NAME = MainActivity.class.getSimpleName();
/**
* Output stream used to codify images as JPEG using Android's Bitmap class.
*/
private static final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
private static boolean ocvOn = false;
private static Mat cameraMatrix, distortionCoeffs;
/**
* Indicates if OpenCV was initialized sucessfully.
*/
private static boolean ocvOn = false;
/**
* Intrinsic camera matrix.
*/
private static Mat cameraMatrix;
/**
* Distortion coeffitients matrix.
*/
private static Mat distortionCoeffs;
/**
* Used to set and release multicast locks.
*/
private WifiManager wifiManager;
/**
* Used to maintain the multicast lock during the service discovery procedure.
*/
private MulticastLock multicastLock;
/**
* Handler used for requesting toast messages from the core LibGDX code.
*/
private Handler uiHandler;
/**
* User interface context used to show the toast messages.
*/
private Context uiContext;
/**
* OpenCV asynchronous initializer callback for mobile devices.
*/
private BaseLoaderCallback loaderCallback;
/**
* Indicates if the current video streaming camera has been calibrated.
*/
private boolean cameraCalibrated;
public native void getMarkerCodesAndLocations(long inMat, long outMat, int[] codes);
public native boolean findCalibrationPattern(long inMat, long outMat, float[] points);
public native double calibrateCameraParameters(long camMat, long distMat, long frame, float[] calibrationPoints);
/**
* <p>Wrapper for the getAllMarkers native function.</p>
*
* @param inMat INPUT. The image to analize.
* @param outMat OUTPUT. The image with the markers highlighted.
* @param codes OUTPUT. The codes for each marker detected. Must be 15 elements long.
*/
private native void getMarkerCodesAndLocations(long inMat, long outMat, int[] codes);
/**
* <p>Wrapper for the findCalibrationPattern native function.</p>
*
* @param inMat INPUT. The image to analize.
* @param outMat OUTPUT. The image with the calibration pattern highlighted.
* @param points OUTPUT. The spatial location of the calibration points if found.
* @return True if the calibration pattern was found. False otherwise.
*/
private native boolean findCalibrationPattern(long inMat, long outMat, float[] points);
/**
* <p>Wrapper around the getCameraParameters native function.</p>
*
* @param camMat OUTPUT. The intrinsic camera matrix.
* @param distMat OUTPUT. The distortion coeffitients matrix.
* @param frame INPUT. A sample input image from the camera to calibrate.
* @param calibrationPoints INPUT. The calibration points of all samples.
* @return The calibration error as returned by OpenCV.
*/
private native double calibrateCameraParameters(long camMat, long distMat, long frame, float[] calibrationPoints);
/**
* <p>Static block. Tries to load OpenCV and the native method implementations
@@ -90,7 +162,9 @@ public class MainActivity extends AndroidApplication implements OSFunctionalityP
* <p>Initializes this activity</p>
*
* <p>This method handles the initialization of LibGDX and OpenCV. OpenCV is
* loaded the asynchronous method if the devices is not an OUYA console.
* loaded the asynchronous method if the devices is not an OUYA console.</p>
*
* @param savedInstanceState The application state if it was saved in a previous run.
*/
@Override
public void onCreate(Bundle savedInstanceState){
@@ -126,6 +200,7 @@ public class MainActivity extends AndroidApplication implements OSFunctionalityP
cameraMatrix = new Mat();
distortionCoeffs = new Mat();
break;
default:
Toast.makeText(uiContext, R.string.ocv_failed, Toast.LENGTH_LONG).show();
ocvOn = false;
@@ -164,9 +239,9 @@ public class MainActivity extends AndroidApplication implements OSFunctionalityP
////////////////////////////////////////////////
/**
* <p>Implementation of the showShortToast method.</p>
*
* <p>Shows a short message on screen using Android's toast mechanism.</p>
*
* @param msg The message to show.
*/
@Override
public void showShortToast(final String msg){
@@ -179,9 +254,9 @@ public class MainActivity extends AndroidApplication implements OSFunctionalityP
}
/**
* <p>Implementation of the showLongToast method.</p>
*
* <p>Shows a long message on screen using Android's toast mechanism.</p>
*
* @param msg The message to show.
*/
@Override
public void showLongToast(final String msg){
@@ -194,8 +269,6 @@ public class MainActivity extends AndroidApplication implements OSFunctionalityP
}
/**
* <p>Implementation of the enableMulticast method.</p>
*
* <p>Enable the transmision and reception of multicast network messages.</p>
*/
@Override
@@ -207,8 +280,6 @@ public class MainActivity extends AndroidApplication implements OSFunctionalityP
}
/**
* <p>Implementation of the disableMulticast method.</p>
*
* <p>Disables the transmision and reception of multicast network messages.</p>
*/
@Override
@@ -413,6 +484,8 @@ public class MainActivity extends AndroidApplication implements OSFunctionalityP
/**
* <p>Indicates if OpenCV has been sucessfully initialized and used
* to obtain the camera parameters for calibration.</p>
*
* @return True if and only if OpenCV initialized succesfully and calibrateCamera has been called previously.
*/
@Override
public boolean cameraIsCalibrated() {