From 453c3a36e593b1eb1c9fdfdbbfe3c55464d15770 Mon Sep 17 00:00:00 2001 From: Miguel Angel Astor Romero Date: Wed, 9 Apr 2014 14:56:00 -0430 Subject: [PATCH] Added the camera calibration pattern detection. --- jni/cv_proc.cpp | 66 ++- jni/marker.cpp | 530 +++++++++---------- jni/marker.hpp | 20 +- project.properties | 2 +- src/ve/ucv/ciens/ccg/nxtar/MainActivity.java | 8 +- 5 files changed, 304 insertions(+), 322 deletions(-) diff --git a/jni/cv_proc.cpp b/jni/cv_proc.cpp index 207c1fe..cf71345 100644 --- a/jni/cv_proc.cpp +++ b/jni/cv_proc.cpp @@ -22,6 +22,7 @@ //#define CAN_LOG extern "C"{ + #ifdef CAN_LOG #define log(TAG, MSG) (__android_log_write(ANDROID_LOG_DEBUG, TAG, MSG)) const char * TAG = "CVPROC_NATIVE"; @@ -29,38 +30,57 @@ const char * TAG = "CVPROC_NATIVE"; #define log(TAG, MSG) (1 + 1) #endif - JNIEXPORT void JNICALL Java_ve_ucv_ciens_ccg_nxtar_MainActivity_getMarkerCodesAndLocations( +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 vCodes; +){ + char codeMsg[128]; + std::vector vCodes; - log(TAG, "Requesting native data."); + log(TAG, "Requesting native data."); - cv::Mat& myuv = *(cv::Mat*)addrMatIn; - cv::Mat& mbgr = *(cv::Mat*)addrMatOut; - jint * _codes = env->GetIntArrayElements(codes, 0); + cv::Mat& myuv = *(cv::Mat*)addrMatIn; + cv::Mat& mbgr = *(cv::Mat*)addrMatOut; + jint * _codes = env->GetIntArrayElements(codes, 0); - log(TAG, "Converting color space before processing."); - cv::cvtColor(myuv, mbgr, CV_RGB2BGR); + log(TAG, "Converting color space before processing."); + cv::cvtColor(myuv, mbgr, CV_RGB2BGR); - log(TAG, "Finding markers."); - nxtar::getAllMarkers(vCodes, mbgr); + log(TAG, "Finding markers."); + nxtar::getAllMarkers(vCodes, mbgr); - log(TAG, "Copying marker codes."); - for(int i = 0; i < vCodes.size() && i < 15; i++){ - _codes[i] = vCodes[i]; - sprintf(codeMsg, "Code [%d] = %d", i, vCodes[i]); - log(TAG, codeMsg); - } - vCodes.clear(); - - log(TAG, "Releasing native data."); - - env->ReleaseIntArrayElements(codes, _codes, 0); + log(TAG, "Copying marker codes."); + for(int i = 0; i < vCodes.size() && i < 15; i++){ + _codes[i] = vCodes[i]; + sprintf(codeMsg, "Code [%d] = %d", i, vCodes[i]); + log(TAG, codeMsg); } + vCodes.clear(); + + log(TAG, "Releasing native data."); + + env->ReleaseIntArrayElements(codes, _codes, 0); +} + +JNIEXPORT void JNICALL Java_ve_ucv_ciens_ccg_nxtar_MainActivity_findCalibrationPattern( + JNIEnv* env, + jobject jobj, + jlong addrMatIn, + jlong addrMatOut +){ + log(TAG, "Requesting native data."); + + cv::Mat& myuv = *(cv::Mat*)addrMatIn; + cv::Mat& mbgr = *(cv::Mat*)addrMatOut; + + log(TAG, "Converting color space before processing."); + cv::cvtColor(myuv, mbgr, CV_RGB2BGR); + + log(TAG, "Finding markers."); + nxtar::calibrateCamera(mbgr); +} + } diff --git a/jni/marker.cpp b/jni/marker.cpp index c4eee4f..e4249e1 100644 --- a/jni/marker.cpp +++ b/jni/marker.cpp @@ -24,375 +24,323 @@ namespace nxtar{ - static const cv::Scalar COLOR = cv::Scalar(255, 255, 255); +static int PATTERN_DETECTION_PARAMS = cv::CALIB_CB_ADAPTIVE_THRESH + cv::CALIB_CB_NORMALIZE_IMAGE + cv::CALIB_CB_FAST_CHECK; +static const cv::TermCriteria termCriteria = cv::TermCriteria(CV_TERMCRIT_EPS + CV_TERMCRIT_ITER, 30, 0.1); +static const cv::Scalar COLOR = cv::Scalar(255, 255, 255); +static const cv::Size checkersPatternSize(6, 9); + +float perimeter (points_vector &); +int hammDistMarker (cv::Mat); +cv::Mat rotate (cv::Mat); +int decodeMarker (cv::Mat &); +void renderMarkers (markers_vector &, cv::Mat &); +void isolateMarkers (const contours_vector &, markers_vector &); +void findContours (cv::Mat &, contours_vector &, int); +void warpMarker (Marker &, cv::Mat &, cv::Mat &); + +void getAllMarkers(std::vector & codes, cv::Mat & img){ + cv::Mat gray, thresh, cont, mark; + contours_vector contours; + markers_vector markers; + markers_vector valid_markers; +#ifdef DESKTOP + std::ostringstream oss; +#endif - class Marker; - - typedef std::vector > contours_vector; - typedef std::vector points_vector; - typedef std::vector markers_vector; + codes.clear(); + + cv::cvtColor(img, gray, CV_BGR2GRAY); + cv::adaptiveThreshold(gray, thresh, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY_INV, 7, 7); + findContours(thresh, contours, 40); + isolateMarkers(contours, markers); - class Marker{ - public: - ~Marker(); - points_vector points; - int code; - }; + for(int i = 0; i < markers.size(); i++){ + warpMarker(markers[i], gray, mark); - float perimeter(points_vector &); - int hammDistMarker(cv::Mat); - cv::Mat rotate(cv::Mat); - void binarize(cv::Mat &, cv::Mat &); - void findContours(cv::Mat &, contours_vector &, int); - void renderContours(contours_vector &, cv::Mat &); - void renderMarkers(markers_vector &, cv::Mat &); - void warpMarker(Marker &, cv::Mat &, cv::Mat &); - int decodeMarker(cv::Mat &); - void fixCorners(cv::Mat &, Marker &); - void isolateMarkers(const contours_vector &, markers_vector &); + int code = decodeMarker(mark); - void getAllMarkers(std::vector & codes, cv::Mat & img){ - cv::Mat gray, thresh, cont, mark; - contours_vector contours; - markers_vector markers; - markers_vector valid_markers; + if(code != -1){ + markers[i].code = code; + valid_markers.push_back(markers[i]); + } + } - codes.clear(); + for(int i = 0; i < valid_markers.size(); i++){ +#ifdef DESKTOP + oss << valid_markers[i].code; - cv::cvtColor(img, gray, CV_BGR2GRAY); - binarize(gray, thresh); - findContours(thresh, contours, 40); - isolateMarkers(contours, markers); + cv::putText(mark, oss.str(), cv::Point(5, 250), cv::FONT_HERSHEY_PLAIN, 2, cv::Scalar::all(128), 3, 8); - for(int i = 0; i < markers.size(); i++){ - warpMarker(markers[i], gray, mark); + oss.str(""); + oss.clear(); - int code = decodeMarker(mark); + oss << "Marker[" << i << "]"; - if(code != -1){ - markers[i].code = code; - valid_markers.push_back(markers[i]); - } - } + cv::imshow(oss.str(), mark); - for(int i = 0; i < valid_markers.size(); i++) - fixCorners(gray, valid_markers[i]); + oss.str(""); + oss.clear(); +#endif + cv::cornerSubPix(gray, valid_markers[i].points, cvSize(10, 10), cvSize(-1, -1), termCriteria); + codes.push_back(valid_markers[i].code); + } - cont = cv::Mat::zeros(img.size(), CV_8UC3); - renderMarkers(valid_markers, cont); + cont = cv::Mat::zeros(img.size(), CV_8UC3); + renderMarkers(valid_markers, cont); - img = img + cont; + img = img + cont; - for(int i = 0; i < valid_markers.size(); i++){ - codes.push_back(valid_markers[i].code); - } + markers.clear(); + contours.clear(); + valid_markers.clear(); +} - markers.clear(); - contours.clear(); - valid_markers.clear(); - } +void calibrateCamera(cv::Mat & img){ + bool patternfound; + points_vector corners; + cv::Mat gray; - #ifdef DESKTOP - void getAllMarkers_d(std::vector & codes, cv::Mat & img){ - cv::Mat gray, thresh, cont, mark; - contours_vector contours; - markers_vector markers; - markers_vector valid_markers; - std::ostringstream oss; + cv::cvtColor(img, gray, CV_BGR2GRAY); + patternfound = cv::findChessboardCorners(gray, checkersPatternSize, corners, PATTERN_DETECTION_PARAMS); - codes.clear(); + if(patternfound) + cv::cornerSubPix(gray, corners, cv::Size(11, 11), cv::Size(-1, -1), termCriteria); - cv::cvtColor(img, gray, CV_BGR2GRAY); - binarize(gray, thresh); - findContours(thresh, contours, 40); - isolateMarkers(contours, markers); + cv::drawChessboardCorners(img, checkersPatternSize, cv::Mat(corners), patternfound); +} - for(int i = 0; i < markers.size(); i++){ - warpMarker(markers[i], gray, mark); +void findContours(cv::Mat & img, contours_vector & v, int minP){ + std::vector > c; + cv::findContours(img, c, CV_RETR_LIST, CV_CHAIN_APPROX_NONE); - int code = decodeMarker(mark); + v.clear(); + for(size_t i = 0; i < c.size(); i++){ + if(c[i].size() > minP){ + v.push_back(c[i]); + } + } +} - if(code != -1){ - markers[i].code = code; - valid_markers.push_back(markers[i]); - } - } +void renderMarkers(markers_vector & v, cv::Mat & dst){ + contours_vector cv; - for(int i = 0; i < valid_markers.size(); i++) - fixCorners(gray, valid_markers[i]); + for(size_t i = 0; i < v.size(); i++){ + std::vector pv; + for(size_t j = 0; j < v[i].points.size(); ++j) + pv.push_back(cv::Point2f(v[i].points[j].x, v[i].points[j].y)); + cv.push_back(pv); + } - cont = cv::Mat::zeros(img.size(), CV_8UC3); - renderMarkers(valid_markers, cont); + cv::drawContours(dst, cv, -1, COLOR, 1, CV_AA); +} - img = img + cont; +void isolateMarkers(const contours_vector & vc, markers_vector & vm){ + std::vector appCurve; + markers_vector posMarkers; - for(int i = 0; i < valid_markers.size(); i++){ - oss << valid_markers[i].code; + for(size_t i = 0; i < vc.size(); ++i){ + double eps = vc[i].size() * 0.05; + cv::approxPolyDP(vc[i], appCurve, eps, true); - cv::putText(mark, oss.str(), cv::Point(5, 250), cv::FONT_HERSHEY_PLAIN, 2, cv::Scalar::all(128), 3, 8); + if(appCurve.size() != 4 || !cv::isContourConvex(appCurve)) continue; - oss.str(""); - oss.clear(); + float minD = std::numeric_limits::max(); - oss << "Marker[" << i << "]"; + for(int i = 0; i < 4; i++){ + cv::Point side = appCurve[i] - appCurve[(i + 1) % 4]; + float sqSideLen = side.dot(side); + minD = std::min(minD, sqSideLen); + } - cv::imshow(oss.str(), mark); + if(minD < MIN_CONTOUR_LENGTH) continue; - oss.str(""); - oss.clear(); + Marker m; - codes.push_back(valid_markers[i].code); - } + for(int i = 0; i < 4; i++) + m.points.push_back(cv::Point2f(appCurve[i].x, appCurve[i].y)); - markers.clear(); - contours.clear(); - valid_markers.clear(); - } - #endif + cv::Point v1 = m.points[1] - m.points[0]; + cv::Point v2 = m.points[2] - m.points[0]; - void binarize(cv::Mat & src, cv::Mat & dst){ - cv::adaptiveThreshold(src, dst, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY_INV, 7, 7); - } + double o = (v1.x * v2.y) - (v1.y * v2.x); + if(o < 0.0) std::swap(m.points[1], m.points[3]); - void findContours(cv::Mat & img, contours_vector & v, int minP){ - std::vector > c; - cv::findContours(img, c, CV_RETR_LIST, CV_CHAIN_APPROX_NONE); + posMarkers.push_back(m); + } - v.clear(); - for(size_t i = 0; i < c.size(); i++){ - if(c[i].size() > minP){ - v.push_back(c[i]); - } - } - } + std::vector > tooNear; + for(size_t i = 0; i < posMarkers.size(); ++i){ + const Marker & m1 = posMarkers[i]; - void renderContours(contours_vector & v, cv::Mat & dst){ - cv::drawContours(dst, v, -1, COLOR, 1, CV_AA); - } + for(size_t j = i + 1; j < posMarkers.size(); j++){ + const Marker & m2 = posMarkers[j]; - void renderMarkers(markers_vector & v, cv::Mat & dst){ - contours_vector cv; + float dSq = 0.0f; - for(size_t i = 0; i < v.size(); i++){ - std::vector pv; - for(size_t j = 0; j < v[i].points.size(); ++j) - pv.push_back(cv::Point2f(v[i].points[j].x, v[i].points[j].y)); - cv.push_back(pv); - } + for(int c = 0; c < 4; c++){ + cv::Point v = m1.points[c] - m2.points[c]; + dSq += v.dot(v); + } - cv::drawContours(dst, cv, -1, COLOR, 1, CV_AA); - } + dSq /= 4.0f; - void isolateMarkers(const contours_vector & vc, markers_vector & vm){ - std::vector appCurve; - markers_vector posMarkers; + if(dSq < 100) tooNear.push_back(std::pair(i, j)); + } + } - for(size_t i = 0; i < vc.size(); ++i){ - double eps = vc[i].size() * 0.05; - cv::approxPolyDP(vc[i], appCurve, eps, true); + std::vector remMask(posMarkers.size(), false); - if(appCurve.size() != 4 || !cv::isContourConvex(appCurve)) continue; + for(size_t i = 0; i < tooNear.size(); ++i){ + float p1 = perimeter(posMarkers[tooNear[i].first].points); + float p2 = perimeter(posMarkers[tooNear[i].second].points); - float minD = std::numeric_limits::max(); + size_t remInd; + if(p1 > p2) remInd = tooNear[i].second; + else remInd = tooNear[i].first; - for(int i = 0; i < 4; i++){ - cv::Point side = appCurve[i] - appCurve[(i + 1) % 4]; - float sqSideLen = side.dot(side); - minD = std::min(minD, sqSideLen); - } + remMask[remInd] = true; + } - if(minD < MIN_CONTOUR_LENGTH) continue; + vm.clear(); + for(size_t i = 0; i < posMarkers.size(); ++i){ + if(remMask[i]) vm.push_back(posMarkers[i]); + } +} - Marker m; +void warpMarker(Marker & m, cv::Mat & in, cv::Mat & out){ + cv::Mat bin; + cv::Size markerSize(350, 350); + points_vector v; + v.push_back(cv::Point2f(0,0)); + v.push_back(cv::Point2f(markerSize.width-1,0)); + v.push_back(cv::Point2f(markerSize.width-1,markerSize.height-1)); + v.push_back(cv::Point2f(0,markerSize.height-1)); - for(int i = 0; i < 4; i++) - m.points.push_back(cv::Point2f(appCurve[i].x, appCurve[i].y)); + cv::Mat M = cv::getPerspectiveTransform(m.points, v); + cv::warpPerspective(in, bin, M, markerSize); - cv::Point v1 = m.points[1] - m.points[0]; - cv::Point v2 = m.points[2] - m.points[0]; + cv::threshold(bin, out, 128, 255, cv::THRESH_BINARY | cv::THRESH_OTSU); +} - double o = (v1.x * v2.y) - (v1.y * v2.x); - if(o < 0.0) std::swap(m.points[1], m.points[3]); +int hammDistMarker(cv::Mat bits){ + int ids[4][5] = { + {1,0,0,0,0}, + {1,0,1,1,1}, + {0,1,0,0,1}, + {0,1,1,1,0} + }; - posMarkers.push_back(m); - } + int dist = 0; - std::vector > tooNear; - for(size_t i = 0; i < posMarkers.size(); ++i){ - const Marker & m1 = posMarkers[i]; + for (int y = 0; y < 5; y++){ + int minSum = 1e5; - for(size_t j = i + 1; j < posMarkers.size(); j++){ - const Marker & m2 = posMarkers[j]; + for (int p = 0; p < 4; p++){ + int sum = 0; - float dSq = 0.0f; + for (int x = 0; x < 5; x++){ + sum += bits.at(y, x) == ids[p][x] ? 0 : 1; + } - for(int c = 0; c < 4; c++){ - cv::Point v = m1.points[c] - m2.points[c]; - dSq += v.dot(v); - } + if(minSum > sum) + minSum = sum; + } - dSq /= 4.0f; + dist += minSum; + } - if(dSq < 100) tooNear.push_back(std::pair(i, j)); - } - } + return dist; +} - std::vector remMask(posMarkers.size(), false); +cv::Mat rotate(cv::Mat in){ + cv::Mat out; + in.copyTo(out); + for (int i=0;i(i,j)=in.at(in.cols-j-1,i); + } + } - for(size_t i = 0; i < tooNear.size(); ++i){ - float p1 = perimeter(posMarkers[tooNear[i].first].points); - float p2 = perimeter(posMarkers[tooNear[i].second].points); + return out; +} - size_t remInd; - if(p1 > p2) remInd = tooNear[i].second; - else remInd = tooNear[i].first; +int decodeMarker(cv::Mat & marker){ + bool found = false; + int code = 0; + cv::Mat bits; - remMask[remInd] = true; - } + for(int y = 0; y < 7; y++){ + int inc = (y == 0 || y == 6) ? 1 : 6; - vm.clear(); - for(size_t i = 0; i < posMarkers.size(); ++i){ - if(remMask[i]) vm.push_back(posMarkers[i]); - } - } + for(int x = 0; x < 7; x += inc){ + int cX = x * 50; + int cY = y * 50; - void warpMarker(Marker & m, cv::Mat & in, cv::Mat & out){ - cv::Mat bin; - cv::Size markerSize(350, 350); - points_vector v; - v.push_back(cv::Point2f(0,0)); - v.push_back(cv::Point2f(markerSize.width-1,0)); - v.push_back(cv::Point2f(markerSize.width-1,markerSize.height-1)); - v.push_back(cv::Point2f(0,markerSize.height-1)); + cv::Mat cell = marker(cv::Rect(cX, cY, 50, 50)); - cv::Mat M = cv::getPerspectiveTransform(m.points, v); - cv::warpPerspective(in, bin, M, markerSize); + int nZ = cv::countNonZero(cell); - cv::threshold(bin, out, 128, 255, cv::THRESH_BINARY | cv::THRESH_OTSU); - } + // Not a valid marker. + if(nZ > (50 * 50) / 2) return -1; + } + } - int hammDistMarker(cv::Mat bits){ - int ids[4][5] = { - {1,0,0,0,0}, - {1,0,1,1,1}, - {0,1,0,0,1}, - {0,1,1,1,0} - }; + bits = cv::Mat::zeros(5, 5, CV_8UC1); - int dist = 0; - for (int y = 0; y < 5; y++){ - int minSum = 1e5; + for(int y = 0; y < 5; y++){ + for(int x = 0; x < 5; x++){ + int cX = (x + 1) * 50; + int cY = (y + 1) * 50; - for (int p = 0; p < 4; p++){ - int sum = 0; + cv::Mat cell = marker(cv::Rect(cX, cY, 50, 50)); - for (int x = 0; x < 5; x++){ - sum += bits.at(y, x) == ids[p][x] ? 0 : 1; - } + int nZ = cv::countNonZero(cell); - if(minSum > sum) - minSum = sum; - } + if(nZ > (50 * 50) / 2) bits.at(y, x) = 1; + } + } - dist += minSum; - } + if(hammDistMarker(bits) != 0){ + for(int r = 1; r < 4; r++){ + bits = rotate(bits); + if(hammDistMarker(bits) != 0) continue; + else{ found = true; break;} + } + }else found = true; - return dist; - } - cv::Mat rotate(cv::Mat in){ - cv::Mat out; - in.copyTo(out); - for (int i=0;i(i,j)=in.at(in.cols-j-1,i); - } - } - return out; - } + if(found){ + for(int y = 0; y < 5; y++){ + code <<= 1; + if(bits.at(y, 1)) + code |= 1; - int decodeMarker(cv::Mat & marker){ - bool found = false; - int code = 0; - cv::Mat bits; + code <<= 1; + if(bits.at(y, 3)) + code |= 1; + } - for(int y = 0; y < 7; y++){ - int inc = (y == 0 || y == 6) ? 1 : 6; - for(int x = 0; x < 7; x += inc){ - int cX = x * 50; - int cY = y * 50; + return code; + }else + return -1; +} - cv::Mat cell = marker(cv::Rect(cX, cY, 50, 50)); +float perimeter(points_vector & p){ + float per = 0.0f, dx, dy; - int nZ = cv::countNonZero(cell); + for(size_t i; i < p.size(); ++i){ + dx = p[i].x - p[(i + 1) % p.size()].x; + dy = p[i].y - p[(i + 1) % p.size()].y; + per += sqrt((dx * dx) + (dy * dy)); + } - // Not a valid marker. - if(nZ > (50 * 50) / 2) return -1; - } - } + return per; +} - bits = cv::Mat::zeros(5, 5, CV_8UC1); - - - for(int y = 0; y < 5; y++){ - for(int x = 0; x < 5; x++){ - int cX = (x + 1) * 50; - int cY = (y + 1) * 50; - - cv::Mat cell = marker(cv::Rect(cX, cY, 50, 50)); - - int nZ = cv::countNonZero(cell); - - if(nZ > (50 * 50) / 2) bits.at(y, x) = 1; - } - } - - if(hammDistMarker(bits) != 0){ - for(int r = 1; r < 4; r++){ - bits = rotate(bits); - if(hammDistMarker(bits) != 0) continue; - else{ found = true; break;} - } - }else found = true; - - - if(found){ - for(int y = 0; y < 5; y++){ - code <<= 1; - if(bits.at(y, 1)) - code |= 1; - - code <<= 1; - if(bits.at(y, 3)) - code |= 1; - } - - - return code; - }else - return -1; - } - - void fixCorners(cv::Mat & img, Marker & m){ - cv::cornerSubPix(img, m.points, cvSize(10, 10), cvSize(-1, -1), cvTermCriteria(CV_TERMCRIT_ITER, 30, 0.1)); - } - - float perimeter(points_vector & p){ - float per = 0.0f, dx, dy; - - for(size_t i; i < p.size(); ++i){ - dx = p[i].x - p[(i + 1) % p.size()].x; - dy = p[i].y - p[(i + 1) % p.size()].y; - per += sqrt((dx * dx) + (dy * dy)); - } - - return per; - } - - Marker::~Marker(){ - points.clear(); - } +Marker::~Marker(){ + points.clear(); +} } diff --git a/jni/marker.hpp b/jni/marker.hpp index 1164729..41c9e24 100644 --- a/jni/marker.hpp +++ b/jni/marker.hpp @@ -20,10 +20,22 @@ #include namespace nxtar{ - void getAllMarkers(std::vector &, cv::Mat &); -#ifdef DESKTOP - void getAllMarkers_d(std::vector &, cv::Mat &); -#endif + +class Marker; + +typedef std::vector > contours_vector; +typedef std::vector points_vector; +typedef std::vector markers_vector; + +class Marker{ +public: + ~Marker(); + points_vector points; + int code; +}; + +void getAllMarkers(std::vector &, cv::Mat &); +void calibrateCamera(cv::Mat &); } #endif diff --git a/project.properties b/project.properties index 13bb423..34ab397 100644 --- a/project.properties +++ b/project.properties @@ -9,4 +9,4 @@ # Project target. target=android-19 -android.library.reference.1=../../../../../Escritorio/OpenCV-2.4.7-android-sdk/sdk/java +android.library.reference.1=../../../../../NVPACK/OpenCV-2.4.5-Tegra-sdk-r2/sdk/java diff --git a/src/ve/ucv/ciens/ccg/nxtar/MainActivity.java b/src/ve/ucv/ciens/ccg/nxtar/MainActivity.java index b75a6f5..da2085e 100644 --- a/src/ve/ucv/ciens/ccg/nxtar/MainActivity.java +++ b/src/ve/ucv/ciens/ccg/nxtar/MainActivity.java @@ -57,17 +57,18 @@ public class MainActivity extends AndroidApplication implements Toaster, Multica static{ if(!OpenCVLoader.initDebug()){ - Gdx.app.exit(); + System.exit(1); } try{ System.loadLibrary("cvproc"); ocvOn = true; }catch(UnsatisfiedLinkError u){ - Gdx.app.exit(); + System.exit(1); } } public native void getMarkerCodesAndLocations(long inMat, long outMat, int[] codes); + public native void findCalibrationPattern(long inMat, long outMat); @Override public void onCreate(Bundle savedInstanceState){ @@ -167,7 +168,8 @@ public class MainActivity extends AndroidApplication implements Toaster, Multica Mat outImg = new Mat(); Utils.bitmapToMat(tFrame, inImg); - getMarkerCodesAndLocations(inImg.getNativeObjAddr(), outImg.getNativeObjAddr(), codes); + //getMarkerCodesAndLocations(inImg.getNativeObjAddr(), outImg.getNativeObjAddr(), codes); + findCalibrationPattern(inImg.getNativeObjAddr(), outImg.getNativeObjAddr()); Mat temp = new Mat(); Imgproc.cvtColor(outImg, temp, Imgproc.COLOR_BGR2RGB);