Function bodies 2,155 total
interpolateMeasure function · cpp · L344-L379 (36 LOC)Examples_old/Monocular-Inertial/mono_inertial_realsense_t265.cc
rs2_vector interpolateMeasure(const double target_time,
const rs2_vector current_data, const double current_time,
const rs2_vector prev_data, const double prev_time){
// If there are not previous information, the current data is propagated
if(prev_time == 0){
return current_data;
}
rs2_vector increment;
rs2_vector value_interp;
if(target_time > current_time) {
value_interp = current_data;
}
else if(target_time > prev_time){
increment.x = current_data.x - prev_data.x;
increment.y = current_data.y - prev_data.y;
increment.z = current_data.z - prev_data.z;
double factor = (target_time - prev_time) / (current_time - prev_time);
value_interp.x = prev_data.x + increment.x * factor;
value_interp.y = prev_data.y + increment.y * factor;
value_interp.z = prev_data.z + increment.z * factor;
// zero interpolation
main function · cpp · L40-L284 (245 LOC)Examples_old/Monocular-Inertial/mono_inertial_tum_vi.cc
int main(int argc, char **argv)
{
const int num_seq = (argc-3)/3;
cout << "num_seq = " << num_seq << endl;
bool bFileName= ((argc % 3) == 1);
string file_name;
if (bFileName)
file_name = string(argv[argc-1]);
cout << "file name: " << file_name << endl;
if(argc < 6)
{
cerr << endl << "Usage: ./mono_inertial_tum_vi path_to_vocabulary path_to_settings path_to_image_folder_1 path_to_times_file_1 path_to_imu_data_1 (path_to_image_folder_2 path_to_times_file_2 path_to_imu_data_2 ... path_to_image_folder_N path_to_times_file_N path_to_imu_data_N) (trajectory_file_name)" << endl;
return 1;
}
// Load all sequences:
int seq;
vector< vector<string> > vstrImageFilenames;
vector< vector<double> > vTimestampsCam;
vector< vector<cv::Point3f> > vAcc, vGyro;
vector< vector<double> > vTimestampsImu;
vector<int> nImages;
vector<int> nImu;
vector<int> first_imu(num_seq,0);
vstrImageFilenames.resize(nLoadImagesTUMVI function · cpp · L285-L313 (29 LOC)Examples_old/Monocular-Inertial/mono_inertial_tum_vi.cc
void LoadImagesTUMVI(const string &strImagePath, const string &strPathTimes,
vector<string> &vstrImages, vector<double> &vTimeStamps)
{
ifstream fTimes;
cout << strImagePath << endl;
cout << strPathTimes << endl;
fTimes.open(strPathTimes.c_str());
vTimeStamps.reserve(5000);
vstrImages.reserve(5000);
while(!fTimes.eof())
{
string s;
getline(fTimes,s);
if(!s.empty())
{
if (s[0] == '#')
continue;
int pos = s.find(' ');
string item = s.substr(0, pos);
vstrImages.push_back(strImagePath + "/" + item + ".png");
double t = stod(item);
vTimeStamps.push_back(t/1e9);
}
}
}LoadIMU function · cpp · L314-L349 (36 LOC)Examples_old/Monocular-Inertial/mono_inertial_tum_vi.cc
void LoadIMU(const string &strImuPath, vector<double> &vTimeStamps, vector<cv::Point3f> &vAcc, vector<cv::Point3f> &vGyro)
{
ifstream fImu;
fImu.open(strImuPath.c_str());
vTimeStamps.reserve(5000);
vAcc.reserve(5000);
vGyro.reserve(5000);
while(!fImu.eof())
{
string s;
getline(fImu,s);
if (s[0] == '#')
continue;
if(!s.empty())
{
string item;
size_t pos = 0;
double data[7];
int count = 0;
while ((pos = s.find(',')) != string::npos) {
item = s.substr(0, pos);
data[count++] = stod(item);
s.erase(0, pos + 1);
}
item = s.substr(0, pos);
data[6] = stod(item);
vTimeStamps.push_back(data[0]/1e9);
vAcc.push_back(cv::Point3f(data[4],data[5],data[6]));
vGyro.push_back(cv::Point3f(data[1],data[2],data[3]));
}
}
}main function · cpp · L32-L204 (173 LOC)Examples_old/Monocular/mono_euroc.cc
int main(int argc, char **argv)
{
if(argc < 5)
{
cerr << endl << "Usage: ./mono_euroc path_to_vocabulary path_to_settings path_to_sequence_folder_1 path_to_times_file_1 (path_to_image_folder_2 path_to_times_file_2 ... path_to_image_folder_N path_to_times_file_N) (trajectory_file_name)" << endl;
return 1;
}
const int num_seq = (argc-3)/2;
cout << "num_seq = " << num_seq << endl;
bool bFileName= (((argc-3) % 2) == 1);
string file_name;
if (bFileName)
{
file_name = string(argv[argc-1]);
cout << "file name: " << file_name << endl;
}
// Load all sequences:
int seq;
vector< vector<string> > vstrImageFilenames;
vector< vector<double> > vTimestampsCam;
vector<int> nImages;
vstrImageFilenames.resize(num_seq);
vTimestampsCam.resize(num_seq);
nImages.resize(num_seq);
int tot_images = 0;
for (seq = 0; seq<num_seq; seq++)
{
cout << "Loading images for sequence " << seq LoadImages function · cpp · L205-L228 (24 LOC)Examples_old/Monocular/mono_euroc.cc
void LoadImages(const string &strImagePath, const string &strPathTimes,
vector<string> &vstrImages, vector<double> &vTimeStamps)
{
ifstream fTimes;
fTimes.open(strPathTimes.c_str());
vTimeStamps.reserve(5000);
vstrImages.reserve(5000);
while(!fTimes.eof())
{
string s;
getline(fTimes,s);
if(!s.empty())
{
stringstream ss;
ss << s;
vstrImages.push_back(strImagePath + "/" + ss.str() + ".png");
double t;
ss >> t;
vTimeStamps.push_back(t*1e-9);
}
}
}main function · cpp · L33-L154 (122 LOC)Examples_old/Monocular/mono_kitti.cc
int main(int argc, char **argv)
{
if(argc != 4)
{
cerr << endl << "Usage: ./mono_kitti path_to_vocabulary path_to_settings path_to_sequence" << endl;
return 1;
}
// Retrieve paths to images
vector<string> vstrImageFilenames;
vector<double> vTimestamps;
LoadImages(string(argv[3]), vstrImageFilenames, vTimestamps);
int nImages = vstrImageFilenames.size();
// Create SLAM system. It initializes all system threads and gets ready to process frames.
ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::MONOCULAR,true);
float imageScale = SLAM.GetImageScale();
// Vector for tracking time statistics
vector<float> vTimesTrack;
vTimesTrack.resize(nImages);
cout << endl << "-------" << endl;
cout << "Start processing sequence ..." << endl;
cout << "Images in the sequence: " << nImages << endl << endl;
// Main loop
double t_resize = 0.f;
double t_track = 0.f;
cv::Mat im;
for(int ni=0;Want this analysis on your repo? https://repobility.com/scan/
LoadImages function · cpp · L155-L186 (32 LOC)Examples_old/Monocular/mono_kitti.cc
void LoadImages(const string &strPathToSequence, vector<string> &vstrImageFilenames, vector<double> &vTimestamps)
{
ifstream fTimes;
string strPathTimeFile = strPathToSequence + "/times.txt";
fTimes.open(strPathTimeFile.c_str());
while(!fTimes.eof())
{
string s;
getline(fTimes,s);
if(!s.empty())
{
stringstream ss;
ss << s;
double t;
ss >> t;
vTimestamps.push_back(t);
}
}
string strPrefixLeft = strPathToSequence + "/image_0/";
const int nTimes = vTimestamps.size();
vstrImageFilenames.resize(nTimes);
for(int i=0; i<nTimes; i++)
{
stringstream ss;
ss << setfill('0') << setw(6) << i;
vstrImageFilenames[i] = strPrefixLeft + ss.str() + ".png";
}
}exit_loop_handler function · cpp · L40-L45 (6 LOC)Examples_old/Monocular/mono_realsense_D435i.cc
void exit_loop_handler(int s){
cout << "Finishing session" << endl;
b_continue_session = false;
}get_sensor_option function · cpp · L50-L91 (42 LOC)Examples_old/Monocular/mono_realsense_D435i.cc
static rs2_option get_sensor_option(const rs2::sensor& sensor)
{
// Sensors usually have several options to control their properties
// such as Exposure, Brightness etc.
std::cout << "Sensor supports the following options:\n" << std::endl;
// The following loop shows how to iterate over all available options
// Starting from 0 until RS2_OPTION_COUNT (exclusive)
for (int i = 0; i < static_cast<int>(RS2_OPTION_COUNT); i++)
{
rs2_option option_type = static_cast<rs2_option>(i);
//SDK enum types can be streamed to get a string that represents them
std::cout << " " << i << ": " << option_type;
// To control an option, use the following api:
// First, verify that the sensor actually supports this option
if (sensor.supports(option_type))
{
std::cout << std::endl;
// Get a human readable description of the option
const char* description = sensor.get_option_descriptionmain function · cpp · L92-L291 (200 LOC)Examples_old/Monocular/mono_realsense_D435i.cc
int main(int argc, char **argv) {
if (argc < 3 || argc > 4) {
cerr << endl
<< "Usage: ./mono_realsense_D435i path_to_vocabulary path_to_settings (trajectory_file_name)"
<< endl;
return 1;
}
string file_name;
if (argc == 4) {
file_name = string(argv[argc - 1]);
}
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = exit_loop_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
b_continue_session = true;
double offset = 0; // ms
rs2::context ctx;
rs2::device_list devices = ctx.query_devices();
rs2::device selected_device;
if (devices.size() == 0)
{
std::cerr << "No device connected, please connect a RealSense device" << std::endl;
return 0;
}
else
selected_device = devices[0];
std::vector<rs2::sensor> sensors = selected_device.query_sensors();
int index = exit_loop_handler function · cpp · L37-L42 (6 LOC)Examples_old/Monocular/mono_realsense_t265.cc
void exit_loop_handler(int s){
cout << "Finishing session" << endl;
b_continue_session = false;
}main function · cpp · L43-L173 (131 LOC)Examples_old/Monocular/mono_realsense_t265.cc
int main(int argc, char **argv)
{
if(argc < 3 || argc > 4)
{
cerr << endl << "Usage: ./mono_realsense_t265 path_to_vocabulary path_to_settings (trajectory_file_name)" << endl;
return 1;
}
string file_name;
bool bFileName = false;
if (argc == 4)
{
file_name = string(argv[argc-1]);
bFileName = true;
}
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = exit_loop_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
b_continue_session = true;
// Declare RealSense pipeline, encapsulating the actual device and sensors
rs2::pipeline pipe;
// Create a configuration for configuring the pipeline with a non default profile
rs2::config cfg;
// Enable the left camera
cfg.enable_stream(RS2_STREAM_FISHEYE, 1, RS2_FORMAT_Y8);
cfg.enable_stream(RS2_STREAM_FISHEYE, 2, RS2_FORMAT_Y8);
rs2::pipeline_profile pmain function · cpp · L32-L155 (124 LOC)Examples_old/Monocular/mono_tum.cc
int main(int argc, char **argv)
{
if(argc != 4)
{
cerr << endl << "Usage: ./mono_tum path_to_vocabulary path_to_settings path_to_sequence" << endl;
return 1;
}
// Retrieve paths to images
vector<string> vstrImageFilenames;
vector<double> vTimestamps;
string strFile = string(argv[3])+"/rgb.txt";
LoadImages(strFile, vstrImageFilenames, vTimestamps);
int nImages = vstrImageFilenames.size();
// Create SLAM system. It initializes all system threads and gets ready to process frames.
ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::MONOCULAR,true);
float imageScale = SLAM.GetImageScale();
// Vector for tracking time statistics
vector<float> vTimesTrack;
vTimesTrack.resize(nImages);
cout << endl << "-------" << endl;
cout << "Start processing sequence ..." << endl;
cout << "Images in the sequence: " << nImages << endl << endl;
double t_resize = 0.f;
double t_track = 0.f;
// MainLoadImages function · cpp · L156-L184 (29 LOC)Examples_old/Monocular/mono_tum.cc
void LoadImages(const string &strFile, vector<string> &vstrImageFilenames, vector<double> &vTimestamps)
{
ifstream f;
f.open(strFile.c_str());
// skip first three lines
string s0;
getline(f,s0);
getline(f,s0);
getline(f,s0);
while(!f.eof())
{
string s;
getline(f,s);
if(!s.empty())
{
stringstream ss;
ss << s;
double t;
string sRGB;
ss >> t;
vTimestamps.push_back(t);
ss >> sRGB;
vstrImageFilenames.push_back(sRGB);
}
}
}Provenance: Repobility (https://repobility.com) — every score reproducible from /scan/
main function · cpp · L37-L227 (191 LOC)Examples_old/Monocular/mono_tum_vi.cc
int main(int argc, char **argv)
{
const int num_seq = (argc-3)/2;
cout << "num_seq = " << num_seq << endl;
bool bFileName= (((argc-3) % 2) == 1);
string file_name;
if (bFileName)
{
file_name = string(argv[argc-1]);
cout << "file name: " << file_name << endl;
}
if(argc < 4)
{
cerr << endl << "Usage: ./mono_tum_vi path_to_vocabulary path_to_settings path_to_image_folder_1 path_to_times_file_1 (path_to_image_folder_2 path_to_times_file_2 ... path_to_image_folder_N path_to_times_file_N) (trajectory_file_name)" << endl;
return 1;
}
// Load all sequences:
int seq;
vector< vector<string> > vstrImageFilenames;
vector< vector<double> > vTimestampsCam;
vector<int> nImages;
vstrImageFilenames.resize(num_seq);
vTimestampsCam.resize(num_seq);
nImages.resize(num_seq);
int tot_images = 0;
for (seq = 0; seq<num_seq; seq++)
{
cout << "Loading images for sequence " << seq << LoadImages function · cpp · L228-L255 (28 LOC)Examples_old/Monocular/mono_tum_vi.cc
void LoadImages(const string &strImagePath, const string &strPathTimes,
vector<string> &vstrImages, vector<double> &vTimeStamps)
{
ifstream fTimes;
fTimes.open(strPathTimes.c_str());
vTimeStamps.reserve(5000);
vstrImages.reserve(5000);
while(!fTimes.eof())
{
string s;
getline(fTimes,s);
if(!s.empty())
{
if (s[0] == '#')
continue;
int pos = s.find(' ');
string item = s.substr(0, pos);
vstrImages.push_back(strImagePath + "/" + item + ".png");
double t = stod(item);
vTimeStamps.push_back(t/1e9);
}
}
}exit_loop_handler function · cpp · L41-L46 (6 LOC)Examples_old/RGB-D-Inertial/rgbd_inertial_realsense_D435i.cc
void exit_loop_handler(int s){
cout << "Finishing session" << endl;
b_continue_session = false;
}get_sensor_option function · cpp · L58-L99 (42 LOC)Examples_old/RGB-D-Inertial/rgbd_inertial_realsense_D435i.cc
static rs2_option get_sensor_option(const rs2::sensor& sensor)
{
// Sensors usually have several options to control their properties
// such as Exposure, Brightness etc.
std::cout << "Sensor supports the following options:\n" << std::endl;
// The following loop shows how to iterate over all available options
// Starting from 0 until RS2_OPTION_COUNT (exclusive)
for (int i = 0; i < static_cast<int>(RS2_OPTION_COUNT); i++)
{
rs2_option option_type = static_cast<rs2_option>(i);
//SDK enum types can be streamed to get a string that represents them
std::cout << " " << i << ": " << option_type;
// To control an option, use the following api:
// First, verify that the sensor actually supports this option
if (sensor.supports(option_type))
{
std::cout << std::endl;
// Get a human readable description of the option
const char* description = sensor.get_option_descriptionmain function · cpp · L100-L461 (362 LOC)Examples_old/RGB-D-Inertial/rgbd_inertial_realsense_D435i.cc
int main(int argc, char **argv) {
if (argc < 3 || argc > 4) {
cerr << endl
<< "Usage: ./mono_inertial_realsense_D435i path_to_vocabulary path_to_settings (trajectory_file_name)"
<< endl;
return 1;
}
string file_name;
if (argc == 4) {
file_name = string(argv[argc - 1]);
}
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = exit_loop_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
b_continue_session = true;
double offset = 0; // ms
rs2::context ctx;
rs2::device_list devices = ctx.query_devices();
rs2::device selected_device;
if (devices.size() == 0)
{
std::cerr << "No device connected, please connect a RealSense device" << std::endl;
return 0;
}
else
selected_device = devices[0];
std::vector<rs2::sensor> sensors = selected_device.query_sensors();
intfind_stream_to_align function · cpp · L462-L497 (36 LOC)Examples_old/RGB-D-Inertial/rgbd_inertial_realsense_D435i.cc
rs2_stream find_stream_to_align(const std::vector<rs2::stream_profile>& streams)
{
//Given a vector of streams, we try to find a depth stream and another stream to align depth with.
//We prioritize color streams to make the view look better.
//If color is not available, we take another stream that (other than depth)
rs2_stream align_to = RS2_STREAM_ANY;
bool depth_stream_found = false;
bool color_stream_found = false;
for (rs2::stream_profile sp : streams)
{
rs2_stream profile_stream = sp.stream_type();
if (profile_stream != RS2_STREAM_DEPTH)
{
if (!color_stream_found) //Prefer color
align_to = profile_stream;
if (profile_stream == RS2_STREAM_COLOR)
{
color_stream_found = true;
}
}
else
{
depth_stream_found = true;
}
}
if(!depth_stream_found)
throw std::runtime_error("No Depth streaprofile_changed function · cpp · L498-L512 (15 LOC)Examples_old/RGB-D-Inertial/rgbd_inertial_realsense_D435i.cc
bool profile_changed(const std::vector<rs2::stream_profile>& current, const std::vector<rs2::stream_profile>& prev)
{
for (auto&& sp : prev)
{
//If previous profile is in current (maybe just added another)
auto itr = std::find_if(std::begin(current), std::end(current), [&sp](const rs2::stream_profile& current_sp) { return sp.unique_id() == current_sp.unique_id(); });
if (itr == std::end(current)) //If it previous stream wasn't found in current
{
return true;
}
}
return false;
}interpolateMeasure function · cpp · L513-L551 (39 LOC)Examples_old/RGB-D-Inertial/rgbd_inertial_realsense_D435i.cc
rs2_vector interpolateMeasure(const double target_time,
const rs2_vector current_data, const double current_time,
const rs2_vector prev_data, const double prev_time)
{
// If there are not previous information, the current data is propagated
if(prev_time == 0)
{
return current_data;
}
rs2_vector increment;
rs2_vector value_interp;
if(target_time > current_time) {
value_interp = current_data;
}
else if(target_time > prev_time)
{
increment.x = current_data.x - prev_data.x;
increment.y = current_data.y - prev_data.y;
increment.z = current_data.z - prev_data.z;
double factor = (target_time - prev_time) / (current_time - prev_time);
value_interp.x = prev_data.x + increment.x * factor;
value_interp.y = prev_data.y + increment.y * factor;
value_interp.z = prev_data.z + increment.z * factor;
// zero interpolatiAbout: code-quality intelligence by Repobility · https://repobility.com
exit_loop_handler function · cpp · L41-L46 (6 LOC)Examples_old/RGB-D/rgbd_realsense_D435i.cc
void exit_loop_handler(int s){
cout << "Finishing session" << endl;
b_continue_session = false;
}get_sensor_option function · cpp · L58-L99 (42 LOC)Examples_old/RGB-D/rgbd_realsense_D435i.cc
static rs2_option get_sensor_option(const rs2::sensor& sensor)
{
// Sensors usually have several options to control their properties
// such as Exposure, Brightness etc.
std::cout << "Sensor supports the following options:\n" << std::endl;
// The following loop shows how to iterate over all available options
// Starting from 0 until RS2_OPTION_COUNT (exclusive)
for (int i = 0; i < static_cast<int>(RS2_OPTION_COUNT); i++)
{
rs2_option option_type = static_cast<rs2_option>(i);
//SDK enum types can be streamed to get a string that represents them
std::cout << " " << i << ": " << option_type;
// To control an option, use the following api:
// First, verify that the sensor actually supports this option
if (sensor.supports(option_type))
{
std::cout << std::endl;
// Get a human readable description of the option
const char* description = sensor.get_option_descriptionmain function · cpp · L100-L405 (306 LOC)Examples_old/RGB-D/rgbd_realsense_D435i.cc
int main(int argc, char **argv) {
if (argc < 3 || argc > 4) {
cerr << endl
<< "Usage: ./mono_inertial_realsense_D435i path_to_vocabulary path_to_settings (trajectory_file_name)"
<< endl;
return 1;
}
string file_name;
bool bFileName = false;
if (argc == 4) {
file_name = string(argv[argc - 1]);
bFileName = true;
}
struct sigaction sigIntHandler;
sigIntHandler.sa_handler = exit_loop_handler;
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGINT, &sigIntHandler, NULL);
b_continue_session = true;
double offset = 0; // ms
rs2::context ctx;
rs2::device_list devices = ctx.query_devices();
rs2::device selected_device;
if (devices.size() == 0)
{
std::cerr << "No device connected, please connect a RealSense device" << std::endl;
return 0;
}
else
selected_device = devices[0];
std::vector<rs2::sensfind_stream_to_align function · cpp · L406-L441 (36 LOC)Examples_old/RGB-D/rgbd_realsense_D435i.cc
rs2_stream find_stream_to_align(const std::vector<rs2::stream_profile>& streams)
{
//Given a vector of streams, we try to find a depth stream and another stream to align depth with.
//We prioritize color streams to make the view look better.
//If color is not available, we take another stream that (other than depth)
rs2_stream align_to = RS2_STREAM_ANY;
bool depth_stream_found = false;
bool color_stream_found = false;
for (rs2::stream_profile sp : streams)
{
rs2_stream profile_stream = sp.stream_type();
if (profile_stream != RS2_STREAM_DEPTH)
{
if (!color_stream_found) //Prefer color
align_to = profile_stream;
if (profile_stream == RS2_STREAM_COLOR)
{
color_stream_found = true;
}
}
else
{
depth_stream_found = true;
}
}
if(!depth_stream_found)
throw std::runtime_error("No Depth streaprofile_changed function · cpp · L442-L456 (15 LOC)Examples_old/RGB-D/rgbd_realsense_D435i.cc
bool profile_changed(const std::vector<rs2::stream_profile>& current, const std::vector<rs2::stream_profile>& prev)
{
for (auto&& sp : prev)
{
//If previous profile is in current (maybe just added another)
auto itr = std::find_if(std::begin(current), std::end(current), [&sp](const rs2::stream_profile& current_sp) { return sp.unique_id() == current_sp.unique_id(); });
if (itr == std::end(current)) //If it previous stream wasn't found in current
{
return true;
}
}
return false;
}main function · cpp · L32-L146 (115 LOC)Examples_old/RGB-D/rgbd_tum.cc
int main(int argc, char **argv)
{
if(argc != 5)
{
cerr << endl << "Usage: ./rgbd_tum path_to_vocabulary path_to_settings path_to_sequence path_to_association" << endl;
return 1;
}
// Retrieve paths to images
vector<string> vstrImageFilenamesRGB;
vector<string> vstrImageFilenamesD;
vector<double> vTimestamps;
string strAssociationFilename = string(argv[4]);
LoadImages(strAssociationFilename, vstrImageFilenamesRGB, vstrImageFilenamesD, vTimestamps);
// Check consistency in the number of images and depthmaps
int nImages = vstrImageFilenamesRGB.size();
if(vstrImageFilenamesRGB.empty())
{
cerr << endl << "No images found in provided path." << endl;
return 1;
}
else if(vstrImageFilenamesD.size()!=vstrImageFilenamesRGB.size())
{
cerr << endl << "Different number of images for rgb and depth." << endl;
return 1;
}
// Create SLAM system. It initializes all system threads anLoadImages function · cpp · L147-L173 (27 LOC)Examples_old/RGB-D/rgbd_tum.cc
void LoadImages(const string &strAssociationFilename, vector<string> &vstrImageFilenamesRGB,
vector<string> &vstrImageFilenamesD, vector<double> &vTimestamps)
{
ifstream fAssociation;
fAssociation.open(strAssociationFilename.c_str());
while(!fAssociation.eof())
{
string s;
getline(fAssociation,s);
if(!s.empty())
{
stringstream ss;
ss << s;
double t;
string sRGB, sD;
ss >> t;
vTimestamps.push_back(t);
ss >> sRGB;
vstrImageFilenamesRGB.push_back(sRGB);
ss >> t;
ss >> sD;
vstrImageFilenamesD.push_back(sD);
}
}
}ImageGrabber class · cpp · L43-L53 (11 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc
class ImageGrabber
{
public:
ImageGrabber(ORB_SLAM3::System* pSLAM):mpSLAM(pSLAM){}
void GrabImage(const sensor_msgs::ImageConstPtr& msg);
ORB_SLAM3::System* mpSLAM;
};Want fix-PRs on findings? Install Repobility's GitHub App · github.com/apps/repobility-bot
main function · cpp · L54-L134 (81 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc
int main(int argc, char **argv)
{
ros::init(argc, argv, "Mono");
ros::start();
if(argc != 3)
{
cerr << endl << "Usage: rosrun ORB_SLAM3 Mono path_to_vocabulary path_to_settings" << endl;
ros::shutdown();
return 1;
}
// Create SLAM system. It initializes all system threads and gets ready to process frames.
ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::MONOCULAR,false);
cout << endl << endl;
cout << "-----------------------" << endl;
cout << "Augmented Reality Demo" << endl;
cout << "1) Translate the camera to initialize SLAM." << endl;
cout << "2) Look at a planar region and translate the camera." << endl;
cout << "3) Press Insert Cube to place a virtual cube in the plane. " << endl;
cout << endl;
cout << "You can place several cubes in different planes." << endl;
cout << "-----------------------" << endl;
cout << endl;
viewerAR.SetSLAM(&SLAM);
ImageGrabber igbGrabImage method · cpp · L135-L165 (31 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc
void ImageGrabber::GrabImage(const sensor_msgs::ImageConstPtr& msg)
{
// Copy the ros image message to cv::Mat.
cv_bridge::CvImageConstPtr cv_ptr;
try
{
cv_ptr = cv_bridge::toCvShare(msg);
}
catch (cv_bridge::Exception& e)
{
ROS_ERROR("cv_bridge exception: %s", e.what());
return;
}
cv::Mat im = cv_ptr->image.clone();
cv::Mat imu;
cv::Mat Tcw = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
int state = mpSLAM->GetTrackingState();
vector<ORB_SLAM3::MapPoint*> vMPs = mpSLAM->GetTrackedMapPoints();
vector<cv::KeyPoint> vKeys = mpSLAM->GetTrackedKeyPointsUn();
cv::undistort(im,imu,K,DistCoef);
if(bRGB)
viewerAR.SetImagePose(imu,Tcw,state,vKeys,vMPs);
else
{
cv::cvtColor(imu,imu,CV_RGB2BGR);
viewerAR.SetImagePose(imu,Tcw,state,vKeys,vMPs);
}
}ExpSO3 function · cpp · L33-L46 (14 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
cv::Mat ExpSO3(const float &x, const float &y, const float &z)
{
cv::Mat I = cv::Mat::eye(3,3,CV_32F);
const float d2 = x*x+y*y+z*z;
const float d = sqrt(d2);
cv::Mat W = (cv::Mat_<float>(3,3) << 0, -z, y,
z, 0, -x,
-y, x, 0);
if(d<eps)
return (I + W + 0.5f*W*W);
else
return (I + W*sin(d)/d + W*W*(1.0f-cos(d))/d2);
}ExpSO3 function · cpp · L47-L51 (5 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
cv::Mat ExpSO3(const cv::Mat &v)
{
return ExpSO3(v.at<float>(0),v.at<float>(1),v.at<float>(2));
}Run method · cpp · L54-L234 (181 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
void ViewerAR::Run()
{
int w,h,wui;
cv::Mat im, Tcw;
int status;
vector<cv::KeyPoint> vKeys;
vector<MapPoint*> vMPs;
while(1)
{
GetImagePose(im,Tcw,status,vKeys,vMPs);
if(im.empty())
cv::waitKey(mT);
else
{
w = im.cols;
h = im.rows;
break;
}
}
wui=200;
pangolin::CreateWindowAndBind("Viewer",w+wui,h);
glEnable(GL_DEPTH_TEST);
glEnable (GL_BLEND);
pangolin::CreatePanel("menu").SetBounds(0.0,1.0,0.0,pangolin::Attach::Pix(wui));
pangolin::Var<bool> menu_detectplane("menu.Insert Cube",false,false);
pangolin::Var<bool> menu_clear("menu.Clear All",false,false);
pangolin::Var<bool> menu_drawim("menu.Draw Image",true,true);
pangolin::Var<bool> menu_drawcube("menu.Draw Cube",true,true);
pangolin::Var<float> menu_cubesize("menu. Cube Size",0.05,0.01,0.3);
pangolin::Var<bool> menu_drawgrid("menu.Draw Grid",true,true);
pangoliSetImagePose method · cpp · L235-L244 (10 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
void ViewerAR::SetImagePose(const cv::Mat &im, const cv::Mat &Tcw, const int &status, const vector<cv::KeyPoint> &vKeys, const vector<ORB_SLAM3::MapPoint*> &vMPs)
{
unique_lock<mutex> lock(mMutexPoseImage);
mImage = im.clone();
mTcw = Tcw.clone();
mStatus = status;
mvKeys = vKeys;
mvMPs = vMPs;
}GetImagePose method · cpp · L245-L254 (10 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
void ViewerAR::GetImagePose(cv::Mat &im, cv::Mat &Tcw, int &status, std::vector<cv::KeyPoint> &vKeys, std::vector<MapPoint*> &vMPs)
{
unique_lock<mutex> lock(mMutexPoseImage);
im = mImage.clone();
Tcw = mTcw.clone();
status = mStatus;
vKeys = mvKeys;
vMPs = mvMPs;
}LoadCameraPose method · cpp · L255-L284 (30 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
void ViewerAR::LoadCameraPose(const cv::Mat &Tcw)
{
if(!Tcw.empty())
{
pangolin::OpenGlMatrix M;
M.m[0] = Tcw.at<float>(0,0);
M.m[1] = Tcw.at<float>(1,0);
M.m[2] = Tcw.at<float>(2,0);
M.m[3] = 0.0;
M.m[4] = Tcw.at<float>(0,1);
M.m[5] = Tcw.at<float>(1,1);
M.m[6] = Tcw.at<float>(2,1);
M.m[7] = 0.0;
M.m[8] = Tcw.at<float>(0,2);
M.m[9] = Tcw.at<float>(1,2);
M.m[10] = Tcw.at<float>(2,2);
M.m[11] = 0.0;
M.m[12] = Tcw.at<float>(0,3);
M.m[13] = Tcw.at<float>(1,3);
M.m[14] = Tcw.at<float>(2,3);
M.m[15] = 1.0;
M.Load();
}
}Want this analysis on your repo? https://repobility.com/scan/
PrintStatus method · cpp · L285-L306 (22 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
void ViewerAR::PrintStatus(const int &status, const bool &bLocMode, cv::Mat &im)
{
if(!bLocMode)
{
switch(status)
{
case 1: {AddTextToImage("SLAM NOT INITIALIZED",im,255,0,0); break;}
case 2: {AddTextToImage("SLAM ON",im,0,255,0); break;}
case 3: {AddTextToImage("SLAM LOST",im,255,0,0); break;}
}
}
else
{
switch(status)
{
case 1: {AddTextToImage("SLAM NOT INITIALIZED",im,255,0,0); break;}
case 2: {AddTextToImage("LOCALIZATION ON",im,0,255,0); break;}
case 3: {AddTextToImage("LOCALIZATION LOST",im,255,0,0); break;}
}
}
}AddTextToImage method · cpp · L307-L323 (17 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
void ViewerAR::AddTextToImage(const string &s, cv::Mat &im, const int r, const int g, const int b)
{
int l = 10;
//imText.rowRange(im.rows-imText.rows,imText.rows) = cv::Mat::zeros(textSize.height+10,im.cols,im.type());
cv::putText(im,s,cv::Point(l,im.rows-l),cv::FONT_HERSHEY_PLAIN,1.5,cv::Scalar(255,255,255),2,8);
cv::putText(im,s,cv::Point(l-1,im.rows-l),cv::FONT_HERSHEY_PLAIN,1.5,cv::Scalar(255,255,255),2,8);
cv::putText(im,s,cv::Point(l+1,im.rows-l),cv::FONT_HERSHEY_PLAIN,1.5,cv::Scalar(255,255,255),2,8);
cv::putText(im,s,cv::Point(l-1,im.rows-(l-1)),cv::FONT_HERSHEY_PLAIN,1.5,cv::Scalar(255,255,255),2,8);
cv::putText(im,s,cv::Point(l,im.rows-(l-1)),cv::FONT_HERSHEY_PLAIN,1.5,cv::Scalar(255,255,255),2,8);
cv::putText(im,s,cv::Point(l+1,im.rows-(l-1)),cv::FONT_HERSHEY_PLAIN,1.5,cv::Scalar(255,255,255),2,8);
cv::putText(im,s,cv::Point(l-1,im.rows-(l+1)),cv::FONT_HERSHEY_PLAIN,1.5,cv::Scalar(255,255,255),2,8);
cv::putText(im,s,cv::Point(l,im.roDrawImageTexture method · cpp · L324-L332 (9 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
void ViewerAR::DrawImageTexture(pangolin::GlTexture &imageTexture, cv::Mat &im)
{
if(!im.empty())
{
imageTexture.Upload(im.data,GL_RGB,GL_UNSIGNED_BYTE);
imageTexture.RenderToViewportFlipY();
}
}DrawCube method · cpp · L333-L341 (9 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
void ViewerAR::DrawCube(const float &size,const float x, const float y, const float z)
{
pangolin::OpenGlMatrix M = pangolin::OpenGlMatrix::Translate(-x,-size-y,-z);
glPushMatrix();
M.Multiply();
pangolin::glDrawColouredCube(-size,size);
glPopMatrix();
}DrawPlane method · cpp · L342-L349 (8 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
void ViewerAR::DrawPlane(Plane *pPlane, int ndivs, float ndivsize)
{
glPushMatrix();
pPlane->glTpw.Multiply();
DrawPlane(ndivs,ndivsize);
glPopMatrix();
}DrawPlane method · cpp · L350-L374 (25 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
void ViewerAR::DrawPlane(int ndivs, float ndivsize)
{
// Plane parallel to x-z at origin with normal -y
const float minx = -ndivs*ndivsize;
const float minz = -ndivs*ndivsize;
const float maxx = ndivs*ndivsize;
const float maxz = ndivs*ndivsize;
glLineWidth(2);
glColor3f(0.7f,0.7f,1.0f);
glBegin(GL_LINES);
for(int n = 0; n<=2*ndivs; n++)
{
glVertex3f(minx+ndivsize*n,0,minz);
glVertex3f(minx+ndivsize*n,0,maxz);
glVertex3f(minx,0,minz+ndivsize*n);
glVertex3f(maxx,0,minz+ndivsize*n);
}
glEnd();
}DrawTrackedPoints method · cpp · L375-L388 (14 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
void ViewerAR::DrawTrackedPoints(const std::vector<cv::KeyPoint> &vKeys, const std::vector<MapPoint *> &vMPs, cv::Mat &im)
{
const int N = vKeys.size();
for(int i=0; i<N; i++)
{
if(vMPs[i])
{
cv::circle(im,vKeys[i].pt,1,cv::Scalar(0,255,0),-1);
}
}
}DetectPlane method · cpp · L389-L506 (118 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
Plane* ViewerAR::DetectPlane(const cv::Mat Tcw, const std::vector<MapPoint*> &vMPs, const int iterations)
{
// Retrieve 3D points
vector<cv::Mat> vPoints;
vPoints.reserve(vMPs.size());
vector<MapPoint*> vPointMP;
vPointMP.reserve(vMPs.size());
for(size_t i=0; i<vMPs.size(); i++)
{
MapPoint* pMP=vMPs[i];
if(pMP)
{
if(pMP->Observations()>5)
{
vPoints.push_back(pMP->GetWorldPos());
vPointMP.push_back(pMP);
}
}
}
const int N = vPoints.size();
if(N<50)
return NULL;
// Indices for minimum set selection
vector<size_t> vAllIndices;
vAllIndices.reserve(N);
vector<size_t> vAvailableIndices;
for(int i=0; i<N; i++)
{
vAllIndices.push_back(i);
}
float bestDist = 1e10;
vector<float> bestvDist;
//RANSAC
for(int n=0; n<iterations; n++)
{
vAvailableIndices = vAllIndices;
cv::MProvenance: Repobility (https://repobility.com) — every score reproducible from /scan/
Recompute method · cpp · L513-L600 (88 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc
void Plane::Recompute()
{
const int N = mvMPs.size();
// Recompute plane with all points
cv::Mat A = cv::Mat(N,4,CV_32F);
A.col(3) = cv::Mat::ones(N,1,CV_32F);
o = cv::Mat::zeros(3,1,CV_32F);
int nPoints = 0;
for(int i=0; i<N; i++)
{
MapPoint* pMP = mvMPs[i];
if(!pMP->isBad())
{
cv::Mat Xw = pMP->GetWorldPos();
o+=Xw;
A.row(nPoints).colRange(0,3) = Xw.t();
nPoints++;
}
}
A.resize(nPoints);
cv::Mat u,w,vt;
cv::SVDecomp(A,w,u,vt,cv::SVD::MODIFY_A | cv::SVD::FULL_UV);
float a = vt.at<float>(3,0);
float b = vt.at<float>(3,1);
float c = vt.at<float>(3,2);
o = o*(1.0f/nPoints);
const float f = 1.0f/sqrt(a*a+b*b+c*c);
// Compute XC just the first time
if(XC.empty())
{
cv::Mat Oc = -mTcw.colRange(0,3).rowRange(0,3).t()*mTcw.rowRange(0,3).col(3);
XC = Oc-o;
}
if((XC.at<float>(0)*a+XC.at<float>(1)*b+XC.at<Plane class · c · L31-L53 (23 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.h
class Plane
{
public:
Plane(const std::vector<MapPoint*> &vMPs, const cv::Mat &Tcw);
Plane(const float &nx, const float &ny, const float &nz, const float &ox, const float &oy, const float &oz);
void Recompute();
//normal
cv::Mat n;
//origin
cv::Mat o;
//arbitrary orientation along normal
float rang;
//transformation from world to the plane
cv::Mat Tpw;
pangolin::OpenGlMatrix glTpw;
//MapPoints that define the plane
std::vector<MapPoint*> mvMPs;
//camera pose when the plane was first observed (to compute normal direction)
cv::Mat mTcw, XC;
};ViewerAR class · c · L54-L110 (57 LOC)Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.h
class ViewerAR
{
public:
ViewerAR();
void SetFPS(const float fps){
mFPS = fps;
mT=1e3/fps;
}
void SetSLAM(ORB_SLAM3::System* pSystem){
mpSystem = pSystem;
}
// Main thread function.
void Run();
void SetCameraCalibration(const float &fx_, const float &fy_, const float &cx_, const float &cy_){
fx = fx_; fy = fy_; cx = cx_; cy = cy_;
}
void SetImagePose(const cv::Mat &im, const cv::Mat &Tcw, const int &status,
const std::vector<cv::KeyPoint> &vKeys, const std::vector<MapPoint*> &vMPs);
void GetImagePose(cv::Mat &im, cv::Mat &Tcw, int &status,
std::vector<cv::KeyPoint> &vKeys, std::vector<MapPoint*> &vMPs);
private:
//SLAM
ORB_SLAM3::System* mpSystem;
void PrintStatus(const int &status, const bool &bLocMode, cv::Mat &im);
void AddTextToImage(const std::string &s, cv::Mat &im, const int r=0, const int g=0, const int b=0);
void LoadCameraPose