Существует еще один вариант обнаружения угловых точек маркеров. Это потребует некоторых изменений в коде оболочки и перекомпиляции двоичных файлов Android.
Разветвите или клонируйте репозиторий artoolkit5 github и внесите следующие изменения:
Добавьте запись в ARMarker.h
float cornerPoints[8];
В ARMarkerSquare.cpp внесите изменения в метод updateWithDetectedMarkers сразу после того, как код, в котором маркер был определен как видимый, обновите CornerPoints:
// Consider marker visible if a match was found.
if (k != -1) {
visible = true;
m_cf = markerInfo[k].cf;
for (int c = 0; c < 4; c++) {
cornerPoints[c*2] = markerInfo[k].vertex[c][0];
cornerPoints[c*2 + 1] = markerInfo[k].vertex[c][1];
}
Добавьте новый метод ARToolKitWrapperExportedAPI.cpp для получения угловых точек:
EXPORT_API bool arwQueryMarkerCornerPoints(int markerUID, float points[8])
{
ARMarker *marker;
if (!gARTK) return false;
if (!(marker = gARTK->findMarker(markerUID))) {
gARTK->logv(AR_LOG_LEVEL_ERROR, "arwQueryMarkerCornerPoints(): Couldn't locate marker with UID %d.", markerUID);
return false;
}
for (int i = 0; i < 8; i++) points[i] = (float)marker->cornerPoints[i];
return marker->visible;
}
И добавьте для этого определение JNI:
JNIEXPORT jfloatArray JNICALL JNIFUNCTION(arwQueryMarkerCornerPoints(JNIEnv *env, jobject obj, jint markerUID))
{
float trans[8];
if (arwQueryMarkerCornerPoints(markerUID, trans)) return glArrayToJava(env, trans, 8);
return NULL;
}
После всего этого я перекомпилировал общие объекты ARWrapper в каталоге android с помощью скрипта build.sh и использовал эти новые общие объекты.
В NativeInterface.java добавьте следующий метод:
/**
* Retrieves the corner points for the specified marker
*
* @param markerUID The unique identifier (UID) of the marker to check
* @return A float array of size 8 containing the corner points starting at top left (x,y) top right, bottom right, bottom left.
* So
*/
public static native float[] arwQueryMarkerCornerPoints(int markerUID);
И, наконец, добавьте метод в ARToolKit.java:
/**
* Retrieves the corner points for the specified marker
*
* @param markerUID The unique identifier (UID) of the marker to check
* @return A float array of size 8 containing the corner points starting at top left (x,y) top right, bottom right, bottom left.
*
*/
public float[] arwQueryMarkerCornerPoints(int markerUID) {
if (!initedNative) return null;
return NativeInterface.arwQueryMarkerCornerPoints(markerUID);
}
Смотрите также:
https://archive.artoolkit.org/community/forums/viewtopic.php?f=26&t=16099
Изменения можно увидеть и в этом форке: https://github.com/ekkelenkamp/artoolkit5/tree/marker_corner_points
person
Ekkelenkamp
schedule
17.08.2016