From d5538ee99d33bb9621a03254064760e7319fd7fa Mon Sep 17 00:00:00 2001 From: matlabbe Date: Thu, 18 Feb 2016 18:25:26 -0500 Subject: [PATCH] DB: loading calibration when reactivating signatures (for PnP registration without reloading compressed data) --- corelib/src/DBDriverSqlite3.cpp | 111 ++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/corelib/src/DBDriverSqlite3.cpp b/corelib/src/DBDriverSqlite3.cpp index e372f5ab..754290f2 100644 --- a/corelib/src/DBDriverSqlite3.cpp +++ b/corelib/src/DBDriverSqlite3.cpp @@ -1584,6 +1584,7 @@ void DBDriverSqlite3::loadSignaturesQuery(const std::list & ids, std::list< rc = sqlite3_prepare_v2(_ppDb, query2.str().c_str(), -1, &ppStmt, 0); UASSERT_MSG(rc == SQLITE_OK, uFormat("DB error (%s): %s", _version.c_str(), sqlite3_errmsg(_ppDb)).c_str()); + std::set calibrationsToLoad; for(std::list::const_iterator iter=nodes.begin(); iter!=nodes.end(); ++iter) { //ULOGGER_DEBUG("Loading words of %d...", (*iter)->id()); @@ -1659,6 +1660,7 @@ void DBDriverSqlite3::loadSignaturesQuery(const std::list & ids, std::list< } else { + calibrationsToLoad.insert((*iter)->id()); (*iter)->setWords(visualWords); (*iter)->setWords3(visualWords3); (*iter)->setWordsDescriptors(descriptors); @@ -1683,6 +1685,115 @@ void DBDriverSqlite3::loadSignaturesQuery(const std::list & ids, std::list< } ULOGGER_DEBUG("Time load links=%fs", timer.ticks()); + // load calibrations + if(calibrationsToLoad.size() && uStrNumCmp(_version, "0.10.0") >= 0) + { + std::stringstream query3; + query3 << "SELECT calibration " + "FROM Data " + "WHERE id = ? "; + + rc = sqlite3_prepare_v2(_ppDb, query3.str().c_str(), -1, &ppStmt, 0); + UASSERT_MSG(rc == SQLITE_OK, uFormat("DB error (%s): %s", _version.c_str(), sqlite3_errmsg(_ppDb)).c_str()); + + + for(std::list::const_iterator iter=nodes.begin(); iter!=nodes.end(); ++iter) + { + if(calibrationsToLoad.find((*iter)->id())!=calibrationsToLoad.end()) + { + // bind id + rc = sqlite3_bind_int(ppStmt, 1, (*iter)->id()); + UASSERT_MSG(rc == SQLITE_OK, uFormat("DB error (%s): %s", _version.c_str(), sqlite3_errmsg(_ppDb)).c_str()); + + rc = sqlite3_step(ppStmt); + if(rc == SQLITE_ROW) + { + int index=0; + const void * data = 0; + int dataSize = 0; + Transform localTransform = Transform::getIdentity(); + std::vector models; + StereoCameraModel stereoModel; + + // calibration + data = sqlite3_column_blob(ppStmt, index); + dataSize = sqlite3_column_bytes(ppStmt, index++); + // multi-cameras [fx,fy,cx,cy,[width,height],local_transform, ... ,fx,fy,cx,cy,[width,height],local_transform] (4or6+12)*float * numCameras + // stereo [fx, fy, cx, cy, baseline, local_transform] (5+12)*float + if(dataSize > 0 && data) + { + float * dataFloat = (float*)data; + if((unsigned int)dataSize % (4+localTransform.size())*sizeof(float) == 0) + { + int cameraCount = dataSize / ((4+localTransform.size())*sizeof(float)); + UDEBUG("Loading calibration for %d cameras (%d bytes)", cameraCount, dataSize); + int max = cameraCount*(4+localTransform.size()); + for(int i=0; isensorData().setCameraModels(models); + (*iter)->sensorData().setStereoCameraModel(stereoModel); + } + } + UASSERT_MSG(rc == SQLITE_DONE, uFormat("DB error (%s): %s", _version.c_str(), sqlite3_errmsg(_ppDb)).c_str()); + + //reset + rc = sqlite3_reset(ppStmt); + UASSERT_MSG(rc == SQLITE_OK, uFormat("DB error (%s): %s", _version.c_str(), sqlite3_errmsg(_ppDb)).c_str()); + } + } + // Finalize (delete) the statement + rc = sqlite3_finalize(ppStmt); + UASSERT_MSG(rc == SQLITE_OK, uFormat("DB error (%s): %s", _version.c_str(), sqlite3_errmsg(_ppDb)).c_str()); + } + + ULOGGER_DEBUG("Time load calibrations=%fs", timer.ticks()); + if(ids.size() != loaded) { UERROR("Some signatures not found in database");