Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/.gitignore b/.gitignore
- index 7290fd5..9f7d59e 100644
- --- a/.gitignore
- +++ b/.gitignore
- @@ -1,287 +1,287 @@
- -## Ignore Visual Studio temporary files, build results, and
- -## files generated by popular Visual Studio add-ons.
- -##
- -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
- -
- -# User-specific files
- -*.suo
- -*.user
- -*.userosscache
- -*.sln.docstates
- -
- -# User-specific files (MonoDevelop/Xamarin Studio)
- -*.userprefs
- -
- -# Build results
- -[Dd]ebug/
- -[Dd]ebugPublic/
- -[Rr]elease/
- -[Rr]eleases/
- -x64/
- -x86/
- -bld/
- -[Bb]in/
- -[Oo]bj/
- -[Ll]og/
- -
- -# Visual Studio 2015 cache/options directory
- -.vs/
- -# Uncomment if you have tasks that create the project's static files in wwwroot
- -#wwwroot/
- -
- -# MSTest test Results
- -[Tt]est[Rr]esult*/
- -[Bb]uild[Ll]og.*
- -
- -# NUNIT
- -*.VisualState.xml
- -TestResult.xml
- -
- -# Build Results of an ATL Project
- -[Dd]ebugPS/
- -[Rr]eleasePS/
- -dlldata.c
- -
- -# .NET Core
- -project.lock.json
- -project.fragment.lock.json
- -artifacts/
- -**/Properties/launchSettings.json
- -
- -*_i.c
- -*_p.c
- -*_i.h
- -*.ilk
- -*.meta
- -*.obj
- -*.pch
- -*.pdb
- -*.pgc
- -*.pgd
- -*.rsp
- -*.sbr
- -*.tlb
- -*.tli
- -*.tlh
- -*.tmp
- -*.tmp_proj
- -*.log
- -*.vspscc
- -*.vssscc
- -.builds
- -*.pidb
- -*.svclog
- -*.scc
- -
- -# Chutzpah Test files
- -_Chutzpah*
- -
- -# Visual C++ cache files
- -ipch/
- -*.aps
- -*.ncb
- -*.opendb
- -*.opensdf
- -*.sdf
- -*.cachefile
- -*.VC.db
- -*.VC.VC.opendb
- -
- -# Visual Studio profiler
- -*.psess
- -*.vsp
- -*.vspx
- -*.sap
- -
- -# TFS 2012 Local Workspace
- -$tf/
- -
- -# Guidance Automation Toolkit
- -*.gpState
- -
- -# ReSharper is a .NET coding add-in
- -_ReSharper*/
- -*.[Rr]e[Ss]harper
- -*.DotSettings.user
- -
- -# JustCode is a .NET coding add-in
- -.JustCode
- -
- -# TeamCity is a build add-in
- -_TeamCity*
- -
- -# DotCover is a Code Coverage Tool
- -*.dotCover
- -
- -# Visual Studio code coverage results
- -*.coverage
- -*.coveragexml
- -
- -# NCrunch
- -_NCrunch_*
- -.*crunch*.local.xml
- -nCrunchTemp_*
- -
- -# MightyMoose
- -*.mm.*
- -AutoTest.Net/
- -
- -# Web workbench (sass)
- -.sass-cache/
- -
- -# Installshield output folder
- -[Ee]xpress/
- -
- -# DocProject is a documentation generator add-in
- -DocProject/buildhelp/
- -DocProject/Help/*.HxT
- -DocProject/Help/*.HxC
- -DocProject/Help/*.hhc
- -DocProject/Help/*.hhk
- -DocProject/Help/*.hhp
- -DocProject/Help/Html2
- -DocProject/Help/html
- -
- -# Click-Once directory
- -publish/
- -
- -# Publish Web Output
- -*.[Pp]ublish.xml
- -*.azurePubxml
- -# TODO: Comment the next line if you want to checkin your web deploy settings
- -# but database connection strings (with potential passwords) will be unencrypted
- -*.pubxml
- -*.publishproj
- -
- -# Microsoft Azure Web App publish settings. Comment the next line if you want to
- -# checkin your Azure Web App publish settings, but sensitive information contained
- -# in these scripts will be unencrypted
- -PublishScripts/
- -
- -# NuGet Packages
- -*.nupkg
- -# The packages folder can be ignored because of Package Restore
- -**/packages/*
- -# except build/, which is used as an MSBuild target.
- -!**/packages/build/
- -# Uncomment if necessary however generally it will be regenerated when needed
- -#!**/packages/repositories.config
- -# NuGet v3's project.json files produces more ignorable files
- -*.nuget.props
- -*.nuget.targets
- -
- -# Microsoft Azure Build Output
- -csx/
- -*.build.csdef
- -
- -# Microsoft Azure Emulator
- -ecf/
- -rcf/
- -
- -# Windows Store app package directories and files
- -AppPackages/
- -BundleArtifacts/
- -Package.StoreAssociation.xml
- -_pkginfo.txt
- -
- -# Visual Studio cache files
- -# files ending in .cache can be ignored
- -*.[Cc]ache
- -# but keep track of directories ending in .cache
- -!*.[Cc]ache/
- -
- -# Others
- -ClientBin/
- -~$*
- -*~
- -*.dbmdl
- -*.dbproj.schemaview
- -*.jfm
- -*.pfx
- -*.publishsettings
- -orleans.codegen.cs
- -
- -# Since there are multiple workflows, uncomment next line to ignore bower_components
- -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
- -#bower_components/
- -
- -# RIA/Silverlight projects
- -Generated_Code/
- -
- -# Backup & report files from converting an old project file
- -# to a newer Visual Studio version. Backup files are not needed,
- -# because we have git ;-)
- -_UpgradeReport_Files/
- -Backup*/
- -UpgradeLog*.XML
- -UpgradeLog*.htm
- -
- -# SQL Server files
- -*.mdf
- -*.ldf
- -
- -# Business Intelligence projects
- -*.rdl.data
- -*.bim.layout
- -*.bim_*.settings
- -
- -# Microsoft Fakes
- -FakesAssemblies/
- -
- -# GhostDoc plugin setting file
- -*.GhostDoc.xml
- -
- -# Node.js Tools for Visual Studio
- -.ntvs_analysis.dat
- -node_modules/
- -
- -# Typescript v1 declaration files
- -typings/
- -
- -# Visual Studio 6 build log
- -*.plg
- -
- -# Visual Studio 6 workspace options file
- -*.opt
- -
- -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
- -*.vbw
- -
- -# Visual Studio LightSwitch build output
- -**/*.HTMLClient/GeneratedArtifacts
- -**/*.DesktopClient/GeneratedArtifacts
- -**/*.DesktopClient/ModelManifest.xml
- -**/*.Server/GeneratedArtifacts
- -**/*.Server/ModelManifest.xml
- -_Pvt_Extensions
- -
- -# Paket dependency manager
- -.paket/paket.exe
- -paket-files/
- -
- -# FAKE - F# Make
- -.fake/
- -
- -# JetBrains Rider
- -.idea/
- -*.sln.iml
- -
- -# CodeRush
- -.cr/
- -
- -# Python Tools for Visual Studio (PTVS)
- -__pycache__/
- -*.pyc
- -
- -# OpenARK Third Party Resources
- -*.pap
- -*.ppp
- -*.dylib
- -opencv_*
- -pmdaccess2.dll
- -OpenNI2.dll
- -main.cpp
- -
- -# Cake - Uncomment if you are using it
- -# tools/**
- -# !tools/packages.config
- +## Ignore Visual Studio temporary files, build results, and
- +## files generated by popular Visual Studio add-ons.
- +##
- +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
- +
- +# User-specific files
- +*.suo
- +*.user
- +*.userosscache
- +*.sln.docstates
- +
- +# User-specific files (MonoDevelop/Xamarin Studio)
- +*.userprefs
- +
- +# Build results
- +[Dd]ebug/
- +[Dd]ebugPublic/
- +[Rr]elease/
- +[Rr]eleases/
- +x64/
- +x86/
- +bld/
- +[Bb]in/
- +[Oo]bj/
- +[Ll]og/
- +
- +# Visual Studio 2015 cache/options directory
- +.vs/
- +# Uncomment if you have tasks that create the project's static files in wwwroot
- +#wwwroot/
- +
- +# MSTest test Results
- +[Tt]est[Rr]esult*/
- +[Bb]uild[Ll]og.*
- +
- +# NUNIT
- +*.VisualState.xml
- +TestResult.xml
- +
- +# Build Results of an ATL Project
- +[Dd]ebugPS/
- +[Rr]eleasePS/
- +dlldata.c
- +
- +# .NET Core
- +project.lock.json
- +project.fragment.lock.json
- +artifacts/
- +**/Properties/launchSettings.json
- +
- +*_i.c
- +*_p.c
- +*_i.h
- +*.ilk
- +*.meta
- +*.obj
- +*.pch
- +*.pdb
- +*.pgc
- +*.pgd
- +*.rsp
- +*.sbr
- +*.tlb
- +*.tli
- +*.tlh
- +*.tmp
- +*.tmp_proj
- +*.log
- +*.vspscc
- +*.vssscc
- +.builds
- +*.pidb
- +*.svclog
- +*.scc
- +
- +# Chutzpah Test files
- +_Chutzpah*
- +
- +# Visual C++ cache files
- +ipch/
- +*.aps
- +*.ncb
- +*.opendb
- +*.opensdf
- +*.sdf
- +*.cachefile
- +*.VC.db
- +*.VC.VC.opendb
- +
- +# Visual Studio profiler
- +*.psess
- +*.vsp
- +*.vspx
- +*.sap
- +
- +# TFS 2012 Local Workspace
- +$tf/
- +
- +# Guidance Automation Toolkit
- +*.gpState
- +
- +# ReSharper is a .NET coding add-in
- +_ReSharper*/
- +*.[Rr]e[Ss]harper
- +*.DotSettings.user
- +
- +# JustCode is a .NET coding add-in
- +.JustCode
- +
- +# TeamCity is a build add-in
- +_TeamCity*
- +
- +# DotCover is a Code Coverage Tool
- +*.dotCover
- +
- +# Visual Studio code coverage results
- +*.coverage
- +*.coveragexml
- +
- +# NCrunch
- +_NCrunch_*
- +.*crunch*.local.xml
- +nCrunchTemp_*
- +
- +# MightyMoose
- +*.mm.*
- +AutoTest.Net/
- +
- +# Web workbench (sass)
- +.sass-cache/
- +
- +# Installshield output folder
- +[Ee]xpress/
- +
- +# DocProject is a documentation generator add-in
- +DocProject/buildhelp/
- +DocProject/Help/*.HxT
- +DocProject/Help/*.HxC
- +DocProject/Help/*.hhc
- +DocProject/Help/*.hhk
- +DocProject/Help/*.hhp
- +DocProject/Help/Html2
- +DocProject/Help/html
- +
- +# Click-Once directory
- +publish/
- +
- +# Publish Web Output
- +*.[Pp]ublish.xml
- +*.azurePubxml
- +# TODO: Comment the next line if you want to checkin your web deploy settings
- +# but database connection strings (with potential passwords) will be unencrypted
- +*.pubxml
- +*.publishproj
- +
- +# Microsoft Azure Web App publish settings. Comment the next line if you want to
- +# checkin your Azure Web App publish settings, but sensitive information contained
- +# in these scripts will be unencrypted
- +PublishScripts/
- +
- +# NuGet Packages
- +*.nupkg
- +# The packages folder can be ignored because of Package Restore
- +**/packages/*
- +# except build/, which is used as an MSBuild target.
- +!**/packages/build/
- +# Uncomment if necessary however generally it will be regenerated when needed
- +#!**/packages/repositories.config
- +# NuGet v3's project.json files produces more ignorable files
- +*.nuget.props
- +*.nuget.targets
- +
- +# Microsoft Azure Build Output
- +csx/
- +*.build.csdef
- +
- +# Microsoft Azure Emulator
- +ecf/
- +rcf/
- +
- +# Windows Store app package directories and files
- +AppPackages/
- +BundleArtifacts/
- +Package.StoreAssociation.xml
- +_pkginfo.txt
- +
- +# Visual Studio cache files
- +# files ending in .cache can be ignored
- +*.[Cc]ache
- +# but keep track of directories ending in .cache
- +!*.[Cc]ache/
- +
- +# Others
- +ClientBin/
- +~$*
- +*~
- +*.dbmdl
- +*.dbproj.schemaview
- +*.jfm
- +*.pfx
- +*.publishsettings
- +orleans.codegen.cs
- +
- +# Since there are multiple workflows, uncomment next line to ignore bower_components
- +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
- +#bower_components/
- +
- +# RIA/Silverlight projects
- +Generated_Code/
- +
- +# Backup & report files from converting an old project file
- +# to a newer Visual Studio version. Backup files are not needed,
- +# because we have git ;-)
- +_UpgradeReport_Files/
- +Backup*/
- +UpgradeLog*.XML
- +UpgradeLog*.htm
- +
- +# SQL Server files
- +*.mdf
- +*.ldf
- +
- +# Business Intelligence projects
- +*.rdl.data
- +*.bim.layout
- +*.bim_*.settings
- +
- +# Microsoft Fakes
- +FakesAssemblies/
- +
- +# GhostDoc plugin setting file
- +*.GhostDoc.xml
- +
- +# Node.js Tools for Visual Studio
- +.ntvs_analysis.dat
- +node_modules/
- +
- +# Typescript v1 declaration files
- +typings/
- +
- +# Visual Studio 6 build log
- +*.plg
- +
- +# Visual Studio 6 workspace options file
- +*.opt
- +
- +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
- +*.vbw
- +
- +# Visual Studio LightSwitch build output
- +**/*.HTMLClient/GeneratedArtifacts
- +**/*.DesktopClient/GeneratedArtifacts
- +**/*.DesktopClient/ModelManifest.xml
- +**/*.Server/GeneratedArtifacts
- +**/*.Server/ModelManifest.xml
- +_Pvt_Extensions
- +
- +# Paket dependency manager
- +.paket/paket.exe
- +paket-files/
- +
- +# FAKE - F# Make
- +.fake/
- +
- +# JetBrains Rider
- +.idea/
- +*.sln.iml
- +
- +# CodeRush
- +.cr/
- +
- +# Python Tools for Visual Studio (PTVS)
- +__pycache__/
- +*.pyc
- +
- +# OpenARK Third Party Resources
- +*.pap
- +*.ppp
- +*.dylib
- +opencv_*
- +pmdaccess2.dll
- +OpenNI2.dll
- +main.cpp
- +
- +# Cake - Uncomment if you are using it
- +# tools/**
- +# !tools/packages.config
- diff --git a/CMakeLists.txt b/CMakeLists.txt
- index 14427d1..e6cd58d 100644
- --- a/CMakeLists.txt
- +++ b/CMakeLists.txt
- @@ -1,6 +1,6 @@
- -cmake_minimum_required(VERSION 2.8)
- -project( OpenARK )
- -find_package( OpenCV REQUIRED )
- -set(SOURCES Clustering.cpp PMDSensor.cpp Sensor.cpp Webcam.cpp DepthSensor.cpp RGBSensor.cpp Visualizer.cpp main.cpp)
- -add_executable( OpenARK ${SOURCES} )
- +cmake_minimum_required(VERSION 2.8)
- +project( OpenARK )
- +find_package( OpenCV REQUIRED )
- +set(SOURCES Clustering.cpp PMDSensor.cpp Sensor.cpp Webcam.cpp DepthSensor.cpp RGBSensor.cpp Visualizer.cpp main.cpp)
- +add_executable( OpenARK ${SOURCES} )
- target_link_libraries( OpenARK ${OpenCV_LIBS} )
- \ No newline at end of file
- diff --git a/Calibration.cpp b/Calibration.cpp
- index 5747d01..0fdd729 100644
- --- a/Calibration.cpp
- +++ b/Calibration.cpp
- @@ -1,206 +1,206 @@
- -#include "Calibration.h"
- -
- -
- -void Calibration::XYZToUnity(DepthCamera& depth_cam, int num_boards, int board_w, int board_h)
- -{
- - cv::Size board_sz = cv::Size(board_w, board_h);
- - int board_n = board_w * board_h;
- - std::vector<cv::Point2f> cornersAmp; // Corners of amplitude image
- - std::vector<cv::Point3f> cornersXYZ; // Corners of the depth image
- - std::vector<std::vector<cv::Point3f>> XYZ_points;
- -
- - // Prepare the Unity side data
- - std::vector<std::vector<cv::Point3f>> Unity_points;
- - std::vector<cv::Point3f> upper_left;
- - upper_left.push_back(cv::Point3f(-0.05, 0.03, 0.40));
- - upper_left.push_back(cv::Point3f(0.05, 0.03, 0.40));
- - upper_left.push_back(cv::Point3f(0.0, 0.08, 0.35));
- - upper_left.push_back(cv::Point3f(0.0, -0.02, 0.35));
- - Unity_points = prepareUnityData(upper_left, 0.03, board_h, board_w);
- -
- - int success = 0;
- -
- - // Collect data for calibration
- - while (success < num_boards)
- - {
- - cornersAmp.clear();
- - cornersXYZ.clear();
- - bool found1 = false;
- - depth_cam.update();
- - depth_cam.removeNoise();
- - cv::Mat xyzMap = depth_cam.getXYZMap();
- -
- - cv::Mat ampGray;
- - cv::normalize(depth_cam.getAmpMap(), ampGray, 0, 255, cv::NORM_MINMAX, CV_8UC1);
- - cv::equalizeHist(ampGray, ampGray);
- - cv::resize(ampGray, ampGray, cv::Size(ampGray.cols * 4, ampGray.rows * 4));
- -
- - // Sharpen amplitude image
- - cv::Mat unsharp_mask;
- - cv::GaussianBlur(ampGray, unsharp_mask, cv::Size(5, 5), 5);
- - cv::addWeighted(ampGray, 1.5, unsharp_mask, -0.5, 0, ampGray);
- - cv::imshow("Gray Amp", ampGray);
- -
- - // Find chessboards on amplitude
- - found1 = findChessboardCorners(ampGray, board_sz, cornersAmp, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
- -
- -
- - if (found1) {
- - cornerSubPix(ampGray, cornersAmp, cv::Size(11, 11), cv::Size(-1, -1), cv::TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
- - cv::Mat ampRGB = ampGray.clone();
- - cv::cvtColor(ampRGB, ampRGB, CV_GRAY2BGR);
- - drawChessboardCorners(ampRGB, board_sz, cornersAmp, found1);
- - cv::imshow("Gray Corners", ampRGB);
- -
- - for (int i = 0; i < cornersAmp.size(); i++) {
- - cornersAmp[i].x = cornersAmp[i].x / 4;
- - cornersAmp[i].y = cornersAmp[i].y / 4;
- - }
- -
- - for (int i = 0; i < cornersAmp.size(); i++) {
- - cv::Vec3f xyz = Util::averageAroundPoint(xyzMap, cv::Point2i(cornersAmp[i].x, cornersAmp[i].y), 5);
- - cv::Point3f pt;
- - pt.x = xyz[0]; pt.y = xyz[1], pt.z = xyz[2];
- - if (pt.z == 0) {
- - continue;
- - }
- - cornersXYZ.push_back(pt);
- - }
- -
- - int c = cvWaitKey(1);
- - if (c == ' ') {
- - success++;
- - XYZ_points.push_back(cornersXYZ);
- - printf("%d points recorded!\n", cornersXYZ.size());
- - }
- - }
- -
- -
- - int c = cvWaitKey(1);
- - if (c == 'q' || c == 'Q' || c == 27) {
- - break;
- - }
- - }
- -
- - /**** Perform calculations ****/
- - Calibration::writeDataToFile(Unity_points, 4, 3, "Unity.txt");
- - Calibration::writeDataToFile(XYZ_points, 4, 3, "XYZ.txt");
- - float x_input[3][48];
- - float y_input[3][48];
- - int count = 0;
- - for (int i = 0; i < XYZ_points.size(); i++) {
- - for (int v = 0; v < XYZ_points[i].size(); v++) {
- - x_input[0][count] = XYZ_points[i][v].x;
- - x_input[1][count] = XYZ_points[i][v].y;
- - x_input[2][count] = XYZ_points[i][v].z;
- -
- - y_input[0][count] = Unity_points[i][v].x;
- - y_input[1][count] = Unity_points[i][v].y;
- - y_input[2][count] = Unity_points[i][v].z;
- -
- - count++;
- - }
- - }
- -
- - cv::Mat x = cv::Mat(3, 48, CV_32FC1, &x_input); //XYZ
- - cv::Mat y = cv::Mat(3, 48, CV_32FC1, &y_input); //Unity
- - cv::Mat r, t;
- - computeRT(x, y, &r, &t);
- -
- - cv::FileStorage fs("RT_Transform.txt", cv::FileStorage::WRITE);
- -
- - fs << "R" << r;
- - fs << "T" << t;
- -
- - fs.release();
- -}
- -void Calibration::computeRT(cv::Mat x, cv::Mat y, cv::Mat *R, cv::Mat *t) {
- -
- - cv::Mat x_mean, y_mean, H;
- - cv::reduce(x, x_mean, 1, CV_REDUCE_AVG);
- - cv::reduce(y, y_mean, 1, CV_REDUCE_AVG);
- - for (int i = 0; i < x.cols; i++) {
- - H = H + (x.col(i) - x_mean) * ((y.col(i) - y_mean).t());
- - }
- - cv::Mat u, s, v;
- - cv::SVD::compute(H, s, u, v);
- - u = -1 * u;
- - v = -1 * v.t();
- - *R = v * u.t();
- - if (cv::determinant(*R) > 0) {
- - v.col(2) = -1 * v.col(2);
- - *R = v * u.t();
- - }
- - *t = -1 * *R * x_mean + y_mean;
- -}
- -
- -void Calibration::XYZToRGB(DepthCamera* depth_cam, RGBCamera* rgb_cam, int num_boards, int board_w, int board_h)
- -{
- - return;
- -}
- -
- -double Calibration::reprojectXYZToUnity(std::vector<std::vector<cv::Point3f>> XYZ_points, std::vector<std::vector<cv::Point3f>> Unity_points, Eigen::MatrixXf R, Eigen::MatrixXf T)
- -{
- - // Return error value if there is a size mismatch
- - if (XYZ_points.size() != Unity_points.size())
- - {
- - return -1.00;
- - }
- -
- - double error = 0;
- - for (int i = 0; i < XYZ_points.size(); i++) {
- - for (int v = 0; v < XYZ_points[i].size(); v++) {
- - Eigen::MatrixXf pt_xyz(3, 1);
- - Eigen::MatrixXf pt_unity(3, 1);
- - pt_xyz(0, 0) = XYZ_points[i][v].x;
- - pt_xyz(1, 0) = XYZ_points[i][v].y;
- - pt_xyz(2, 0) = XYZ_points[i][v].z;
- - pt_unity(0, 0) = Unity_points[i][v].x;
- - pt_unity(1, 0) = Unity_points[i][v].y;
- - pt_unity(2, 0) = Unity_points[i][v].z;
- -
- - Eigen::MatrixXf result = R * T * pt_xyz;
- - error += abs((result - pt_unity).norm());
- - }
- - }
- -
- - return error;
- -}
- -
- -double Calibration::reprojectXYZtoRGB()
- -{
- - return false;
- -}
- -
- -std::vector<std::vector<cv::Point3f>> Calibration::prepareUnityData(std::vector<cv::Point3f> upper_left, float distance, int num_rows, int num_cols)
- -{
- - std::vector<std::vector<cv::Point3f>> Unity_points;
- -
- - for (int i = 0; i < upper_left.size(); i++) {
- - std::vector<cv::Point3f> points;
- - for (int y = 0; y < num_rows; y++) {
- - for (int x = 0; x < num_cols; x++) {
- - points.push_back(cv::Point3f(upper_left[i].x + x * distance, upper_left[i].y - y * distance, upper_left[i].z));
- - }
- - }
- - Unity_points.push_back(points);
- - }
- -
- - return Unity_points;
- -}
- -
- -void Calibration::writeDataToFile(std::vector<std::vector<cv::Point3f>> points, int board_w, int board_h, std::string filename)
- -{
- - ofstream output_file;
- - output_file.open(filename);
- - for (int i = 0; i < points.size(); i++) {
- - for (int v = 0; v < points[i].size(); v++) {
- - if (v%board_w == 0) {
- - output_file << "\n";
- - }
- - output_file << "(" << points[i][v].x << ", " << points[i][v].y << ", " << points[i][v].z << ") ";
- - }
- - output_file << "\n\n";
- - }
- - output_file.close();
- +#include "Calibration.h"
- +
- +
- +void Calibration::XYZToUnity(DepthCamera& depth_cam, int num_boards, int board_w, int board_h)
- +{
- + cv::Size board_sz = cv::Size(board_w, board_h);
- + int board_n = board_w * board_h;
- + std::vector<cv::Point2f> cornersAmp; // Corners of amplitude image
- + std::vector<cv::Point3f> cornersXYZ; // Corners of the depth image
- + std::vector<std::vector<cv::Point3f>> XYZ_points;
- +
- + // Prepare the Unity side data
- + std::vector<std::vector<cv::Point3f>> Unity_points;
- + std::vector<cv::Point3f> upper_left;
- + upper_left.push_back(cv::Point3f(-0.05, 0.03, 0.40));
- + upper_left.push_back(cv::Point3f(0.05, 0.03, 0.40));
- + upper_left.push_back(cv::Point3f(0.0, 0.08, 0.35));
- + upper_left.push_back(cv::Point3f(0.0, -0.02, 0.35));
- + Unity_points = prepareUnityData(upper_left, 0.03, board_h, board_w);
- +
- + int success = 0;
- +
- + // Collect data for calibration
- + while (success < num_boards)
- + {
- + cornersAmp.clear();
- + cornersXYZ.clear();
- + bool found1 = false;
- + depth_cam.update();
- + depth_cam.removeNoise();
- + cv::Mat xyzMap = depth_cam.getXYZMap();
- +
- + cv::Mat ampGray;
- + cv::normalize(depth_cam.getAmpMap(), ampGray, 0, 255, cv::NORM_MINMAX, CV_8UC1);
- + cv::equalizeHist(ampGray, ampGray);
- + cv::resize(ampGray, ampGray, cv::Size(ampGray.cols * 4, ampGray.rows * 4));
- +
- + // Sharpen amplitude image
- + cv::Mat unsharp_mask;
- + cv::GaussianBlur(ampGray, unsharp_mask, cv::Size(5, 5), 5);
- + cv::addWeighted(ampGray, 1.5, unsharp_mask, -0.5, 0, ampGray);
- + cv::imshow("Gray Amp", ampGray);
- +
- + // Find chessboards on amplitude
- + found1 = findChessboardCorners(ampGray, board_sz, cornersAmp, CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
- +
- +
- + if (found1) {
- + cornerSubPix(ampGray, cornersAmp, cv::Size(11, 11), cv::Size(-1, -1), cv::TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
- + cv::Mat ampRGB = ampGray.clone();
- + cv::cvtColor(ampRGB, ampRGB, CV_GRAY2BGR);
- + drawChessboardCorners(ampRGB, board_sz, cornersAmp, found1);
- + cv::imshow("Gray Corners", ampRGB);
- +
- + for (int i = 0; i < cornersAmp.size(); i++) {
- + cornersAmp[i].x = cornersAmp[i].x / 4;
- + cornersAmp[i].y = cornersAmp[i].y / 4;
- + }
- +
- + for (int i = 0; i < cornersAmp.size(); i++) {
- + cv::Vec3f xyz = Util::averageAroundPoint(xyzMap, cv::Point2i(cornersAmp[i].x, cornersAmp[i].y), 5);
- + cv::Point3f pt;
- + pt.x = xyz[0]; pt.y = xyz[1], pt.z = xyz[2];
- + if (pt.z == 0) {
- + continue;
- + }
- + cornersXYZ.push_back(pt);
- + }
- +
- + int c = cvWaitKey(1);
- + if (c == ' ') {
- + success++;
- + XYZ_points.push_back(cornersXYZ);
- + printf("%d points recorded!\n", cornersXYZ.size());
- + }
- + }
- +
- +
- + int c = cvWaitKey(1);
- + if (c == 'q' || c == 'Q' || c == 27) {
- + break;
- + }
- + }
- +
- + /**** Perform calculations ****/
- + Calibration::writeDataToFile(Unity_points, 4, 3, "Unity.txt");
- + Calibration::writeDataToFile(XYZ_points, 4, 3, "XYZ.txt");
- + float x_input[3][48];
- + float y_input[3][48];
- + int count = 0;
- + for (int i = 0; i < XYZ_points.size(); i++) {
- + for (int v = 0; v < XYZ_points[i].size(); v++) {
- + x_input[0][count] = XYZ_points[i][v].x;
- + x_input[1][count] = XYZ_points[i][v].y;
- + x_input[2][count] = XYZ_points[i][v].z;
- +
- + y_input[0][count] = Unity_points[i][v].x;
- + y_input[1][count] = Unity_points[i][v].y;
- + y_input[2][count] = Unity_points[i][v].z;
- +
- + count++;
- + }
- + }
- +
- + cv::Mat x = cv::Mat(3, 48, CV_32FC1, &x_input); //XYZ
- + cv::Mat y = cv::Mat(3, 48, CV_32FC1, &y_input); //Unity
- + cv::Mat r, t;
- + computeRT(x, y, &r, &t);
- +
- + cv::FileStorage fs("RT_Transform.txt", cv::FileStorage::WRITE);
- +
- + fs << "R" << r;
- + fs << "T" << t;
- +
- + fs.release();
- +}
- +void Calibration::computeRT(cv::Mat x, cv::Mat y, cv::Mat *R, cv::Mat *t) {
- +
- + cv::Mat x_mean, y_mean, H;
- + cv::reduce(x, x_mean, 1, CV_REDUCE_AVG);
- + cv::reduce(y, y_mean, 1, CV_REDUCE_AVG);
- + for (int i = 0; i < x.cols; i++) {
- + H = H + (x.col(i) - x_mean) * ((y.col(i) - y_mean).t());
- + }
- + cv::Mat u, s, v;
- + cv::SVD::compute(H, s, u, v);
- + u = -1 * u;
- + v = -1 * v.t();
- + *R = v * u.t();
- + if (cv::determinant(*R) > 0) {
- + v.col(2) = -1 * v.col(2);
- + *R = v * u.t();
- + }
- + *t = -1 * *R * x_mean + y_mean;
- +}
- +
- +void Calibration::XYZToRGB(DepthCamera* depth_cam, RGBCamera* rgb_cam, int num_boards, int board_w, int board_h)
- +{
- + return;
- +}
- +
- +double Calibration::reprojectXYZToUnity(std::vector<std::vector<cv::Point3f>> XYZ_points, std::vector<std::vector<cv::Point3f>> Unity_points, Eigen::MatrixXf R, Eigen::MatrixXf T)
- +{
- + // Return error value if there is a size mismatch
- + if (XYZ_points.size() != Unity_points.size())
- + {
- + return -1.00;
- + }
- +
- + double error = 0;
- + for (int i = 0; i < XYZ_points.size(); i++) {
- + for (int v = 0; v < XYZ_points[i].size(); v++) {
- + Eigen::MatrixXf pt_xyz(3, 1);
- + Eigen::MatrixXf pt_unity(3, 1);
- + pt_xyz(0, 0) = XYZ_points[i][v].x;
- + pt_xyz(1, 0) = XYZ_points[i][v].y;
- + pt_xyz(2, 0) = XYZ_points[i][v].z;
- + pt_unity(0, 0) = Unity_points[i][v].x;
- + pt_unity(1, 0) = Unity_points[i][v].y;
- + pt_unity(2, 0) = Unity_points[i][v].z;
- +
- + Eigen::MatrixXf result = R * T * pt_xyz;
- + error += abs((result - pt_unity).norm());
- + }
- + }
- +
- + return error;
- +}
- +
- +double Calibration::reprojectXYZtoRGB()
- +{
- + return false;
- +}
- +
- +std::vector<std::vector<cv::Point3f>> Calibration::prepareUnityData(std::vector<cv::Point3f> upper_left, float distance, int num_rows, int num_cols)
- +{
- + std::vector<std::vector<cv::Point3f>> Unity_points;
- +
- + for (int i = 0; i < upper_left.size(); i++) {
- + std::vector<cv::Point3f> points;
- + for (int y = 0; y < num_rows; y++) {
- + for (int x = 0; x < num_cols; x++) {
- + points.push_back(cv::Point3f(upper_left[i].x + x * distance, upper_left[i].y - y * distance, upper_left[i].z));
- + }
- + }
- + Unity_points.push_back(points);
- + }
- +
- + return Unity_points;
- +}
- +
- +void Calibration::writeDataToFile(std::vector<std::vector<cv::Point3f>> points, int board_w, int board_h, std::string filename)
- +{
- + ofstream output_file;
- + output_file.open(filename);
- + for (int i = 0; i < points.size(); i++) {
- + for (int v = 0; v < points[i].size(); v++) {
- + if (v%board_w == 0) {
- + output_file << "\n";
- + }
- + output_file << "(" << points[i][v].x << ", " << points[i][v].y << ", " << points[i][v].z << ") ";
- + }
- + output_file << "\n\n";
- + }
- + output_file.close();
- }
- \ No newline at end of file
- diff --git a/Calibration.h b/Calibration.h
- index 665de28..b6fe383 100644
- --- a/Calibration.h
- +++ b/Calibration.h
- @@ -1,90 +1,92 @@
- -#pragma once
- -// C++ Libaries
- -#include <fstream>
- -
- -// OpenCV Libraries
- -#include "opencv2/calib3d/calib3d.hpp"
- -#include "opencv2/highgui/highgui.hpp"
- -#include <opencv2/video/tracking.hpp>
- -#include "opencv2/imgproc/imgproc.hpp"
- -#include <opencv2/objdetect/objdetect.hpp>
- -#include <opencv2/features2d/features2d.hpp>
- -
- -// Eigen Libaries
- -#include <Eigen/SVD>
- -
- -// OpenARK Libraries
- -#include "Visualizer.h"
- -#include "DepthCamera.h"
- -#include "RGBCamera.h"
- -#include "Util.h"
- -
- -/**
- -* Class for various calibration operations.
- -*/
- -class Calibration
- -{
- -public:
- - /**
- - * Compute a calibration from (x,y,z) real world coordinates to (x',y',z') Unity coordinates.
- - * @param depth_cam instance of a live @see DepthCamera
- - * @param num_boards number of checkboard positions
- - * @param board_w width of the board (number of inner intersections)
- - * @param board_h height of the board (number of inner intersections)
- - */
- - static void XYZToUnity(DepthCamera& depth_cam, int num_boards, int board_w, int board_h);
- -
- - /**
- - * Compute a calibration from (x,y,z) real world coordiantes to (i,j) RGB camera coordinates.
- - * @param depth_cam instance of a live @see DepthCamera
- - * @param rgb_cam instance of a live @see RGBCamera
- - * @param num_boards number of checkboard positions
- - * @param board_w width of the board (number of inner intersections)
- - * @param board_h height of the board (number of inner intersections)
- - */
- - static void XYZToRGB(DepthCamera* depth_cam, RGBCamera* rgb_cam, int num_boards, int board_w, int board_h);
- -
- - /**
- - * Reproject the (x,y,z) points to (x',y',z') Unity points with the RT matrix to test for error.
- - * @param XYZ_points coordinates from the PMD sensor
- - * @param Unity_points coordinates from the game engine
- - * @param R the rotation matrix to use
- - * @param T the translation matrix to use
- - * @return cummulative reprojection error
- - */
- - static double reprojectXYZToUnity(std::vector<std::vector<cv::Point3f>> XYZ_points, std::vector<std::vector<cv::Point3f>> Unity_points, Eigen::MatrixXf R, Eigen::MatrixXf T);
- -
- - /**
- - * Reproject the (x,y,z) points to (i,j) RGB image points with the RT matrix to test for error.
- - */
- - static double reprojectXYZtoRGB();
- -
- - /**
- - * Compute full set of Unity checkboard coordinates.
- - * @param upper_left the upper left corner coordinates of the chessboard
- - * @param distance size of the checkerboard (meters)
- - * @param num_rows number of rows (inner intersections)
- - * @param num_cols number of columns (inner intersections)
- - */
- - static std::vector<std::vector<cv::Point3f>> prepareUnityData(std::vector<cv::Point3f> upper_left, float distance, int num_rows, int num_cols);
- -
- - /**
- - * Write calibration data points to file
- - * @param points data points to be written to file
- - * @param board_w board width (used for formatting the file)
- - * @param board_h board height (used for formatting the file)
- - * @param filename path of the file
- - */
- - static void writeDataToFile(std::vector<std::vector<cv::Point3f>> points, int board_w, int board_h, std::string filename);
- -
- -private:
- - /**
- - * Compute the translation and rotation matrix from coordinate system x->y given a set of corresponding points
- - * @param [in] x set of coordinates from the first coordinate system
- - * @param [in] y set of corresponding coordinates from the second coordinate system
- - * @param [out] R resultant rotation matrix
- - * @param [out] t resultant translation matrix
- - */
- - static void computeRT(cv::Mat x, cv::Mat y, cv::Mat *R, cv::Mat *t);
- -
- +#pragma once
- +// C++ Libaries
- +#include <fstream>
- +
- +// OpenCV Libraries
- +#include <opencv/cxcore.h>
- +#include <opencv/highgui.h>
- +#include "opencv2/calib3d/calib3d.hpp"
- +#include "opencv2/highgui/highgui.hpp"
- +#include <opencv2/video/tracking.hpp>
- +#include "opencv2/imgproc/imgproc.hpp"
- +#include <opencv2/objdetect/objdetect.hpp>
- +#include <opencv2/features2d/features2d.hpp>
- +
- +// Eigen Libaries
- +#include <Eigen/SVD>
- +
- +// OpenARK Libraries
- +#include "Visualizer.h"
- +#include "DepthCamera.h"
- +#include "RGBCamera.h"
- +#include "Util.h"
- +
- +/**
- +* Class for various calibration operations.
- +*/
- +class Calibration
- +{
- +public:
- + /**
- + * Compute a calibration from (x,y,z) real world coordinates to (x',y',z') Unity coordinates.
- + * @param depth_cam instance of a live @see DepthCamera
- + * @param num_boards number of checkboard positions
- + * @param board_w width of the board (number of inner intersections)
- + * @param board_h height of the board (number of inner intersections)
- + */
- + static void XYZToUnity(DepthCamera& depth_cam, int num_boards, int board_w, int board_h);
- +
- + /**
- + * Compute a calibration from (x,y,z) real world coordiantes to (i,j) RGB camera coordinates.
- + * @param depth_cam instance of a live @see DepthCamera
- + * @param rgb_cam instance of a live @see RGBCamera
- + * @param num_boards number of checkboard positions
- + * @param board_w width of the board (number of inner intersections)
- + * @param board_h height of the board (number of inner intersections)
- + */
- + static void XYZToRGB(DepthCamera* depth_cam, RGBCamera* rgb_cam, int num_boards, int board_w, int board_h);
- +
- + /**
- + * Reproject the (x,y,z) points to (x',y',z') Unity points with the RT matrix to test for error.
- + * @param XYZ_points coordinates from the PMD sensor
- + * @param Unity_points coordinates from the game engine
- + * @param R the rotation matrix to use
- + * @param T the translation matrix to use
- + * @return cummulative reprojection error
- + */
- + static double reprojectXYZToUnity(std::vector<std::vector<cv::Point3f>> XYZ_points, std::vector<std::vector<cv::Point3f>> Unity_points, Eigen::MatrixXf R, Eigen::MatrixXf T);
- +
- + /**
- + * Reproject the (x,y,z) points to (i,j) RGB image points with the RT matrix to test for error.
- + */
- + static double reprojectXYZtoRGB();
- +
- + /**
- + * Compute full set of Unity checkboard coordinates.
- + * @param upper_left the upper left corner coordinates of the chessboard
- + * @param distance size of the checkerboard (meters)
- + * @param num_rows number of rows (inner intersections)
- + * @param num_cols number of columns (inner intersections)
- + */
- + static std::vector<std::vector<cv::Point3f>> prepareUnityData(std::vector<cv::Point3f> upper_left, float distance, int num_rows, int num_cols);
- +
- + /**
- + * Write calibration data points to file
- + * @param points data points to be written to file
- + * @param board_w board width (used for formatting the file)
- + * @param board_h board height (used for formatting the file)
- + * @param filename path of the file
- + */
- + static void writeDataToFile(std::vector<std::vector<cv::Point3f>> points, int board_w, int board_h, std::string filename);
- +
- +private:
- + /**
- + * Compute the translation and rotation matrix from coordinate system x->y given a set of corresponding points
- + * @param [in] x set of coordinates from the first coordinate system
- + * @param [in] y set of corresponding coordinates from the second coordinate system
- + * @param [out] R resultant rotation matrix
- + * @param [out] t resultant translation matrix
- + */
- + static void computeRT(cv::Mat x, cv::Mat y, cv::Mat *R, cv::Mat *t);
- +
- };
- \ No newline at end of file
- diff --git a/Converter.cpp b/Converter.cpp
- deleted file mode 100644
- index 718a81a..0000000
- --- a/Converter.cpp
- +++ /dev/null
- @@ -1,65 +0,0 @@
- -#include "Converter.h"
- -
- -
- -/***
- -Returns the next frame if next frame is recorded
- -Returns the previous frame if next frame is not recorded
- -***/
- -void Converter::ConvertPXCImageToOpenCVMat(Intel::RealSense::Image *inImg, Intel::RealSense::ImageData data, cv::Mat *outImg) {
- -
- - int cvDataType;
- - int cvDataWidth;
- -
- - Intel::RealSense::Image::ImageInfo imgInfo = inImg->QueryInfo();
- -
- - switch (data.format) {
- - /* STREAM_TYPE_COLOR */
- - case Intel::RealSense::Image::PIXEL_FORMAT_YUY2: /* YUY2 image */
- - case Intel::RealSense::Image::PIXEL_FORMAT_NV12: /* NV12 image */
- - throw(0); // Not implemented
- - case Intel::RealSense::Image::PIXEL_FORMAT_RGB32: /* BGRA layout on a little-endian machine */
- - cvDataType = CV_8UC4;
- - cvDataWidth = 4;
- - break;
- - case Intel::RealSense::Image::PIXEL_FORMAT_RGB24: /* BGR layout on a little-endian machine */
- - cvDataType = CV_8UC3;
- - cvDataWidth = 3;
- - break;
- - case Intel::RealSense::Image::PIXEL_FORMAT_Y8: /* 8-Bit Gray Image, or IR 8-bit */
- - cvDataType = CV_8U;
- - cvDataWidth = 1;
- - break;
- -
- - /* STREAM_TYPE_DEPTH */
- - case Intel::RealSense::Image::PIXEL_FORMAT_DEPTH: /* 16-bit unsigned integer with precision mm. */
- - case Intel::RealSense::Image::PIXEL_FORMAT_DEPTH_RAW: /* 16-bit unsigned integer with device specific precision (call device->QueryDepthUnit()) */
- - cvDataType = CV_16U;
- - cvDataWidth = 2;
- - break;
- - case Intel::RealSense::Image::PIXEL_FORMAT_DEPTH_F32: /* 32-bit float-point with precision mm. */
- - cvDataType = CV_32F;
- - cvDataWidth = 4;
- - break;
- -
- - /* STREAM_TYPE_IR */
- - case Intel::RealSense::Image::PIXEL_FORMAT_Y16: /* 16-Bit Gray Image */
- - cvDataType = CV_16U;
- - cvDataWidth = 2;
- - break;
- - case Intel::RealSense::Image::PIXEL_FORMAT_Y8_IR_RELATIVE: /* Relative IR Image */
- - cvDataType = CV_8U;
- - cvDataWidth = 1;
- - break;
- - }
- -
- - // suppose that no other planes
- - if (data.planes[1] != NULL) throw(0); // not implemented
- - // suppose that no sub pixel padding needed
- - if (data.pitches[0] % cvDataWidth != 0) throw(0); // not implemented
- -
- - outImg->create(imgInfo.height, data.pitches[0] / cvDataWidth, cvDataType);
- -
- - //memcpy(outImg->data, data.planes[0], imgInfo.height*imgInfo.width*cvDataWidth * sizeof(pxcBYTE));
- - memcpy(outImg->data, data.planes[0], imgInfo.height*imgInfo.width*cvDataWidth * sizeof(uint8_t));
- -}
- -
- diff --git a/Converter.h b/Converter.h
- deleted file mode 100644
- index 265ee26..0000000
- --- a/Converter.h
- +++ /dev/null
- @@ -1,29 +0,0 @@
- -#pragma once
- -//Intel RealSense 3D SDK libraries
- -#include "RealSense/SenseManager.h"
- -#include "RealSense/SampleReader.h"
- -#include "RealSense/Session.h"
- -
- -//OpenCV libraries
- -#include <opencv2/opencv.hpp>
- -#include "opencv2/highgui/highgui.hpp"
- -#include <opencv2/video/tracking.hpp>
- -#include "opencv2/imgproc/imgproc.hpp"
- -#include <opencv2/objdetect/objdetect.hpp>
- -#include <opencv2/features2d/features2d.hpp>
- -
- -/**
- -* Class for converting Intel RealSense images to OpenCV image format
- -*/
- -class Converter
- -{
- -public:
- -
- - /**
- - * Converting an Intel RealSense 3D camera image to OpenCV image format
- - * @param inImg input image
- - * @param data Intel RealSense image data
- - * @param outImg output image in form of OpenCV image
- - */
- - static void Converter::ConvertPXCImageToOpenCVMat(Intel::RealSense::Image *inImg, Intel::RealSense::ImageData data, cv::Mat *outImg);
- -};
- \ No newline at end of file
- diff --git a/DepthCamera.cpp b/DepthCamera.cpp
- index 2a67e46..18577db 100644
- --- a/DepthCamera.cpp
- +++ b/DepthCamera.cpp
- @@ -1,198 +1,188 @@
- -#include "DepthCamera.h"
- -
- -void DepthCamera::computeClusters(double max_distance, double min_size)
- -{
- - clusters.clear();
- - cv::Mat depthMap = cv::Mat::zeros(depthMap.rows, depthMap.cols, depthMap.type());
- - cv::medianBlur(xyzMap, depthMap, 3);
- - cv::Mat mask = cv::Mat::zeros(depthMap.rows, depthMap.cols, depthMap.type());
- - for (int r = depthMap.rows - 1; r >= 0; r--) {
- - for (int c = 0; c < depthMap.cols; c++) {
- - if (depthMap.at<cv::Vec3f>(r, c)[2] > 0.2) {
- - mask = cv::Mat::zeros(depthMap.rows, depthMap.cols, depthMap.type());
- - floodFill(c, r, depthMap, mask, max_distance);
- - cv::Mat channels[3];
- - cv::split(mask, channels);
- - if (cv::countNonZero(channels[2]) > min_size) {
- - cv::medianBlur(mask, mask, 3);
- - clusters.push_back(mask.clone());
- - }
- - }
- - }
- - }
- -}
- -
- -/***
- -Recursively performs floodfill on depthMap
- -***/
- -void DepthCamera::floodFill(int x, int y, cv::Mat& depthMap, cv::Mat& mask, double max_distance)
- -{
- - if (x < 0 || x >= depthMap.cols || y < 0 || y >= depthMap.rows || depthMap.at<cv::Vec3f>(y, x)[2] == 0.0)
- - return;
- - if (closeEnough(x, y, depthMap, 4, max_distance)) {
- - mask.at<cv::Vec3f>(y, x) = depthMap.at<cv::Vec3f>(y, x);
- - depthMap.at<cv::Vec3f>(y, x)[0] = 0;
- - depthMap.at<cv::Vec3f>(y, x)[1] = 0;
- - depthMap.at<cv::Vec3f>(y, x)[2] = 0;
- - }
- - else {
- - return;
- - }
- -
- - floodFill(x + 1, y, depthMap, mask, max_distance);
- - floodFill(x - 1, y, depthMap, mask, max_distance);
- - floodFill(x, y + 1, depthMap, mask, max_distance);
- - floodFill(x, y - 1, depthMap, mask, max_distance);
- -}
- -
- -/***
- -Check whether candidate point is close enough to neighboring points
- -***/
- -bool DepthCamera::closeEnough(int x, int y, cv::Mat& depthMap, int num_neighbors, double max_distance)
- -{
- - int num_close = 0;
- - if (x - 1 < 0 || depthMap.at<cv::Vec3f>(y, x - 1)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y, x - 1)) < max_distance) {
- - num_close++;
- - }
- - if (x + 1 >= depthMap.cols || depthMap.at<cv::Vec3f>(y, x + 1)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y, x + 1)) < max_distance) {
- - num_close++;
- - }
- - if (y - 1 < 0 || depthMap.at<cv::Vec3f>(y - 1, x)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y - 1, x)) < max_distance) {
- - num_close++;
- - }
- - if (y + 1 >= depthMap.rows || depthMap.at<cv::Vec3f>(y + 1, x)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y + 1, x)) < max_distance) {
- - num_close++;
- - }
- -
- - if (num_close >= num_neighbors) {
- - return true;
- - }
- -
- - return false;
- -}
- -
- -/***
- -Remove noise on zMap and xyzMap based on INVALID_FLAG_VALUE and CONFIDENCE_THRESHOLD
- -***/
- -void DepthCamera::removeNoise() {
- -
- - for (int y = 0; y < xyzMap.rows; y++) {
- - for (int x = 0; x < xyzMap.cols; x++) {
- - if (ampMap.data != NULL) {
- - if (xyzMap.at<cv::Vec3f>(y, x)[2] > 0.9f || ampMap.at<float>(y, x) < CONFIDENCE_THRESHHOLD) {
- - xyzMap.at<cv::Vec3f>(y, x)[0] = 0;
- - xyzMap.at<cv::Vec3f>(y, x)[1] = 0;
- - xyzMap.at<cv::Vec3f>(y, x)[2] = 0;
- - }
- - }
- - else {
- - if (xyzMap.at<cv::Vec3f>(y, x)[2] > 0.9f){
- - xyzMap.at<cv::Vec3f>(y, x)[0] = 0;
- - xyzMap.at<cv::Vec3f>(y, x)[1] = 0;
- - xyzMap.at<cv::Vec3f>(y, x)[2] = 0;
- - }
- - }
- - }
- - }
- -
- -
- - cv::Mat channels[3];
- - cv::split(xyzMap, channels);
- - if ((float)cv::countNonZero(channels[2]) / (xyzMap.rows*xyzMap.cols) > 0.5) {
- - badInput = true;
- - }
- - else {
- - badInput = false;
- - }
- -
- - return;
- -}
- -
- -void DepthCamera::removePoints(std::vector<cv::Point2i> points)
- -{
- - for (int i = 0; i < points.size(); i++) {
- - int x = points[i].x;
- - int y = points[i].y;
- - xyzMap.at<cv::Vec3f>(y, x)[0] = 0;
- - xyzMap.at<cv::Vec3f>(y, x)[1] = 0;
- - xyzMap.at<cv::Vec3f>(y, x)[2] = 0;
- - }
- - return;
- -}
- -
- -int DepthCamera::getWidth()
- -{
- - return X_DIMENSION;
- -}
- -
- -int DepthCamera::getHeight()
- -{
- - return Y_DIMENSION;
- -}
- -
- -cv::Mat DepthCamera::getXYZMap()
- -{
- - return xyzMap;
- -}
- -
- -cv::Mat DepthCamera::getAmpMap()
- -{
- - return ampMap;
- -}
- -
- -cv::Mat DepthCamera::getFlagMap()
- -{
- - return flagMap;
- -}
- -
- -std::vector<cv::Mat> DepthCamera::getClusters()
- -{
- - return clusters;
- -}
- -
- -void DepthCamera::initilizeImages()
- -{
- - cv::Size dimension = cv::Size(X_DIMENSION, Y_DIMENSION);
- - ampMap = cv::Mat(dimension, CV_32FC1);
- - xyzMap = cv::Mat(dimension, CV_32FC3);
- - flagMap = cv::Mat(dimension, CV_8UC1);
- - clusters.clear();
- -
- - return;
- -}
- -
- -/***
- -write a frame into file located at "destination"
- -***/
- -bool DepthCamera::writeImage(std::string destination) {
- - cv::FileStorage fs(destination, cv::FileStorage::WRITE);
- -
- - fs << "xyzMap" << xyzMap;
- - fs << "ampMap" << ampMap;
- - fs << "flagMap" << flagMap;
- -
- - fs.release();
- - return true;
- -}
- -
- -/***
- -Reads a frame from file located at "source"
- -***/
- -bool DepthCamera::readImage(std::string source) {
- - cv::FileStorage fs;
- - fs.open(source, cv::FileStorage::READ);
- -
- - initilizeImages();
- - fs["xyzMap"] >> xyzMap;
- - fs["ampMap"] >> ampMap;
- - fs["flagMap"] >> flagMap;
- -
- - fs.release();
- -
- - if (xyzMap.rows == 0 || ampMap.rows == 0 || flagMap.rows == 0) {
- - return false;
- - }
- - else {
- - return true;
- - }
- +#include "DepthCamera.h"
- +
- +void DepthCamera::computeClusters(double max_distance, double min_size)
- +{
- + clusters.clear();
- + cv::Mat depthMap = cv::Mat::zeros(depthMap.rows, depthMap.cols, depthMap.type());
- + cv::medianBlur(xyzMap, depthMap, 3);
- + cv::Mat mask = cv::Mat::zeros(depthMap.rows, depthMap.cols, depthMap.type());
- + for (int r = depthMap.rows - 1; r >= 0; r--) {
- + for (int c = 0; c < depthMap.cols; c++) {
- + if (depthMap.at<cv::Vec3f>(r, c)[2] > 0.2) {
- + mask = cv::Mat::zeros(depthMap.rows, depthMap.cols, depthMap.type());
- + floodFill(c, r, depthMap, mask, max_distance);
- + cv::Mat channels[3];
- + cv::split(mask, channels);
- + if (cv::countNonZero(channels[2]) > min_size) {
- + cv::medianBlur(mask, mask, 3);
- + clusters.push_back(mask.clone());
- + }
- + }
- + }
- + }
- +}
- +
- +/***
- +Recursively performs floodfill on depthMap
- +***/
- +void DepthCamera::floodFill(int x, int y, cv::Mat& depthMap, cv::Mat& mask, double max_distance)
- +{
- + if (x < 0 || x >= depthMap.cols || y < 0 || y >= depthMap.rows || depthMap.at<cv::Vec3f>(y, x)[2] == 0.0)
- + return;
- + if (closeEnough(x, y, depthMap, 4, max_distance)) {
- + mask.at<cv::Vec3f>(y, x) = depthMap.at<cv::Vec3f>(y, x);
- + depthMap.at<cv::Vec3f>(y, x)[0] = 0;
- + depthMap.at<cv::Vec3f>(y, x)[1] = 0;
- + depthMap.at<cv::Vec3f>(y, x)[2] = 0;
- + }
- + else {
- + return;
- + }
- +
- + floodFill(x + 1, y, depthMap, mask, max_distance);
- + floodFill(x - 1, y, depthMap, mask, max_distance);
- + floodFill(x, y + 1, depthMap, mask, max_distance);
- + floodFill(x, y - 1, depthMap, mask, max_distance);
- +}
- +
- +/***
- +Check whether candidate point is close enough to neighboring points
- +***/
- +bool DepthCamera::closeEnough(int x, int y, cv::Mat& depthMap, int num_neighbors, double max_distance)
- +{
- + int num_close = 0;
- + if (x - 1 < 0 || depthMap.at<cv::Vec3f>(y, x - 1)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y, x - 1)) < max_distance) {
- + num_close++;
- + }
- + if (x + 1 >= depthMap.cols || depthMap.at<cv::Vec3f>(y, x + 1)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y, x + 1)) < max_distance) {
- + num_close++;
- + }
- + if (y - 1 < 0 || depthMap.at<cv::Vec3f>(y - 1, x)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y - 1, x)) < max_distance) {
- + num_close++;
- + }
- + if (y + 1 >= depthMap.rows || depthMap.at<cv::Vec3f>(y + 1, x)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y + 1, x)) < max_distance) {
- + num_close++;
- + }
- +
- + if (num_close >= num_neighbors) {
- + return true;
- + }
- +
- + return false;
- +}
- +
- +/***
- +Remove noise on zMap and xyzMap based on INVALID_FLAG_VALUE and CONFIDENCE_THRESHOLD
- +***/
- +void DepthCamera::removeNoise() {
- +
- + for (int y = 0; y < xyzMap.rows; y++) {
- + for (int x = 0; x < xyzMap.cols; x++) {
- + if (xyzMap.at<cv::Vec3f>(y, x)[2] > 0.9f || ampMap.at<float>(y, x) < CONFIDENCE_THRESHHOLD)
- + {
- + xyzMap.at<cv::Vec3f>(y, x)[0] = 0;
- + xyzMap.at<cv::Vec3f>(y, x)[1] = 0;
- + xyzMap.at<cv::Vec3f>(y, x)[2] = 0;
- + }
- + }
- + }
- +
- + cv::Mat channels[3];
- + cv::split(xyzMap, channels);
- + if ((float)cv::countNonZero(channels[2]) / (xyzMap.rows*xyzMap.cols) > 0.5) {
- + badInput = true;
- + } else {
- + badInput = false;
- + }
- +
- + return;
- +}
- +
- +void DepthCamera::removePoints(std::vector<cv::Point2i> points)
- +{
- + for (int i = 0; i < points.size();i++) {
- + int x = points[i].x;
- + int y = points[i].y;
- + xyzMap.at<cv::Vec3f>(y, x)[0] = 0;
- + xyzMap.at<cv::Vec3f>(y, x)[1] = 0;
- + xyzMap.at<cv::Vec3f>(y, x)[2] = 0;
- + }
- + return;
- +}
- +
- +int DepthCamera::getWidth()
- +{
- + return X_DIMENSION;
- +}
- +
- +int DepthCamera::getHeight()
- +{
- + return Y_DIMENSION;
- +}
- +
- +cv::Mat DepthCamera::getXYZMap()
- +{
- + return xyzMap;
- +}
- +
- +cv::Mat DepthCamera::getAmpMap()
- +{
- + return ampMap;
- +}
- +
- +cv::Mat DepthCamera::getFlagMap()
- +{
- + return flagMap;
- +}
- +
- +std::vector<cv::Mat> DepthCamera::getClusters()
- +{
- + return clusters;
- +}
- +
- +void DepthCamera::initilizeImages()
- +{
- + cv::Size dimension = cv::Size(X_DIMENSION, Y_DIMENSION);
- + ampMap = cv::Mat(dimension, CV_32FC1);
- + xyzMap = cv::Mat(dimension, CV_32FC3);
- + flagMap = cv::Mat(dimension, CV_8UC1);
- + clusters.clear();
- +
- + return;
- +}
- +
- +/***
- +write a frame into file located at "destination"
- +***/
- +bool DepthCamera::writeImage(std::string destination) {
- + cv::FileStorage fs(destination, cv::FileStorage::WRITE);
- +
- + fs << "xyzMap" << xyzMap;
- + fs << "ampMap" << ampMap;
- + fs << "flagMap" << flagMap;
- +
- + fs.release();
- + return true;
- +}
- +
- +/***
- +Reads a frame from file located at "source"
- +***/
- +bool DepthCamera::readImage(std::string source) {
- + cv::FileStorage fs;
- + fs.open(source, cv::FileStorage::READ);
- +
- + initilizeImages();
- + fs["xyzMap"] >> xyzMap;
- + fs["ampMap"] >> ampMap;
- + fs["flagMap"] >> flagMap;
- +
- + fs.release();
- +
- + if (xyzMap.rows == 0 || ampMap.rows == 0 || flagMap.rows == 0) {
- + return false;
- + }
- + else {
- + return true;
- + }
- }
- \ No newline at end of file
- diff --git a/DepthCamera.h b/DepthCamera.h
- index e199060..4672faa 100644
- --- a/DepthCamera.h
- +++ b/DepthCamera.h
- @@ -1,173 +1,173 @@
- -#pragma once
- -// C++ Libraries
- -#include <iostream>
- -
- -// OpenCV Libraries
- -#include "opencv2/highgui/highgui.hpp"
- -#include <opencv2/video/tracking.hpp>
- -#include "opencv2/imgproc/imgproc.hpp"
- -#include <opencv2/objdetect/objdetect.hpp>
- -#include <opencv2/features2d/features2d.hpp>
- -
- -// OpenARK Libraries
- -#include "Util.h"
- -
- -/**
- - * Class defining general behavior of a depth camera.
- - * Any depth camera should be able to generate a XYXMap, AmpMap (confidence), and FlagMap.
- - */
- -class DepthCamera
- -{
- -public:
- - /**
- - * Update the depth camera by one frame.
- - * This function should be overriden with a concrete implementation depending on the specific depth camera
- - */
- - virtual void update() = 0;
- -
- - /**
- - * Closes and exists the depth camera.
- - * This function should be overriden with a concrete implementation depending on the specific depth camera
- - */
- - virtual void destroyInstance() = 0;
- -
- - /**
- - * Performs euclidean clustering to separate discrete objects in the input point cloud.
- - * @param max_distance the maximum allowed distance to be clustered
- - * @param min_size the minimum number of points a valid cluster should have
- - */
- - void computeClusters(double max_distance, double min_size);
- -
- - /**
- - * Reads a sample frame from file.
- - * @param source the directory which the frame file is stored
- - */
- - bool readImage(std::string source);
- -
- - /**
- - * Writes the current frame into file.
- - * @param destination the directory which the frame should be written to
- - */
- - bool writeImage(std::string destination);
- -
- - /**
- - * Removes noise from the XYZMap based on confidence provided in the AmpMap and FlagMap.
- - */
- - void removeNoise();
- -
- - /**
- - * Removes all points defined by the coordinates in the points vector from the XYZMap.
- - * @param [in] points the list of coordinates where data from the XYZMap should be removed
- - */
- - void removePoints(std::vector<cv::Point2i> points);
- -
- - /**
- - * Return the current XYZMap.
- - */
- - cv::Mat getXYZMap();
- -
- - /**
- - * Return the current AmpMap
- - */
- - cv::Mat getAmpMap();
- -
- - /**
- - * Return the current FlagMap.
- - */
- - cv::Mat getFlagMap();
- -
- - /**
- - * Returns the width of the frame in pixels.
- - */
- - int getWidth();
- -
- - /**
- - * Returns the height of the frame in pixels.
- - */
- - int getHeight();
- -
- - /**
- - * Returns all the clusters (discrete objects) in the current frame.
- - * @see computeClusters
- - * @return vector of matrixes with each matrix corresponding to a cluster in no particular order
- - */
- - std::vector<cv::Mat> getClusters();
- -
- - bool badInput;
- -
- -
- -protected:
- - /**
- - * Initializes all variables used by the generic depth camera.
- - * Sets xyzMap, ampMap, flagMap, and clusters to empty
- - */
- - void initilizeImages();
- -
- - /**
- - * Performs floodfill starting from seed point (x,y).
- - * @param x x-coordinate of the seed point
- - * @param y y-coordinate of the seed point
- - * @param [in] zMap the xyzMap point cloud
- - * @param [out] mask the resulting region of the floodfill
- - * @param max_distance the maximum euclidean distance allowed between neighbors
- - */
- - void floodFill(int x, int y, cv::Mat& zMap, cv::Mat& mask, double max_distance);
- -
- - /**
- - * Analyze the candidate point with its neighbors to determine whether they belong to the same cluster.
- - * @param x x-coordinate of the candidate point
- - * @param y y-coordinate of the candidate point
- - * @param [in] depthMap the xyzMap point cloud of the scene
- - * @param num_neighbors the number of neighbors to consider
- - * @param max_distance the maximum euclidean distance allowed between neighbors
- - */
- - bool closeEnough(int x, int y, cv::Mat& depthMap, int num_neighbors, double max_distance);
- -
- - /**
- - * Stores the (x,y,z) data of every point in the observable world.
- - * Matrix type CV_32FC3
- - */
- - cv::Mat xyzMap;
- -
- - /**
- - * Stores the confidence value of each corresponding point in the world.
- - * Matrix type CV_32FC1
- - */
- - cv::Mat ampMap;
- -
- - /**
- - * Stores additional information about the points in the world.
- - * Matrix type CV_8UC1
- - */
- - cv::Mat flagMap;
- -
- - /**
- - * Stores the each individual cluster in its individual XYZMap.
- - */
- - std::vector<cv::Mat> clusters;
- -
- - /**
- - * Value that determines the validity of a point in respect to the ampMap.
- - * This value varies from sensor to sensor so it should be define when constructing child class
- - */
- - double CONFIDENCE_THRESHHOLD;
- -
- - /**
- - * Value that determines the validity of a point in respect to the flagMap.
- - * This value varies from sensor to sensor so it should be defined when constructing child class
- - */
- - int INVALID_FLAG_VALUE;
- -
- - /**
- - * The image width resolution (pixels) that the depth sensor produces.
- - */
- - //mona int X_DIMENSION = 176;
- - int X_DIMENSION = 640;
- -
- -
- - /**
- - * The image height resolution (pixels) that the depth sensor produces.
- - */
- - //mona int Y_DIMENSION = 120;
- - int Y_DIMENSION = 480;
- +#pragma once
- +
- +// C++ Libraries
- +#include <iostream>
- +
- +// OpenCV Libraries
- +#include <opencv/cxcore.h>
- +#include <opencv/highgui.h>
- +#include "opencv2/highgui/highgui.hpp"
- +#include <opencv2/video/tracking.hpp>
- +#include "opencv2/imgproc/imgproc.hpp"
- +#include <opencv2/objdetect/objdetect.hpp>
- +#include <opencv2/features2d/features2d.hpp>
- +
- +// OpenARK Libraries
- +#include "Util.h"
- +
- +/**
- + * Class defining general behavior of a depth camera.
- + * Any depth camera should be able to generate a XYXMap, AmpMap (confidence), and FlagMap.
- + */
- +class DepthCamera
- +{
- +public:
- + /**
- + * Update the depth camera by one frame.
- + * This function should be overriden with a concrete implementation depending on the specific depth camera
- + */
- + virtual void update() = 0;
- +
- + /**
- + * Closes and exists the depth camera.
- + * This function should be overriden with a concrete implementation depending on the specific depth camera
- + */
- + virtual void destroyInstance() = 0;
- +
- + /**
- + * Performs euclidean clustering to separate discrete objects in the input point cloud.
- + * @param max_distance the maximum allowed distance to be clustered
- + * @param min_size the minimum number of points a valid cluster should have
- + */
- + void computeClusters(double max_distance, double min_size);
- +
- + /**
- + * Reads a sample frame from file.
- + * @param source the directory which the frame file is stored
- + */
- + bool readImage(std::string source);
- +
- + /**
- + * Writes the current frame into file.
- + * @param destination the directory which the frame should be written to
- + */
- + bool writeImage(std::string destination);
- +
- + /**
- + * Removes noise from the XYZMap based on confidence provided in the AmpMap and FlagMap.
- + */
- + void removeNoise();
- +
- + /**
- + * Removes all points defined by the coordinates in the points vector from the XYZMap.
- + * @param [in] points the list of coordinates where data from the XYZMap should be removed
- + */
- + void removePoints(std::vector<cv::Point2i> points);
- +
- + /**
- + * Return the current XYZMap.
- + */
- + cv::Mat getXYZMap();
- +
- + /**
- + * Return the current AmpMap
- + */
- + cv::Mat getAmpMap();
- +
- + /**
- + * Return the current FlagMap.
- + */
- + cv::Mat getFlagMap();
- +
- + /**
- + * Returns the width of the frame in pixels.
- + */
- + int getWidth();
- +
- + /**
- + * Returns the height of the frame in pixels.
- + */
- + int getHeight();
- +
- + /**
- + * Returns all the clusters (discrete objects) in the current frame.
- + * @see computeClusters
- + * @return vector of matrixes with each matrix corresponding to a cluster in no particular order
- + */
- + std::vector<cv::Mat> getClusters();
- +
- + bool badInput;
- +
- +
- +protected:
- + /**
- + * Initializes all variables used by the generic depth camera.
- + * Sets xyzMap, ampMap, flagMap, and clusters to empty
- + */
- + void initilizeImages();
- +
- + /**
- + * Performs floodfill starting from seed point (x,y).
- + * @param x x-coordinate of the seed point
- + * @param y y-coordinate of the seed point
- + * @param [in] zMap the xyzMap point cloud
- + * @param [out] mask the resulting region of the floodfill
- + * @param max_distance the maximum euclidean distance allowed between neighbors
- + */
- + void floodFill(int x, int y, cv::Mat& zMap, cv::Mat& mask, double max_distance);
- +
- + /**
- + * Analyze the candidate point with its neighbors to determine whether they belong to the same cluster.
- + * @param x x-coordinate of the candidate point
- + * @param y y-coordinate of the candidate point
- + * @param [in] depthMap the xyzMap point cloud of the scene
- + * @param num_neighbors the number of neighbors to consider
- + * @param max_distance the maximum euclidean distance allowed between neighbors
- + */
- + bool closeEnough(int x, int y, cv::Mat& depthMap, int num_neighbors, double max_distance);
- +
- + /**
- + * Stores the (x,y,z) data of every point in the observable world.
- + * Matrix type CV_32FC3
- + */
- + cv::Mat xyzMap;
- +
- + /**
- + * Stores the confidence value of each corresponding point in the world.
- + * Matrix type CV_32FC1
- + */
- + cv::Mat ampMap;
- +
- + /**
- + * Stores additional information about the points in the world.
- + * Matrix type CV_8UC1
- + */
- + cv::Mat flagMap;
- +
- + /**
- + * Stores the each individual cluster in its individual XYZMap.
- + */
- + std::vector<cv::Mat> clusters;
- +
- + /**
- + * Value that determines the validity of a point in respect to the ampMap.
- + * This value varies from sensor to sensor so it should be define when constructing child class
- + */
- + double CONFIDENCE_THRESHHOLD;
- +
- + /**
- + * Value that determines the validity of a point in respect to the flagMap.
- + * This value varies from sensor to sensor so it should be defined when constructing child class
- + */
- + int INVALID_FLAG_VALUE;
- +
- + /**
- + * The image width resolution (pixels) that the depth sensor produces.
- + */
- + int X_DIMENSION = 176;
- +
- + /**
- + * The image height resolution (pixels) that the depth sensor produces.
- + */
- + int Y_DIMENSION = 120;
- };
- \ No newline at end of file
- diff --git a/DoxygenConfig b/DoxygenConfig
- index 17e8556..ee7aca3 100644
- --- a/DoxygenConfig
- +++ b/DoxygenConfig
- @@ -1,2487 +1,2487 @@
- -# Doxyfile 1.8.12
- -
- -# This file describes the settings to be used by the documentation system
- -# doxygen (www.doxygen.org) for a project.
- -#
- -# All text after a double hash (##) is considered a comment and is placed in
- -# front of the TAG it is preceding.
- -#
- -# All text after a single hash (#) is considered a comment and will be ignored.
- -# The format is:
- -# TAG = value [value, ...]
- -# For lists, items can also be appended using:
- -# TAG += value [value, ...]
- -# Values that contain spaces should be placed between quotes (\" \").
- -
- -#---------------------------------------------------------------------------
- -# Project related configuration options
- -#---------------------------------------------------------------------------
- -
- -# This tag specifies the encoding used for all characters in the config file
- -# that follow. The default is UTF-8 which is also the encoding used for all text
- -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
- -# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
- -# for the list of possible encodings.
- -# The default value is: UTF-8.
- -
- -DOXYFILE_ENCODING = UTF-8
- -
- -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
- -# double-quotes, unless you are using Doxywizard) that should identify the
- -# project for which the documentation is generated. This name is used in the
- -# title of most generated pages and in a few other places.
- -# The default value is: My Project.
- -
- -PROJECT_NAME = "Open Augmented Reality Kit (OpenARK)"
- -
- -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
- -# could be handy for archiving the generated documentation or if some version
- -# control system is used.
- -
- -PROJECT_NUMBER = 0.8
- -
- -# Using the PROJECT_BRIEF tag one can provide an optional one line description
- -# for a project that appears at the top of each page and should give viewer a
- -# quick idea about the purpose of the project. Keep the description short.
- -
- -PROJECT_BRIEF = "Open-source wearable augmented reality (AR) system founded at UC Berkeley in 2016"
- -
- -# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
- -# in the documentation. The maximum height of the logo should not exceed 55
- -# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
- -# the logo to the output directory.
- -
- -PROJECT_LOGO =
- -
- -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
- -# into which the generated documentation will be written. If a relative path is
- -# entered, it will be relative to the location where doxygen was started. If
- -# left blank the current directory will be used.
- -
- -OUTPUT_DIRECTORY = D:\OpenARK-Documentation\0.8
- -
- -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
- -# directories (in 2 levels) under the output directory of each output format and
- -# will distribute the generated files over these directories. Enabling this
- -# option can be useful when feeding doxygen a huge amount of source files, where
- -# putting all generated files in the same directory would otherwise causes
- -# performance problems for the file system.
- -# The default value is: NO.
- -
- -CREATE_SUBDIRS = NO
- -
- -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
- -# characters to appear in the names of generated files. If set to NO, non-ASCII
- -# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
- -# U+3044.
- -# The default value is: NO.
- -
- -ALLOW_UNICODE_NAMES = NO
- -
- -# The OUTPUT_LANGUAGE tag is used to specify the language in which all
- -# documentation generated by doxygen is written. Doxygen will use this
- -# information to generate all constant output in the proper language.
- -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
- -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
- -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
- -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
- -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
- -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
- -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
- -# Ukrainian and Vietnamese.
- -# The default value is: English.
- -
- -OUTPUT_LANGUAGE = English
- -
- -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
- -# descriptions after the members that are listed in the file and class
- -# documentation (similar to Javadoc). Set to NO to disable this.
- -# The default value is: YES.
- -
- -BRIEF_MEMBER_DESC = YES
- -
- -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
- -# description of a member or function before the detailed description
- -#
- -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
- -# brief descriptions will be completely suppressed.
- -# The default value is: YES.
- -
- -REPEAT_BRIEF = YES
- -
- -# This tag implements a quasi-intelligent brief description abbreviator that is
- -# used to form the text in various listings. Each string in this list, if found
- -# as the leading text of the brief description, will be stripped from the text
- -# and the result, after processing the whole list, is used as the annotated
- -# text. Otherwise, the brief description is used as-is. If left blank, the
- -# following values are used ($name is automatically replaced with the name of
- -# the entity):The $name class, The $name widget, The $name file, is, provides,
- -# specifies, contains, represents, a, an and the.
- -
- -ABBREVIATE_BRIEF = "The $name class" \
- - "The $name widget" \
- - "The $name file" \
- - is \
- - provides \
- - specifies \
- - contains \
- - represents \
- - a \
- - an \
- - the
- -
- -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
- -# doxygen will generate a detailed section even if there is only a brief
- -# description.
- -# The default value is: NO.
- -
- -ALWAYS_DETAILED_SEC = NO
- -
- -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
- -# inherited members of a class in the documentation of that class as if those
- -# members were ordinary class members. Constructors, destructors and assignment
- -# operators of the base classes will not be shown.
- -# The default value is: NO.
- -
- -INLINE_INHERITED_MEMB = NO
- -
- -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
- -# before files name in the file list and in the header files. If set to NO the
- -# shortest path that makes the file name unique will be used
- -# The default value is: YES.
- -
- -FULL_PATH_NAMES = NO
- -
- -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
- -# Stripping is only done if one of the specified strings matches the left-hand
- -# part of the path. The tag can be used to show relative paths in the file list.
- -# If left blank the directory from which doxygen is run is used as the path to
- -# strip.
- -#
- -# Note that you can specify absolute paths here, but also relative paths, which
- -# will be relative from the directory where doxygen is started.
- -# This tag requires that the tag FULL_PATH_NAMES is set to YES.
- -
- -STRIP_FROM_PATH =
- -
- -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
- -# path mentioned in the documentation of a class, which tells the reader which
- -# header file to include in order to use a class. If left blank only the name of
- -# the header file containing the class definition is used. Otherwise one should
- -# specify the list of include paths that are normally passed to the compiler
- -# using the -I flag.
- -
- -STRIP_FROM_INC_PATH =
- -
- -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
- -# less readable) file names. This can be useful is your file systems doesn't
- -# support long names like on DOS, Mac, or CD-ROM.
- -# The default value is: NO.
- -
- -SHORT_NAMES = NO
- -
- -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
- -# first line (until the first dot) of a Javadoc-style comment as the brief
- -# description. If set to NO, the Javadoc-style will behave just like regular Qt-
- -# style comments (thus requiring an explicit @brief command for a brief
- -# description.)
- -# The default value is: NO.
- -
- -JAVADOC_AUTOBRIEF = YES
- -
- -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
- -# line (until the first dot) of a Qt-style comment as the brief description. If
- -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
- -# requiring an explicit \brief command for a brief description.)
- -# The default value is: NO.
- -
- -QT_AUTOBRIEF = NO
- -
- -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
- -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
- -# a brief description. This used to be the default behavior. The new default is
- -# to treat a multi-line C++ comment block as a detailed description. Set this
- -# tag to YES if you prefer the old behavior instead.
- -#
- -# Note that setting this tag to YES also means that rational rose comments are
- -# not recognized any more.
- -# The default value is: NO.
- -
- -MULTILINE_CPP_IS_BRIEF = NO
- -
- -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
- -# documentation from any documented member that it re-implements.
- -# The default value is: YES.
- -
- -INHERIT_DOCS = YES
- -
- -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
- -# page for each member. If set to NO, the documentation of a member will be part
- -# of the file/class/namespace that contains it.
- -# The default value is: NO.
- -
- -SEPARATE_MEMBER_PAGES = NO
- -
- -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
- -# uses this value to replace tabs by spaces in code fragments.
- -# Minimum value: 1, maximum value: 16, default value: 4.
- -
- -TAB_SIZE = 4
- -
- -# This tag can be used to specify a number of aliases that act as commands in
- -# the documentation. An alias has the form:
- -# name=value
- -# For example adding
- -# "sideeffect=@par Side Effects:\n"
- -# will allow you to put the command \sideeffect (or @sideeffect) in the
- -# documentation, which will result in a user-defined paragraph with heading
- -# "Side Effects:". You can put \n's in the value part of an alias to insert
- -# newlines.
- -
- -ALIASES =
- -
- -# This tag can be used to specify a number of word-keyword mappings (TCL only).
- -# A mapping has the form "name=value". For example adding "class=itcl::class"
- -# will allow you to use the command class in the itcl::class meaning.
- -
- -TCL_SUBST =
- -
- -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
- -# only. Doxygen will then generate output that is more tailored for C. For
- -# instance, some of the names that are used will be different. The list of all
- -# members will be omitted, etc.
- -# The default value is: NO.
- -
- -OPTIMIZE_OUTPUT_FOR_C = NO
- -
- -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
- -# Python sources only. Doxygen will then generate output that is more tailored
- -# for that language. For instance, namespaces will be presented as packages,
- -# qualified scopes will look different, etc.
- -# The default value is: NO.
- -
- -OPTIMIZE_OUTPUT_JAVA = NO
- -
- -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
- -# sources. Doxygen will then generate output that is tailored for Fortran.
- -# The default value is: NO.
- -
- -OPTIMIZE_FOR_FORTRAN = NO
- -
- -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
- -# sources. Doxygen will then generate output that is tailored for VHDL.
- -# The default value is: NO.
- -
- -OPTIMIZE_OUTPUT_VHDL = NO
- -
- -# Doxygen selects the parser to use depending on the extension of the files it
- -# parses. With this tag you can assign which parser to use for a given
- -# extension. Doxygen has a built-in mapping, but you can override or extend it
- -# using this tag. The format is ext=language, where ext is a file extension, and
- -# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
- -# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
- -# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
- -# Fortran. In the later case the parser tries to guess whether the code is fixed
- -# or free formatted code, this is the default for Fortran type files), VHDL. For
- -# instance to make doxygen treat .inc files as Fortran files (default is PHP),
- -# and .f files as C (default is Fortran), use: inc=Fortran f=C.
- -#
- -# Note: For files without extension you can use no_extension as a placeholder.
- -#
- -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
- -# the files are not read by doxygen.
- -
- -EXTENSION_MAPPING =
- -
- -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
- -# according to the Markdown format, which allows for more readable
- -# documentation. See http://daringfireball.net/projects/markdown/ for details.
- -# The output of markdown processing is further processed by doxygen, so you can
- -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
- -# case of backward compatibilities issues.
- -# The default value is: YES.
- -
- -MARKDOWN_SUPPORT = YES
- -
- -# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
- -# to that level are automatically included in the table of contents, even if
- -# they do not have an id attribute.
- -# Note: This feature currently applies only to Markdown headings.
- -# Minimum value: 0, maximum value: 99, default value: 0.
- -# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
- -
- -TOC_INCLUDE_HEADINGS = 0
- -
- -# When enabled doxygen tries to link words that correspond to documented
- -# classes, or namespaces to their corresponding documentation. Such a link can
- -# be prevented in individual cases by putting a % sign in front of the word or
- -# globally by setting AUTOLINK_SUPPORT to NO.
- -# The default value is: YES.
- -
- -AUTOLINK_SUPPORT = YES
- -
- -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
- -# to include (a tag file for) the STL sources as input, then you should set this
- -# tag to YES in order to let doxygen match functions declarations and
- -# definitions whose arguments contain STL classes (e.g. func(std::string);
- -# versus func(std::string) {}). This also make the inheritance and collaboration
- -# diagrams that involve STL classes more complete and accurate.
- -# The default value is: NO.
- -
- -BUILTIN_STL_SUPPORT = NO
- -
- -# If you use Microsoft's C++/CLI language, you should set this option to YES to
- -# enable parsing support.
- -# The default value is: NO.
- -
- -CPP_CLI_SUPPORT = NO
- -
- -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
- -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
- -# will parse them like normal C++ but will assume all classes use public instead
- -# of private inheritance when no explicit protection keyword is present.
- -# The default value is: NO.
- -
- -SIP_SUPPORT = NO
- -
- -# For Microsoft's IDL there are propget and propput attributes to indicate
- -# getter and setter methods for a property. Setting this option to YES will make
- -# doxygen to replace the get and set methods by a property in the documentation.
- -# This will only work if the methods are indeed getting or setting a simple
- -# type. If this is not the case, or you want to show the methods anyway, you
- -# should set this option to NO.
- -# The default value is: YES.
- -
- -IDL_PROPERTY_SUPPORT = YES
- -
- -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
- -# tag is set to YES then doxygen will reuse the documentation of the first
- -# member in the group (if any) for the other members of the group. By default
- -# all members of a group must be documented explicitly.
- -# The default value is: NO.
- -
- -DISTRIBUTE_GROUP_DOC = NO
- -
- -# If one adds a struct or class to a group and this option is enabled, then also
- -# any nested class or struct is added to the same group. By default this option
- -# is disabled and one has to add nested compounds explicitly via \ingroup.
- -# The default value is: NO.
- -
- -GROUP_NESTED_COMPOUNDS = NO
- -
- -# Set the SUBGROUPING tag to YES to allow class member groups of the same type
- -# (for instance a group of public functions) to be put as a subgroup of that
- -# type (e.g. under the Public Functions section). Set it to NO to prevent
- -# subgrouping. Alternatively, this can be done per class using the
- -# \nosubgrouping command.
- -# The default value is: YES.
- -
- -SUBGROUPING = YES
- -
- -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
- -# are shown inside the group in which they are included (e.g. using \ingroup)
- -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
- -# and RTF).
- -#
- -# Note that this feature does not work in combination with
- -# SEPARATE_MEMBER_PAGES.
- -# The default value is: NO.
- -
- -INLINE_GROUPED_CLASSES = NO
- -
- -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
- -# with only public data fields or simple typedef fields will be shown inline in
- -# the documentation of the scope in which they are defined (i.e. file,
- -# namespace, or group documentation), provided this scope is documented. If set
- -# to NO, structs, classes, and unions are shown on a separate page (for HTML and
- -# Man pages) or section (for LaTeX and RTF).
- -# The default value is: NO.
- -
- -INLINE_SIMPLE_STRUCTS = NO
- -
- -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
- -# enum is documented as struct, union, or enum with the name of the typedef. So
- -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
- -# with name TypeT. When disabled the typedef will appear as a member of a file,
- -# namespace, or class. And the struct will be named TypeS. This can typically be
- -# useful for C code in case the coding convention dictates that all compound
- -# types are typedef'ed and only the typedef is referenced, never the tag name.
- -# The default value is: NO.
- -
- -TYPEDEF_HIDES_STRUCT = NO
- -
- -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
- -# cache is used to resolve symbols given their name and scope. Since this can be
- -# an expensive process and often the same symbol appears multiple times in the
- -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
- -# doxygen will become slower. If the cache is too large, memory is wasted. The
- -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
- -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
- -# symbols. At the end of a run doxygen will report the cache usage and suggest
- -# the optimal cache size from a speed point of view.
- -# Minimum value: 0, maximum value: 9, default value: 0.
- -
- -LOOKUP_CACHE_SIZE = 0
- -
- -#---------------------------------------------------------------------------
- -# Build related configuration options
- -#---------------------------------------------------------------------------
- -
- -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
- -# documentation are documented, even if no documentation was available. Private
- -# class members and static file members will be hidden unless the
- -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
- -# Note: This will also disable the warnings about undocumented members that are
- -# normally produced when WARNINGS is set to YES.
- -# The default value is: NO.
- -
- -EXTRACT_ALL = YES
- -
- -# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
- -# be included in the documentation.
- -# The default value is: NO.
- -
- -EXTRACT_PRIVATE = YES
- -
- -# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
- -# scope will be included in the documentation.
- -# The default value is: NO.
- -
- -EXTRACT_PACKAGE = NO
- -
- -# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
- -# included in the documentation.
- -# The default value is: NO.
- -
- -EXTRACT_STATIC = YES
- -
- -# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
- -# locally in source files will be included in the documentation. If set to NO,
- -# only classes defined in header files are included. Does not have any effect
- -# for Java sources.
- -# The default value is: YES.
- -
- -EXTRACT_LOCAL_CLASSES = YES
- -
- -# This flag is only useful for Objective-C code. If set to YES, local methods,
- -# which are defined in the implementation section but not in the interface are
- -# included in the documentation. If set to NO, only methods in the interface are
- -# included.
- -# The default value is: NO.
- -
- -EXTRACT_LOCAL_METHODS = NO
- -
- -# If this flag is set to YES, the members of anonymous namespaces will be
- -# extracted and appear in the documentation as a namespace called
- -# 'anonymous_namespace{file}', where file will be replaced with the base name of
- -# the file that contains the anonymous namespace. By default anonymous namespace
- -# are hidden.
- -# The default value is: NO.
- -
- -EXTRACT_ANON_NSPACES = NO
- -
- -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
- -# undocumented members inside documented classes or files. If set to NO these
- -# members will be included in the various overviews, but no documentation
- -# section is generated. This option has no effect if EXTRACT_ALL is enabled.
- -# The default value is: NO.
- -
- -HIDE_UNDOC_MEMBERS = NO
- -
- -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
- -# undocumented classes that are normally visible in the class hierarchy. If set
- -# to NO, these classes will be included in the various overviews. This option
- -# has no effect if EXTRACT_ALL is enabled.
- -# The default value is: NO.
- -
- -HIDE_UNDOC_CLASSES = NO
- -
- -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
- -# (class|struct|union) declarations. If set to NO, these declarations will be
- -# included in the documentation.
- -# The default value is: NO.
- -
- -HIDE_FRIEND_COMPOUNDS = NO
- -
- -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
- -# documentation blocks found inside the body of a function. If set to NO, these
- -# blocks will be appended to the function's detailed documentation block.
- -# The default value is: NO.
- -
- -HIDE_IN_BODY_DOCS = NO
- -
- -# The INTERNAL_DOCS tag determines if documentation that is typed after a
- -# \internal command is included. If the tag is set to NO then the documentation
- -# will be excluded. Set it to YES to include the internal documentation.
- -# The default value is: NO.
- -
- -INTERNAL_DOCS = NO
- -
- -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
- -# names in lower-case letters. If set to YES, upper-case letters are also
- -# allowed. This is useful if you have classes or files whose names only differ
- -# in case and if your file system supports case sensitive file names. Windows
- -# and Mac users are advised to set this option to NO.
- -# The default value is: system dependent.
- -
- -CASE_SENSE_NAMES = NO
- -
- -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
- -# their full class and namespace scopes in the documentation. If set to YES, the
- -# scope will be hidden.
- -# The default value is: NO.
- -
- -HIDE_SCOPE_NAMES = NO
- -
- -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
- -# append additional text to a page's title, such as Class Reference. If set to
- -# YES the compound reference will be hidden.
- -# The default value is: NO.
- -
- -HIDE_COMPOUND_REFERENCE= NO
- -
- -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
- -# the files that are included by a file in the documentation of that file.
- -# The default value is: YES.
- -
- -SHOW_INCLUDE_FILES = YES
- -
- -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
- -# grouped member an include statement to the documentation, telling the reader
- -# which file to include in order to use the member.
- -# The default value is: NO.
- -
- -SHOW_GROUPED_MEMB_INC = NO
- -
- -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
- -# files with double quotes in the documentation rather than with sharp brackets.
- -# The default value is: NO.
- -
- -FORCE_LOCAL_INCLUDES = NO
- -
- -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
- -# documentation for inline members.
- -# The default value is: YES.
- -
- -INLINE_INFO = YES
- -
- -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
- -# (detailed) documentation of file and class members alphabetically by member
- -# name. If set to NO, the members will appear in declaration order.
- -# The default value is: YES.
- -
- -SORT_MEMBER_DOCS = YES
- -
- -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
- -# descriptions of file, namespace and class members alphabetically by member
- -# name. If set to NO, the members will appear in declaration order. Note that
- -# this will also influence the order of the classes in the class list.
- -# The default value is: NO.
- -
- -SORT_BRIEF_DOCS = NO
- -
- -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
- -# (brief and detailed) documentation of class members so that constructors and
- -# destructors are listed first. If set to NO the constructors will appear in the
- -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
- -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
- -# member documentation.
- -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
- -# detailed member documentation.
- -# The default value is: NO.
- -
- -SORT_MEMBERS_CTORS_1ST = NO
- -
- -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
- -# of group names into alphabetical order. If set to NO the group names will
- -# appear in their defined order.
- -# The default value is: NO.
- -
- -SORT_GROUP_NAMES = NO
- -
- -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
- -# fully-qualified names, including namespaces. If set to NO, the class list will
- -# be sorted only by class name, not including the namespace part.
- -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
- -# Note: This option applies only to the class list, not to the alphabetical
- -# list.
- -# The default value is: NO.
- -
- -SORT_BY_SCOPE_NAME = NO
- -
- -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
- -# type resolution of all parameters of a function it will reject a match between
- -# the prototype and the implementation of a member function even if there is
- -# only one candidate or it is obvious which candidate to choose by doing a
- -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
- -# accept a match between prototype and implementation in such cases.
- -# The default value is: NO.
- -
- -STRICT_PROTO_MATCHING = NO
- -
- -# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
- -# list. This list is created by putting \todo commands in the documentation.
- -# The default value is: YES.
- -
- -GENERATE_TODOLIST = YES
- -
- -# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
- -# list. This list is created by putting \test commands in the documentation.
- -# The default value is: YES.
- -
- -GENERATE_TESTLIST = YES
- -
- -# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
- -# list. This list is created by putting \bug commands in the documentation.
- -# The default value is: YES.
- -
- -GENERATE_BUGLIST = YES
- -
- -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
- -# the deprecated list. This list is created by putting \deprecated commands in
- -# the documentation.
- -# The default value is: YES.
- -
- -GENERATE_DEPRECATEDLIST= YES
- -
- -# The ENABLED_SECTIONS tag can be used to enable conditional documentation
- -# sections, marked by \if <section_label> ... \endif and \cond <section_label>
- -# ... \endcond blocks.
- -
- -ENABLED_SECTIONS =
- -
- -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
- -# initial value of a variable or macro / define can have for it to appear in the
- -# documentation. If the initializer consists of more lines than specified here
- -# it will be hidden. Use a value of 0 to hide initializers completely. The
- -# appearance of the value of individual variables and macros / defines can be
- -# controlled using \showinitializer or \hideinitializer command in the
- -# documentation regardless of this setting.
- -# Minimum value: 0, maximum value: 10000, default value: 30.
- -
- -MAX_INITIALIZER_LINES = 30
- -
- -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
- -# the bottom of the documentation of classes and structs. If set to YES, the
- -# list will mention the files that were used to generate the documentation.
- -# The default value is: YES.
- -
- -SHOW_USED_FILES = YES
- -
- -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
- -# will remove the Files entry from the Quick Index and from the Folder Tree View
- -# (if specified).
- -# The default value is: YES.
- -
- -SHOW_FILES = YES
- -
- -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
- -# page. This will remove the Namespaces entry from the Quick Index and from the
- -# Folder Tree View (if specified).
- -# The default value is: YES.
- -
- -SHOW_NAMESPACES = YES
- -
- -# The FILE_VERSION_FILTER tag can be used to specify a program or script that
- -# doxygen should invoke to get the current version for each file (typically from
- -# the version control system). Doxygen will invoke the program by executing (via
- -# popen()) the command command input-file, where command is the value of the
- -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
- -# by doxygen. Whatever the program writes to standard output is used as the file
- -# version. For an example see the documentation.
- -
- -FILE_VERSION_FILTER =
- -
- -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
- -# by doxygen. The layout file controls the global structure of the generated
- -# output files in an output format independent way. To create the layout file
- -# that represents doxygen's defaults, run doxygen with the -l option. You can
- -# optionally specify a file name after the option, if omitted DoxygenLayout.xml
- -# will be used as the name of the layout file.
- -#
- -# Note that if you run doxygen from a directory containing a file called
- -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
- -# tag is left empty.
- -
- -LAYOUT_FILE =
- -
- -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
- -# the reference definitions. This must be a list of .bib files. The .bib
- -# extension is automatically appended if omitted. This requires the bibtex tool
- -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
- -# For LaTeX the style of the bibliography can be controlled using
- -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
- -# search path. See also \cite for info how to create references.
- -
- -CITE_BIB_FILES =
- -
- -#---------------------------------------------------------------------------
- -# Configuration options related to warning and progress messages
- -#---------------------------------------------------------------------------
- -
- -# The QUIET tag can be used to turn on/off the messages that are generated to
- -# standard output by doxygen. If QUIET is set to YES this implies that the
- -# messages are off.
- -# The default value is: NO.
- -
- -QUIET = NO
- -
- -# The WARNINGS tag can be used to turn on/off the warning messages that are
- -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
- -# this implies that the warnings are on.
- -#
- -# Tip: Turn warnings on while writing the documentation.
- -# The default value is: YES.
- -
- -WARNINGS = YES
- -
- -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
- -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
- -# will automatically be disabled.
- -# The default value is: YES.
- -
- -WARN_IF_UNDOCUMENTED = YES
- -
- -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
- -# potential errors in the documentation, such as not documenting some parameters
- -# in a documented function, or documenting parameters that don't exist or using
- -# markup commands wrongly.
- -# The default value is: YES.
- -
- -WARN_IF_DOC_ERROR = YES
- -
- -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
- -# are documented, but have no documentation for their parameters or return
- -# value. If set to NO, doxygen will only warn about wrong or incomplete
- -# parameter documentation, but not about the absence of documentation.
- -# The default value is: NO.
- -
- -WARN_NO_PARAMDOC = NO
- -
- -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
- -# a warning is encountered.
- -# The default value is: NO.
- -
- -WARN_AS_ERROR = NO
- -
- -# The WARN_FORMAT tag determines the format of the warning messages that doxygen
- -# can produce. The string should contain the $file, $line, and $text tags, which
- -# will be replaced by the file and line number from which the warning originated
- -# and the warning text. Optionally the format may contain $version, which will
- -# be replaced by the version of the file (if it could be obtained via
- -# FILE_VERSION_FILTER)
- -# The default value is: $file:$line: $text.
- -
- -WARN_FORMAT = "$file:$line: $text"
- -
- -# The WARN_LOGFILE tag can be used to specify a file to which warning and error
- -# messages should be written. If left blank the output is written to standard
- -# error (stderr).
- -
- -WARN_LOGFILE =
- -
- -#---------------------------------------------------------------------------
- -# Configuration options related to the input files
- -#---------------------------------------------------------------------------
- -
- -# The INPUT tag is used to specify the files and/or directories that contain
- -# documented source files. You may enter file names like myfile.cpp or
- -# directories like /usr/src/myproject. Separate the files or directories with
- -# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
- -# Note: If this tag is empty the current directory is searched.
- -
- -INPUT = D:\OpenARK
- -
- -# This tag can be used to specify the character encoding of the source files
- -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
- -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
- -# documentation (see: http://www.gnu.org/software/libiconv) for the list of
- -# possible encodings.
- -# The default value is: UTF-8.
- -
- -INPUT_ENCODING = UTF-8
- -
- -# If the value of the INPUT tag contains directories, you can use the
- -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
- -# *.h) to filter out the source-files in the directories.
- -#
- -# Note that for custom extensions or not directly supported extensions you also
- -# need to set EXTENSION_MAPPING for the extension otherwise the files are not
- -# read by doxygen.
- -#
- -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
- -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
- -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
- -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
- -# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
- -
- -FILE_PATTERNS = *.c \
- - *.cc \
- - *.cxx \
- - *.cpp \
- - *.c++ \
- - *.java \
- - *.ii \
- - *.ixx \
- - *.ipp \
- - *.i++ \
- - *.inl \
- - *.idl \
- - *.ddl \
- - *.odl \
- - *.h \
- - *.hh \
- - *.hxx \
- - *.hpp \
- - *.h++ \
- - *.cs \
- - *.d \
- - *.php \
- - *.php4 \
- - *.php5 \
- - *.phtml \
- - *.inc \
- - *.m \
- - *.markdown \
- - *.md \
- - *.mm \
- - *.dox \
- - *.py \
- - *.pyw \
- - *.f90 \
- - *.f95 \
- - *.f03 \
- - *.f08 \
- - *.f \
- - *.for \
- - *.tcl \
- - *.vhd \
- - *.vhdl \
- - *.ucf \
- - *.qsf
- -
- -# The RECURSIVE tag can be used to specify whether or not subdirectories should
- -# be searched for input files as well.
- -# The default value is: NO.
- -
- -RECURSIVE = YES
- -
- -# The EXCLUDE tag can be used to specify files and/or directories that should be
- -# excluded from the INPUT source files. This way you can easily exclude a
- -# subdirectory from a directory tree whose root is specified with the INPUT tag.
- -#
- -# Note that relative paths are relative to the directory from which doxygen is
- -# run.
- -
- -EXCLUDE = D:\OpenARK\SampleCode
- -
- -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
- -# directories that are symbolic links (a Unix file system feature) are excluded
- -# from the input.
- -# The default value is: NO.
- -
- -EXCLUDE_SYMLINKS = NO
- -
- -# If the value of the INPUT tag contains directories, you can use the
- -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
- -# certain files from those directories.
- -#
- -# Note that the wildcards are matched against the file with absolute path, so to
- -# exclude all test directories for example use the pattern */test/*
- -
- -EXCLUDE_PATTERNS =
- -
- -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
- -# (namespaces, classes, functions, etc.) that should be excluded from the
- -# output. The symbol name can be a fully qualified name, a word, or if the
- -# wildcard * is used, a substring. Examples: ANamespace, AClass,
- -# AClass::ANamespace, ANamespace::*Test
- -#
- -# Note that the wildcards are matched against the file with absolute path, so to
- -# exclude all test directories use the pattern */test/*
- -
- -EXCLUDE_SYMBOLS =
- -
- -# The EXAMPLE_PATH tag can be used to specify one or more files or directories
- -# that contain example code fragments that are included (see the \include
- -# command).
- -
- -EXAMPLE_PATH = D:\OpenARK\SampleCode
- -
- -# If the value of the EXAMPLE_PATH tag contains directories, you can use the
- -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
- -# *.h) to filter out the source-files in the directories. If left blank all
- -# files are included.
- -
- -EXAMPLE_PATTERNS = *
- -
- -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
- -# searched for input files to be used with the \include or \dontinclude commands
- -# irrespective of the value of the RECURSIVE tag.
- -# The default value is: NO.
- -
- -EXAMPLE_RECURSIVE = YES
- -
- -# The IMAGE_PATH tag can be used to specify one or more files or directories
- -# that contain images that are to be included in the documentation (see the
- -# \image command).
- -
- -IMAGE_PATH =
- -
- -# The INPUT_FILTER tag can be used to specify a program that doxygen should
- -# invoke to filter for each input file. Doxygen will invoke the filter program
- -# by executing (via popen()) the command:
- -#
- -# <filter> <input-file>
- -#
- -# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
- -# name of an input file. Doxygen will then use the output that the filter
- -# program writes to standard output. If FILTER_PATTERNS is specified, this tag
- -# will be ignored.
- -#
- -# Note that the filter must not add or remove lines; it is applied before the
- -# code is scanned, but not when the output code is generated. If lines are added
- -# or removed, the anchors will not be placed correctly.
- -#
- -# Note that for custom extensions or not directly supported extensions you also
- -# need to set EXTENSION_MAPPING for the extension otherwise the files are not
- -# properly processed by doxygen.
- -
- -INPUT_FILTER =
- -
- -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
- -# basis. Doxygen will compare the file name with each pattern and apply the
- -# filter if there is a match. The filters are a list of the form: pattern=filter
- -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
- -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
- -# patterns match the file name, INPUT_FILTER is applied.
- -#
- -# Note that for custom extensions or not directly supported extensions you also
- -# need to set EXTENSION_MAPPING for the extension otherwise the files are not
- -# properly processed by doxygen.
- -
- -FILTER_PATTERNS =
- -
- -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
- -# INPUT_FILTER) will also be used to filter the input files that are used for
- -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
- -# The default value is: NO.
- -
- -FILTER_SOURCE_FILES = NO
- -
- -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
- -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
- -# it is also possible to disable source filtering for a specific pattern using
- -# *.ext= (so without naming a filter).
- -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
- -
- -FILTER_SOURCE_PATTERNS =
- -
- -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
- -# is part of the input, its contents will be placed on the main page
- -# (index.html). This can be useful if you have a project on for instance GitHub
- -# and want to reuse the introduction page also for the doxygen output.
- -
- -USE_MDFILE_AS_MAINPAGE =
- -
- -#---------------------------------------------------------------------------
- -# Configuration options related to source browsing
- -#---------------------------------------------------------------------------
- -
- -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
- -# generated. Documented entities will be cross-referenced with these sources.
- -#
- -# Note: To get rid of all source code in the generated output, make sure that
- -# also VERBATIM_HEADERS is set to NO.
- -# The default value is: NO.
- -
- -SOURCE_BROWSER = NO
- -
- -# Setting the INLINE_SOURCES tag to YES will include the body of functions,
- -# classes and enums directly into the documentation.
- -# The default value is: NO.
- -
- -INLINE_SOURCES = NO
- -
- -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
- -# special comment blocks from generated source code fragments. Normal C, C++ and
- -# Fortran comments will always remain visible.
- -# The default value is: YES.
- -
- -STRIP_CODE_COMMENTS = YES
- -
- -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
- -# function all documented functions referencing it will be listed.
- -# The default value is: NO.
- -
- -REFERENCED_BY_RELATION = NO
- -
- -# If the REFERENCES_RELATION tag is set to YES then for each documented function
- -# all documented entities called/used by that function will be listed.
- -# The default value is: NO.
- -
- -REFERENCES_RELATION = NO
- -
- -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
- -# to YES then the hyperlinks from functions in REFERENCES_RELATION and
- -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
- -# link to the documentation.
- -# The default value is: YES.
- -
- -REFERENCES_LINK_SOURCE = YES
- -
- -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
- -# source code will show a tooltip with additional information such as prototype,
- -# brief description and links to the definition and documentation. Since this
- -# will make the HTML file larger and loading of large files a bit slower, you
- -# can opt to disable this feature.
- -# The default value is: YES.
- -# This tag requires that the tag SOURCE_BROWSER is set to YES.
- -
- -SOURCE_TOOLTIPS = YES
- -
- -# If the USE_HTAGS tag is set to YES then the references to source code will
- -# point to the HTML generated by the htags(1) tool instead of doxygen built-in
- -# source browser. The htags tool is part of GNU's global source tagging system
- -# (see http://www.gnu.org/software/global/global.html). You will need version
- -# 4.8.6 or higher.
- -#
- -# To use it do the following:
- -# - Install the latest version of global
- -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
- -# - Make sure the INPUT points to the root of the source tree
- -# - Run doxygen as normal
- -#
- -# Doxygen will invoke htags (and that will in turn invoke gtags), so these
- -# tools must be available from the command line (i.e. in the search path).
- -#
- -# The result: instead of the source browser generated by doxygen, the links to
- -# source code will now point to the output of htags.
- -# The default value is: NO.
- -# This tag requires that the tag SOURCE_BROWSER is set to YES.
- -
- -USE_HTAGS = NO
- -
- -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
- -# verbatim copy of the header file for each class for which an include is
- -# specified. Set to NO to disable this.
- -# See also: Section \class.
- -# The default value is: YES.
- -
- -VERBATIM_HEADERS = YES
- -
- -# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
- -# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
- -# cost of reduced performance. This can be particularly helpful with template
- -# rich C++ code for which doxygen's built-in parser lacks the necessary type
- -# information.
- -# Note: The availability of this option depends on whether or not doxygen was
- -# generated with the -Duse-libclang=ON option for CMake.
- -# The default value is: NO.
- -
- -CLANG_ASSISTED_PARSING = NO
- -
- -# If clang assisted parsing is enabled you can provide the compiler with command
- -# line options that you would normally use when invoking the compiler. Note that
- -# the include paths will already be set by doxygen for the files and directories
- -# specified with INPUT and INCLUDE_PATH.
- -# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
- -
- -CLANG_OPTIONS =
- -
- -#---------------------------------------------------------------------------
- -# Configuration options related to the alphabetical class index
- -#---------------------------------------------------------------------------
- -
- -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
- -# compounds will be generated. Enable this if the project contains a lot of
- -# classes, structs, unions or interfaces.
- -# The default value is: YES.
- -
- -ALPHABETICAL_INDEX = YES
- -
- -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
- -# which the alphabetical index list will be split.
- -# Minimum value: 1, maximum value: 20, default value: 5.
- -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
- -
- -COLS_IN_ALPHA_INDEX = 5
- -
- -# In case all classes in a project start with a common prefix, all classes will
- -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
- -# can be used to specify a prefix (or a list of prefixes) that should be ignored
- -# while generating the index headers.
- -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
- -
- -IGNORE_PREFIX =
- -
- -#---------------------------------------------------------------------------
- -# Configuration options related to the HTML output
- -#---------------------------------------------------------------------------
- -
- -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
- -# The default value is: YES.
- -
- -GENERATE_HTML = YES
- -
- -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
- -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
- -# it.
- -# The default directory is: html.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -HTML_OUTPUT = html
- -
- -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
- -# generated HTML page (for example: .htm, .php, .asp).
- -# The default value is: .html.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -HTML_FILE_EXTENSION = .html
- -
- -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
- -# each generated HTML page. If the tag is left blank doxygen will generate a
- -# standard header.
- -#
- -# To get valid HTML the header file that includes any scripts and style sheets
- -# that doxygen needs, which is dependent on the configuration options used (e.g.
- -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
- -# default header using
- -# doxygen -w html new_header.html new_footer.html new_stylesheet.css
- -# YourConfigFile
- -# and then modify the file new_header.html. See also section "Doxygen usage"
- -# for information on how to generate the default header that doxygen normally
- -# uses.
- -# Note: The header is subject to change so you typically have to regenerate the
- -# default header when upgrading to a newer version of doxygen. For a description
- -# of the possible markers and block names see the documentation.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -HTML_HEADER =
- -
- -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
- -# generated HTML page. If the tag is left blank doxygen will generate a standard
- -# footer. See HTML_HEADER for more information on how to generate a default
- -# footer and what special commands can be used inside the footer. See also
- -# section "Doxygen usage" for information on how to generate the default footer
- -# that doxygen normally uses.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -HTML_FOOTER =
- -
- -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
- -# sheet that is used by each HTML page. It can be used to fine-tune the look of
- -# the HTML output. If left blank doxygen will generate a default style sheet.
- -# See also section "Doxygen usage" for information on how to generate the style
- -# sheet that doxygen normally uses.
- -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
- -# it is more robust and this tag (HTML_STYLESHEET) will in the future become
- -# obsolete.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -HTML_STYLESHEET =
- -
- -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
- -# cascading style sheets that are included after the standard style sheets
- -# created by doxygen. Using this option one can overrule certain style aspects.
- -# This is preferred over using HTML_STYLESHEET since it does not replace the
- -# standard style sheet and is therefore more robust against future updates.
- -# Doxygen will copy the style sheet files to the output directory.
- -# Note: The order of the extra style sheet files is of importance (e.g. the last
- -# style sheet in the list overrules the setting of the previous ones in the
- -# list). For an example see the documentation.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -HTML_EXTRA_STYLESHEET =
- -
- -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
- -# other source files which should be copied to the HTML output directory. Note
- -# that these files will be copied to the base HTML output directory. Use the
- -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
- -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
- -# files will be copied as-is; there are no commands or markers available.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -HTML_EXTRA_FILES =
- -
- -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
- -# will adjust the colors in the style sheet and background images according to
- -# this color. Hue is specified as an angle on a colorwheel, see
- -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
- -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
- -# purple, and 360 is red again.
- -# Minimum value: 0, maximum value: 359, default value: 220.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -HTML_COLORSTYLE_HUE = 220
- -
- -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
- -# in the HTML output. For a value of 0 the output will use grayscales only. A
- -# value of 255 will produce the most vivid colors.
- -# Minimum value: 0, maximum value: 255, default value: 100.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -HTML_COLORSTYLE_SAT = 100
- -
- -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
- -# luminance component of the colors in the HTML output. Values below 100
- -# gradually make the output lighter, whereas values above 100 make the output
- -# darker. The value divided by 100 is the actual gamma applied, so 80 represents
- -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
- -# change the gamma.
- -# Minimum value: 40, maximum value: 240, default value: 80.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -HTML_COLORSTYLE_GAMMA = 80
- -
- -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
- -# page will contain the date and time when the page was generated. Setting this
- -# to YES can help to show when doxygen was last run and thus if the
- -# documentation is up to date.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -HTML_TIMESTAMP = NO
- -
- -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
- -# documentation will contain sections that can be hidden and shown after the
- -# page has loaded.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -HTML_DYNAMIC_SECTIONS = NO
- -
- -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
- -# shown in the various tree structured indices initially; the user can expand
- -# and collapse entries dynamically later on. Doxygen will expand the tree to
- -# such a level that at most the specified number of entries are visible (unless
- -# a fully collapsed tree already exceeds this amount). So setting the number of
- -# entries 1 will produce a full collapsed tree by default. 0 is a special value
- -# representing an infinite number of entries and will result in a full expanded
- -# tree by default.
- -# Minimum value: 0, maximum value: 9999, default value: 100.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -HTML_INDEX_NUM_ENTRIES = 100
- -
- -# If the GENERATE_DOCSET tag is set to YES, additional index files will be
- -# generated that can be used as input for Apple's Xcode 3 integrated development
- -# environment (see: http://developer.apple.com/tools/xcode/), introduced with
- -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
- -# Makefile in the HTML output directory. Running make will produce the docset in
- -# that directory and running make install will install the docset in
- -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
- -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
- -# for more information.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -GENERATE_DOCSET = NO
- -
- -# This tag determines the name of the docset feed. A documentation feed provides
- -# an umbrella under which multiple documentation sets from a single provider
- -# (such as a company or product suite) can be grouped.
- -# The default value is: Doxygen generated docs.
- -# This tag requires that the tag GENERATE_DOCSET is set to YES.
- -
- -DOCSET_FEEDNAME = "Doxygen generated docs"
- -
- -# This tag specifies a string that should uniquely identify the documentation
- -# set bundle. This should be a reverse domain-name style string, e.g.
- -# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
- -# The default value is: org.doxygen.Project.
- -# This tag requires that the tag GENERATE_DOCSET is set to YES.
- -
- -DOCSET_BUNDLE_ID = org.doxygen.Project
- -
- -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
- -# the documentation publisher. This should be a reverse domain-name style
- -# string, e.g. com.mycompany.MyDocSet.documentation.
- -# The default value is: org.doxygen.Publisher.
- -# This tag requires that the tag GENERATE_DOCSET is set to YES.
- -
- -DOCSET_PUBLISHER_ID = org.doxygen.Publisher
- -
- -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
- -# The default value is: Publisher.
- -# This tag requires that the tag GENERATE_DOCSET is set to YES.
- -
- -DOCSET_PUBLISHER_NAME = Publisher
- -
- -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
- -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
- -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
- -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
- -# Windows.
- -#
- -# The HTML Help Workshop contains a compiler that can convert all HTML output
- -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
- -# files are now used as the Windows 98 help format, and will replace the old
- -# Windows help format (.hlp) on all Windows platforms in the future. Compressed
- -# HTML files also contain an index, a table of contents, and you can search for
- -# words in the documentation. The HTML workshop also contains a viewer for
- -# compressed HTML files.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -GENERATE_HTMLHELP = NO
- -
- -# The CHM_FILE tag can be used to specify the file name of the resulting .chm
- -# file. You can add a path in front of the file if the result should not be
- -# written to the html output directory.
- -# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
- -
- -CHM_FILE =
- -
- -# The HHC_LOCATION tag can be used to specify the location (absolute path
- -# including file name) of the HTML help compiler (hhc.exe). If non-empty,
- -# doxygen will try to run the HTML help compiler on the generated index.hhp.
- -# The file has to be specified with full path.
- -# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
- -
- -HHC_LOCATION =
- -
- -# The GENERATE_CHI flag controls if a separate .chi index file is generated
- -# (YES) or that it should be included in the master .chm file (NO).
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
- -
- -GENERATE_CHI = NO
- -
- -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
- -# and project file content.
- -# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
- -
- -CHM_INDEX_ENCODING =
- -
- -# The BINARY_TOC flag controls whether a binary table of contents is generated
- -# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
- -# enables the Previous and Next buttons.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
- -
- -BINARY_TOC = NO
- -
- -# The TOC_EXPAND flag can be set to YES to add extra items for group members to
- -# the table of contents of the HTML help documentation and to the tree view.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
- -
- -TOC_EXPAND = NO
- -
- -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
- -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
- -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
- -# (.qch) of the generated HTML documentation.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -GENERATE_QHP = NO
- -
- -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
- -# the file name of the resulting .qch file. The path specified is relative to
- -# the HTML output folder.
- -# This tag requires that the tag GENERATE_QHP is set to YES.
- -
- -QCH_FILE =
- -
- -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
- -# Project output. For more information please see Qt Help Project / Namespace
- -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
- -# The default value is: org.doxygen.Project.
- -# This tag requires that the tag GENERATE_QHP is set to YES.
- -
- -QHP_NAMESPACE = org.doxygen.Project
- -
- -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
- -# Help Project output. For more information please see Qt Help Project / Virtual
- -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
- -# folders).
- -# The default value is: doc.
- -# This tag requires that the tag GENERATE_QHP is set to YES.
- -
- -QHP_VIRTUAL_FOLDER = doc
- -
- -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
- -# filter to add. For more information please see Qt Help Project / Custom
- -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
- -# filters).
- -# This tag requires that the tag GENERATE_QHP is set to YES.
- -
- -QHP_CUST_FILTER_NAME =
- -
- -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
- -# custom filter to add. For more information please see Qt Help Project / Custom
- -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
- -# filters).
- -# This tag requires that the tag GENERATE_QHP is set to YES.
- -
- -QHP_CUST_FILTER_ATTRS =
- -
- -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
- -# project's filter section matches. Qt Help Project / Filter Attributes (see:
- -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
- -# This tag requires that the tag GENERATE_QHP is set to YES.
- -
- -QHP_SECT_FILTER_ATTRS =
- -
- -# The QHG_LOCATION tag can be used to specify the location of Qt's
- -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
- -# generated .qhp file.
- -# This tag requires that the tag GENERATE_QHP is set to YES.
- -
- -QHG_LOCATION =
- -
- -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
- -# generated, together with the HTML files, they form an Eclipse help plugin. To
- -# install this plugin and make it available under the help contents menu in
- -# Eclipse, the contents of the directory containing the HTML and XML files needs
- -# to be copied into the plugins directory of eclipse. The name of the directory
- -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
- -# After copying Eclipse needs to be restarted before the help appears.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -GENERATE_ECLIPSEHELP = NO
- -
- -# A unique identifier for the Eclipse help plugin. When installing the plugin
- -# the directory name containing the HTML and XML files should also have this
- -# name. Each documentation set should have its own identifier.
- -# The default value is: org.doxygen.Project.
- -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
- -
- -ECLIPSE_DOC_ID = org.doxygen.Project
- -
- -# If you want full control over the layout of the generated HTML pages it might
- -# be necessary to disable the index and replace it with your own. The
- -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
- -# of each HTML page. A value of NO enables the index and the value YES disables
- -# it. Since the tabs in the index contain the same information as the navigation
- -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -DISABLE_INDEX = NO
- -
- -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
- -# structure should be generated to display hierarchical information. If the tag
- -# value is set to YES, a side panel will be generated containing a tree-like
- -# index structure (just like the one that is generated for HTML Help). For this
- -# to work a browser that supports JavaScript, DHTML, CSS and frames is required
- -# (i.e. any modern browser). Windows users are probably better off using the
- -# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
- -# further fine-tune the look of the index. As an example, the default style
- -# sheet generated by doxygen has an example that shows how to put an image at
- -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
- -# the same information as the tab index, you could consider setting
- -# DISABLE_INDEX to YES when enabling this option.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -GENERATE_TREEVIEW = YES
- -
- -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
- -# doxygen will group on one line in the generated HTML documentation.
- -#
- -# Note that a value of 0 will completely suppress the enum values from appearing
- -# in the overview section.
- -# Minimum value: 0, maximum value: 20, default value: 4.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -ENUM_VALUES_PER_LINE = 4
- -
- -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
- -# to set the initial width (in pixels) of the frame in which the tree is shown.
- -# Minimum value: 0, maximum value: 1500, default value: 250.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -TREEVIEW_WIDTH = 250
- -
- -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
- -# external symbols imported via tag files in a separate window.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -EXT_LINKS_IN_WINDOW = NO
- -
- -# Use this tag to change the font size of LaTeX formulas included as images in
- -# the HTML documentation. When you change the font size after a successful
- -# doxygen run you need to manually remove any form_*.png images from the HTML
- -# output directory to force them to be regenerated.
- -# Minimum value: 8, maximum value: 50, default value: 10.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -FORMULA_FONTSIZE = 10
- -
- -# Use the FORMULA_TRANPARENT tag to determine whether or not the images
- -# generated for formulas are transparent PNGs. Transparent PNGs are not
- -# supported properly for IE 6.0, but are supported on all modern browsers.
- -#
- -# Note that when changing this option you need to delete any form_*.png files in
- -# the HTML output directory before the changes have effect.
- -# The default value is: YES.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -FORMULA_TRANSPARENT = YES
- -
- -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
- -# http://www.mathjax.org) which uses client side Javascript for the rendering
- -# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
- -# installed or if you want to formulas look prettier in the HTML output. When
- -# enabled you may also need to install MathJax separately and configure the path
- -# to it using the MATHJAX_RELPATH option.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -USE_MATHJAX = NO
- -
- -# When MathJax is enabled you can set the default output format to be used for
- -# the MathJax output. See the MathJax site (see:
- -# http://docs.mathjax.org/en/latest/output.html) for more details.
- -# Possible values are: HTML-CSS (which is slower, but has the best
- -# compatibility), NativeMML (i.e. MathML) and SVG.
- -# The default value is: HTML-CSS.
- -# This tag requires that the tag USE_MATHJAX is set to YES.
- -
- -MATHJAX_FORMAT = HTML-CSS
- -
- -# When MathJax is enabled you need to specify the location relative to the HTML
- -# output directory using the MATHJAX_RELPATH option. The destination directory
- -# should contain the MathJax.js script. For instance, if the mathjax directory
- -# is located at the same level as the HTML output directory, then
- -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
- -# Content Delivery Network so you can quickly see the result without installing
- -# MathJax. However, it is strongly recommended to install a local copy of
- -# MathJax from http://www.mathjax.org before deployment.
- -# The default value is: http://cdn.mathjax.org/mathjax/latest.
- -# This tag requires that the tag USE_MATHJAX is set to YES.
- -
- -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
- -
- -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
- -# extension names that should be enabled during MathJax rendering. For example
- -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
- -# This tag requires that the tag USE_MATHJAX is set to YES.
- -
- -MATHJAX_EXTENSIONS =
- -
- -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
- -# of code that will be used on startup of the MathJax code. See the MathJax site
- -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
- -# example see the documentation.
- -# This tag requires that the tag USE_MATHJAX is set to YES.
- -
- -MATHJAX_CODEFILE =
- -
- -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
- -# the HTML output. The underlying search engine uses javascript and DHTML and
- -# should work on any modern browser. Note that when using HTML help
- -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
- -# there is already a search function so this one should typically be disabled.
- -# For large projects the javascript based search engine can be slow, then
- -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
- -# search using the keyboard; to jump to the search box use <access key> + S
- -# (what the <access key> is depends on the OS and browser, but it is typically
- -# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
- -# key> to jump into the search results window, the results can be navigated
- -# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
- -# the search. The filter options can be selected when the cursor is inside the
- -# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
- -# to select a filter and <Enter> or <escape> to activate or cancel the filter
- -# option.
- -# The default value is: YES.
- -# This tag requires that the tag GENERATE_HTML is set to YES.
- -
- -SEARCHENGINE = YES
- -
- -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
- -# implemented using a web server instead of a web client using Javascript. There
- -# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
- -# setting. When disabled, doxygen will generate a PHP script for searching and
- -# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
- -# and searching needs to be provided by external tools. See the section
- -# "External Indexing and Searching" for details.
- -# The default value is: NO.
- -# This tag requires that the tag SEARCHENGINE is set to YES.
- -
- -SERVER_BASED_SEARCH = NO
- -
- -# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
- -# script for searching. Instead the search results are written to an XML file
- -# which needs to be processed by an external indexer. Doxygen will invoke an
- -# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
- -# search results.
- -#
- -# Doxygen ships with an example indexer (doxyindexer) and search engine
- -# (doxysearch.cgi) which are based on the open source search engine library
- -# Xapian (see: http://xapian.org/).
- -#
- -# See the section "External Indexing and Searching" for details.
- -# The default value is: NO.
- -# This tag requires that the tag SEARCHENGINE is set to YES.
- -
- -EXTERNAL_SEARCH = NO
- -
- -# The SEARCHENGINE_URL should point to a search engine hosted by a web server
- -# which will return the search results when EXTERNAL_SEARCH is enabled.
- -#
- -# Doxygen ships with an example indexer (doxyindexer) and search engine
- -# (doxysearch.cgi) which are based on the open source search engine library
- -# Xapian (see: http://xapian.org/). See the section "External Indexing and
- -# Searching" for details.
- -# This tag requires that the tag SEARCHENGINE is set to YES.
- -
- -SEARCHENGINE_URL =
- -
- -# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
- -# search data is written to a file for indexing by an external tool. With the
- -# SEARCHDATA_FILE tag the name of this file can be specified.
- -# The default file is: searchdata.xml.
- -# This tag requires that the tag SEARCHENGINE is set to YES.
- -
- -SEARCHDATA_FILE = searchdata.xml
- -
- -# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
- -# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
- -# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
- -# projects and redirect the results back to the right project.
- -# This tag requires that the tag SEARCHENGINE is set to YES.
- -
- -EXTERNAL_SEARCH_ID =
- -
- -# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
- -# projects other than the one defined by this configuration file, but that are
- -# all added to the same external search index. Each project needs to have a
- -# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
- -# to a relative location where the documentation can be found. The format is:
- -# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
- -# This tag requires that the tag SEARCHENGINE is set to YES.
- -
- -EXTRA_SEARCH_MAPPINGS =
- -
- -#---------------------------------------------------------------------------
- -# Configuration options related to the LaTeX output
- -#---------------------------------------------------------------------------
- -
- -# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
- -# The default value is: YES.
- -
- -GENERATE_LATEX = YES
- -
- -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
- -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
- -# it.
- -# The default directory is: latex.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -LATEX_OUTPUT = latex
- -
- -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
- -# invoked.
- -#
- -# Note that when enabling USE_PDFLATEX this option is only used for generating
- -# bitmaps for formulas in the HTML output, but not in the Makefile that is
- -# written to the output directory.
- -# The default file is: latex.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -LATEX_CMD_NAME = latex
- -
- -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
- -# index for LaTeX.
- -# The default file is: makeindex.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -MAKEINDEX_CMD_NAME = makeindex
- -
- -# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
- -# documents. This may be useful for small projects and may help to save some
- -# trees in general.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -COMPACT_LATEX = NO
- -
- -# The PAPER_TYPE tag can be used to set the paper type that is used by the
- -# printer.
- -# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
- -# 14 inches) and executive (7.25 x 10.5 inches).
- -# The default value is: a4.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -PAPER_TYPE = a4
- -
- -# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
- -# that should be included in the LaTeX output. The package can be specified just
- -# by its name or with the correct syntax as to be used with the LaTeX
- -# \usepackage command. To get the times font for instance you can specify :
- -# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
- -# To use the option intlimits with the amsmath package you can specify:
- -# EXTRA_PACKAGES=[intlimits]{amsmath}
- -# If left blank no extra packages will be included.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -EXTRA_PACKAGES =
- -
- -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
- -# generated LaTeX document. The header should contain everything until the first
- -# chapter. If it is left blank doxygen will generate a standard header. See
- -# section "Doxygen usage" for information on how to let doxygen write the
- -# default header to a separate file.
- -#
- -# Note: Only use a user-defined header if you know what you are doing! The
- -# following commands have a special meaning inside the header: $title,
- -# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
- -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
- -# string, for the replacement values of the other commands the user is referred
- -# to HTML_HEADER.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -LATEX_HEADER =
- -
- -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
- -# generated LaTeX document. The footer should contain everything after the last
- -# chapter. If it is left blank doxygen will generate a standard footer. See
- -# LATEX_HEADER for more information on how to generate a default footer and what
- -# special commands can be used inside the footer.
- -#
- -# Note: Only use a user-defined footer if you know what you are doing!
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -LATEX_FOOTER =
- -
- -# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
- -# LaTeX style sheets that are included after the standard style sheets created
- -# by doxygen. Using this option one can overrule certain style aspects. Doxygen
- -# will copy the style sheet files to the output directory.
- -# Note: The order of the extra style sheet files is of importance (e.g. the last
- -# style sheet in the list overrules the setting of the previous ones in the
- -# list).
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -LATEX_EXTRA_STYLESHEET =
- -
- -# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
- -# other source files which should be copied to the LATEX_OUTPUT output
- -# directory. Note that the files will be copied as-is; there are no commands or
- -# markers available.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -LATEX_EXTRA_FILES =
- -
- -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
- -# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
- -# contain links (just like the HTML output) instead of page references. This
- -# makes the output suitable for online browsing using a PDF viewer.
- -# The default value is: YES.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -PDF_HYPERLINKS = YES
- -
- -# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
- -# the PDF file directly from the LaTeX files. Set this option to YES, to get a
- -# higher quality PDF documentation.
- -# The default value is: YES.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -USE_PDFLATEX = YES
- -
- -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
- -# command to the generated LaTeX files. This will instruct LaTeX to keep running
- -# if errors occur, instead of asking the user for help. This option is also used
- -# when generating formulas in HTML.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -LATEX_BATCHMODE = NO
- -
- -# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
- -# index chapters (such as File Index, Compound Index, etc.) in the output.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -LATEX_HIDE_INDICES = NO
- -
- -# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
- -# code with syntax highlighting in the LaTeX output.
- -#
- -# Note that which sources are shown also depends on other settings such as
- -# SOURCE_BROWSER.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -LATEX_SOURCE_CODE = NO
- -
- -# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
- -# bibliography, e.g. plainnat, or ieeetr. See
- -# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
- -# The default value is: plain.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -LATEX_BIB_STYLE = plain
- -
- -# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
- -# page will contain the date and time when the page was generated. Setting this
- -# to NO can help when comparing the output of multiple runs.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_LATEX is set to YES.
- -
- -LATEX_TIMESTAMP = NO
- -
- -#---------------------------------------------------------------------------
- -# Configuration options related to the RTF output
- -#---------------------------------------------------------------------------
- -
- -# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
- -# RTF output is optimized for Word 97 and may not look too pretty with other RTF
- -# readers/editors.
- -# The default value is: NO.
- -
- -GENERATE_RTF = NO
- -
- -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
- -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
- -# it.
- -# The default directory is: rtf.
- -# This tag requires that the tag GENERATE_RTF is set to YES.
- -
- -RTF_OUTPUT = rtf
- -
- -# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
- -# documents. This may be useful for small projects and may help to save some
- -# trees in general.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_RTF is set to YES.
- -
- -COMPACT_RTF = NO
- -
- -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
- -# contain hyperlink fields. The RTF file will contain links (just like the HTML
- -# output) instead of page references. This makes the output suitable for online
- -# browsing using Word or some other Word compatible readers that support those
- -# fields.
- -#
- -# Note: WordPad (write) and others do not support links.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_RTF is set to YES.
- -
- -RTF_HYPERLINKS = NO
- -
- -# Load stylesheet definitions from file. Syntax is similar to doxygen's config
- -# file, i.e. a series of assignments. You only have to provide replacements,
- -# missing definitions are set to their default value.
- -#
- -# See also section "Doxygen usage" for information on how to generate the
- -# default style sheet that doxygen normally uses.
- -# This tag requires that the tag GENERATE_RTF is set to YES.
- -
- -RTF_STYLESHEET_FILE =
- -
- -# Set optional variables used in the generation of an RTF document. Syntax is
- -# similar to doxygen's config file. A template extensions file can be generated
- -# using doxygen -e rtf extensionFile.
- -# This tag requires that the tag GENERATE_RTF is set to YES.
- -
- -RTF_EXTENSIONS_FILE =
- -
- -# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
- -# with syntax highlighting in the RTF output.
- -#
- -# Note that which sources are shown also depends on other settings such as
- -# SOURCE_BROWSER.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_RTF is set to YES.
- -
- -RTF_SOURCE_CODE = NO
- -
- -#---------------------------------------------------------------------------
- -# Configuration options related to the man page output
- -#---------------------------------------------------------------------------
- -
- -# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
- -# classes and files.
- -# The default value is: NO.
- -
- -GENERATE_MAN = NO
- -
- -# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
- -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
- -# it. A directory man3 will be created inside the directory specified by
- -# MAN_OUTPUT.
- -# The default directory is: man.
- -# This tag requires that the tag GENERATE_MAN is set to YES.
- -
- -MAN_OUTPUT = man
- -
- -# The MAN_EXTENSION tag determines the extension that is added to the generated
- -# man pages. In case the manual section does not start with a number, the number
- -# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
- -# optional.
- -# The default value is: .3.
- -# This tag requires that the tag GENERATE_MAN is set to YES.
- -
- -MAN_EXTENSION = .3
- -
- -# The MAN_SUBDIR tag determines the name of the directory created within
- -# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
- -# MAN_EXTENSION with the initial . removed.
- -# This tag requires that the tag GENERATE_MAN is set to YES.
- -
- -MAN_SUBDIR =
- -
- -# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
- -# will generate one additional man file for each entity documented in the real
- -# man page(s). These additional files only source the real man page, but without
- -# them the man command would be unable to find the correct page.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_MAN is set to YES.
- -
- -MAN_LINKS = NO
- -
- -#---------------------------------------------------------------------------
- -# Configuration options related to the XML output
- -#---------------------------------------------------------------------------
- -
- -# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
- -# captures the structure of the code including all documentation.
- -# The default value is: NO.
- -
- -GENERATE_XML = NO
- -
- -# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
- -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
- -# it.
- -# The default directory is: xml.
- -# This tag requires that the tag GENERATE_XML is set to YES.
- -
- -XML_OUTPUT = xml
- -
- -# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
- -# listings (including syntax highlighting and cross-referencing information) to
- -# the XML output. Note that enabling this will significantly increase the size
- -# of the XML output.
- -# The default value is: YES.
- -# This tag requires that the tag GENERATE_XML is set to YES.
- -
- -XML_PROGRAMLISTING = YES
- -
- -#---------------------------------------------------------------------------
- -# Configuration options related to the DOCBOOK output
- -#---------------------------------------------------------------------------
- -
- -# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
- -# that can be used to generate PDF.
- -# The default value is: NO.
- -
- -GENERATE_DOCBOOK = NO
- -
- -# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
- -# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
- -# front of it.
- -# The default directory is: docbook.
- -# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
- -
- -DOCBOOK_OUTPUT = docbook
- -
- -# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
- -# program listings (including syntax highlighting and cross-referencing
- -# information) to the DOCBOOK output. Note that enabling this will significantly
- -# increase the size of the DOCBOOK output.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
- -
- -DOCBOOK_PROGRAMLISTING = NO
- -
- -#---------------------------------------------------------------------------
- -# Configuration options for the AutoGen Definitions output
- -#---------------------------------------------------------------------------
- -
- -# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
- -# AutoGen Definitions (see http://autogen.sf.net) file that captures the
- -# structure of the code including all documentation. Note that this feature is
- -# still experimental and incomplete at the moment.
- -# The default value is: NO.
- -
- -GENERATE_AUTOGEN_DEF = NO
- -
- -#---------------------------------------------------------------------------
- -# Configuration options related to the Perl module output
- -#---------------------------------------------------------------------------
- -
- -# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
- -# file that captures the structure of the code including all documentation.
- -#
- -# Note that this feature is still experimental and incomplete at the moment.
- -# The default value is: NO.
- -
- -GENERATE_PERLMOD = NO
- -
- -# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
- -# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
- -# output from the Perl module output.
- -# The default value is: NO.
- -# This tag requires that the tag GENERATE_PERLMOD is set to YES.
- -
- -PERLMOD_LATEX = NO
- -
- -# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
- -# formatted so it can be parsed by a human reader. This is useful if you want to
- -# understand what is going on. On the other hand, if this tag is set to NO, the
- -# size of the Perl module output will be much smaller and Perl will parse it
- -# just the same.
- -# The default value is: YES.
- -# This tag requires that the tag GENERATE_PERLMOD is set to YES.
- -
- -PERLMOD_PRETTY = YES
- -
- -# The names of the make variables in the generated doxyrules.make file are
- -# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
- -# so different doxyrules.make files included by the same Makefile don't
- -# overwrite each other's variables.
- -# This tag requires that the tag GENERATE_PERLMOD is set to YES.
- -
- -PERLMOD_MAKEVAR_PREFIX =
- -
- -#---------------------------------------------------------------------------
- -# Configuration options related to the preprocessor
- -#---------------------------------------------------------------------------
- -
- -# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
- -# C-preprocessor directives found in the sources and include files.
- -# The default value is: YES.
- -
- -ENABLE_PREPROCESSING = YES
- -
- -# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
- -# in the source code. If set to NO, only conditional compilation will be
- -# performed. Macro expansion can be done in a controlled way by setting
- -# EXPAND_ONLY_PREDEF to YES.
- -# The default value is: NO.
- -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
- -
- -MACRO_EXPANSION = NO
- -
- -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
- -# the macro expansion is limited to the macros specified with the PREDEFINED and
- -# EXPAND_AS_DEFINED tags.
- -# The default value is: NO.
- -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
- -
- -EXPAND_ONLY_PREDEF = NO
- -
- -# If the SEARCH_INCLUDES tag is set to YES, the include files in the
- -# INCLUDE_PATH will be searched if a #include is found.
- -# The default value is: YES.
- -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
- -
- -SEARCH_INCLUDES = YES
- -
- -# The INCLUDE_PATH tag can be used to specify one or more directories that
- -# contain include files that are not input files but should be processed by the
- -# preprocessor.
- -# This tag requires that the tag SEARCH_INCLUDES is set to YES.
- -
- -INCLUDE_PATH =
- -
- -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
- -# patterns (like *.h and *.hpp) to filter out the header-files in the
- -# directories. If left blank, the patterns specified with FILE_PATTERNS will be
- -# used.
- -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
- -
- -INCLUDE_FILE_PATTERNS =
- -
- -# The PREDEFINED tag can be used to specify one or more macro names that are
- -# defined before the preprocessor is started (similar to the -D option of e.g.
- -# gcc). The argument of the tag is a list of macros of the form: name or
- -# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
- -# is assumed. To prevent a macro definition from being undefined via #undef or
- -# recursively expanded use the := operator instead of the = operator.
- -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
- -
- -PREDEFINED =
- -
- -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
- -# tag can be used to specify a list of macro names that should be expanded. The
- -# macro definition that is found in the sources will be used. Use the PREDEFINED
- -# tag if you want to use a different macro definition that overrules the
- -# definition found in the source code.
- -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
- -
- -EXPAND_AS_DEFINED =
- -
- -# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
- -# remove all references to function-like macros that are alone on a line, have
- -# an all uppercase name, and do not end with a semicolon. Such function macros
- -# are typically used for boiler-plate code, and will confuse the parser if not
- -# removed.
- -# The default value is: YES.
- -# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
- -
- -SKIP_FUNCTION_MACROS = YES
- -
- -#---------------------------------------------------------------------------
- -# Configuration options related to external references
- -#---------------------------------------------------------------------------
- -
- -# The TAGFILES tag can be used to specify one or more tag files. For each tag
- -# file the location of the external documentation should be added. The format of
- -# a tag file without this location is as follows:
- -# TAGFILES = file1 file2 ...
- -# Adding location for the tag files is done as follows:
- -# TAGFILES = file1=loc1 "file2 = loc2" ...
- -# where loc1 and loc2 can be relative or absolute paths or URLs. See the
- -# section "Linking to external documentation" for more information about the use
- -# of tag files.
- -# Note: Each tag file must have a unique name (where the name does NOT include
- -# the path). If a tag file is not located in the directory in which doxygen is
- -# run, you must also specify the path to the tagfile here.
- -
- -TAGFILES =
- -
- -# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
- -# tag file that is based on the input files it reads. See section "Linking to
- -# external documentation" for more information about the usage of tag files.
- -
- -GENERATE_TAGFILE =
- -
- -# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
- -# the class index. If set to NO, only the inherited external classes will be
- -# listed.
- -# The default value is: NO.
- -
- -ALLEXTERNALS = NO
- -
- -# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
- -# in the modules index. If set to NO, only the current project's groups will be
- -# listed.
- -# The default value is: YES.
- -
- -EXTERNAL_GROUPS = YES
- -
- -# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
- -# the related pages index. If set to NO, only the current project's pages will
- -# be listed.
- -# The default value is: YES.
- -
- -EXTERNAL_PAGES = YES
- -
- -# The PERL_PATH should be the absolute path and name of the perl script
- -# interpreter (i.e. the result of 'which perl').
- -# The default file (with absolute path) is: /usr/bin/perl.
- -
- -PERL_PATH = /usr/bin/perl
- -
- -#---------------------------------------------------------------------------
- -# Configuration options related to the dot tool
- -#---------------------------------------------------------------------------
- -
- -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
- -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
- -# NO turns the diagrams off. Note that this option also works with HAVE_DOT
- -# disabled, but it is recommended to install and use dot, since it yields more
- -# powerful graphs.
- -# The default value is: YES.
- -
- -CLASS_DIAGRAMS = YES
- -
- -# You can define message sequence charts within doxygen comments using the \msc
- -# command. Doxygen will then run the mscgen tool (see:
- -# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
- -# documentation. The MSCGEN_PATH tag allows you to specify the directory where
- -# the mscgen tool resides. If left empty the tool is assumed to be found in the
- -# default search path.
- -
- -MSCGEN_PATH =
- -
- -# You can include diagrams made with dia in doxygen documentation. Doxygen will
- -# then run dia to produce the diagram and insert it in the documentation. The
- -# DIA_PATH tag allows you to specify the directory where the dia binary resides.
- -# If left empty dia is assumed to be found in the default search path.
- -
- -DIA_PATH =
- -
- -# If set to YES the inheritance and collaboration graphs will hide inheritance
- -# and usage relations if the target is undocumented or is not a class.
- -# The default value is: YES.
- -
- -HIDE_UNDOC_RELATIONS = YES
- -
- -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
- -# available from the path. This tool is part of Graphviz (see:
- -# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
- -# Bell Labs. The other options in this section have no effect if this option is
- -# set to NO
- -# The default value is: NO.
- -
- -HAVE_DOT = NO
- -
- -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
- -# to run in parallel. When set to 0 doxygen will base this on the number of
- -# processors available in the system. You can set it explicitly to a value
- -# larger than 0 to get control over the balance between CPU load and processing
- -# speed.
- -# Minimum value: 0, maximum value: 32, default value: 0.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -DOT_NUM_THREADS = 0
- -
- -# When you want a differently looking font in the dot files that doxygen
- -# generates you can specify the font name using DOT_FONTNAME. You need to make
- -# sure dot is able to find the font, which can be done by putting it in a
- -# standard location or by setting the DOTFONTPATH environment variable or by
- -# setting DOT_FONTPATH to the directory containing the font.
- -# The default value is: Helvetica.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -DOT_FONTNAME = Helvetica
- -
- -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
- -# dot graphs.
- -# Minimum value: 4, maximum value: 24, default value: 10.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -DOT_FONTSIZE = 10
- -
- -# By default doxygen will tell dot to use the default font as specified with
- -# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
- -# the path where dot can find it using this tag.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -DOT_FONTPATH =
- -
- -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
- -# each documented class showing the direct and indirect inheritance relations.
- -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
- -# The default value is: YES.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -CLASS_GRAPH = YES
- -
- -# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
- -# graph for each documented class showing the direct and indirect implementation
- -# dependencies (inheritance, containment, and class references variables) of the
- -# class with other documented classes.
- -# The default value is: YES.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -COLLABORATION_GRAPH = YES
- -
- -# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
- -# groups, showing the direct groups dependencies.
- -# The default value is: YES.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -GROUP_GRAPHS = YES
- -
- -# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
- -# collaboration diagrams in a style similar to the OMG's Unified Modeling
- -# Language.
- -# The default value is: NO.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -UML_LOOK = NO
- -
- -# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
- -# class node. If there are many fields or methods and many nodes the graph may
- -# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
- -# number of items for each type to make the size more manageable. Set this to 0
- -# for no limit. Note that the threshold may be exceeded by 50% before the limit
- -# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
- -# but if the number exceeds 15, the total amount of fields shown is limited to
- -# 10.
- -# Minimum value: 0, maximum value: 100, default value: 10.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -UML_LIMIT_NUM_FIELDS = 10
- -
- -# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
- -# collaboration graphs will show the relations between templates and their
- -# instances.
- -# The default value is: NO.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -TEMPLATE_RELATIONS = NO
- -
- -# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
- -# YES then doxygen will generate a graph for each documented file showing the
- -# direct and indirect include dependencies of the file with other documented
- -# files.
- -# The default value is: YES.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -INCLUDE_GRAPH = YES
- -
- -# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
- -# set to YES then doxygen will generate a graph for each documented file showing
- -# the direct and indirect include dependencies of the file with other documented
- -# files.
- -# The default value is: YES.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -INCLUDED_BY_GRAPH = YES
- -
- -# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
- -# dependency graph for every global function or class method.
- -#
- -# Note that enabling this option will significantly increase the time of a run.
- -# So in most cases it will be better to enable call graphs for selected
- -# functions only using the \callgraph command. Disabling a call graph can be
- -# accomplished by means of the command \hidecallgraph.
- -# The default value is: NO.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -CALL_GRAPH = NO
- -
- -# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
- -# dependency graph for every global function or class method.
- -#
- -# Note that enabling this option will significantly increase the time of a run.
- -# So in most cases it will be better to enable caller graphs for selected
- -# functions only using the \callergraph command. Disabling a caller graph can be
- -# accomplished by means of the command \hidecallergraph.
- -# The default value is: NO.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -CALLER_GRAPH = NO
- -
- -# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
- -# hierarchy of all classes instead of a textual one.
- -# The default value is: YES.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -GRAPHICAL_HIERARCHY = YES
- -
- -# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
- -# dependencies a directory has on other directories in a graphical way. The
- -# dependency relations are determined by the #include relations between the
- -# files in the directories.
- -# The default value is: YES.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -DIRECTORY_GRAPH = YES
- -
- -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
- -# generated by dot. For an explanation of the image formats see the section
- -# output formats in the documentation of the dot tool (Graphviz (see:
- -# http://www.graphviz.org/)).
- -# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
- -# to make the SVG files visible in IE 9+ (other browsers do not have this
- -# requirement).
- -# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
- -# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
- -# png:gdiplus:gdiplus.
- -# The default value is: png.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -DOT_IMAGE_FORMAT = png
- -
- -# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
- -# enable generation of interactive SVG images that allow zooming and panning.
- -#
- -# Note that this requires a modern browser other than Internet Explorer. Tested
- -# and working are Firefox, Chrome, Safari, and Opera.
- -# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
- -# the SVG files visible. Older versions of IE do not have SVG support.
- -# The default value is: NO.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -INTERACTIVE_SVG = NO
- -
- -# The DOT_PATH tag can be used to specify the path where the dot tool can be
- -# found. If left blank, it is assumed the dot tool can be found in the path.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -DOT_PATH =
- -
- -# The DOTFILE_DIRS tag can be used to specify one or more directories that
- -# contain dot files that are included in the documentation (see the \dotfile
- -# command).
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -DOTFILE_DIRS =
- -
- -# The MSCFILE_DIRS tag can be used to specify one or more directories that
- -# contain msc files that are included in the documentation (see the \mscfile
- -# command).
- -
- -MSCFILE_DIRS =
- -
- -# The DIAFILE_DIRS tag can be used to specify one or more directories that
- -# contain dia files that are included in the documentation (see the \diafile
- -# command).
- -
- -DIAFILE_DIRS =
- -
- -# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
- -# path where java can find the plantuml.jar file. If left blank, it is assumed
- -# PlantUML is not used or called during a preprocessing step. Doxygen will
- -# generate a warning when it encounters a \startuml command in this case and
- -# will not generate output for the diagram.
- -
- -PLANTUML_JAR_PATH =
- -
- -# When using plantuml, the specified paths are searched for files specified by
- -# the !include statement in a plantuml block.
- -
- -PLANTUML_INCLUDE_PATH =
- -
- -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
- -# that will be shown in the graph. If the number of nodes in a graph becomes
- -# larger than this value, doxygen will truncate the graph, which is visualized
- -# by representing a node as a red box. Note that doxygen if the number of direct
- -# children of the root node in a graph is already larger than
- -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
- -# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
- -# Minimum value: 0, maximum value: 10000, default value: 50.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -DOT_GRAPH_MAX_NODES = 50
- -
- -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
- -# generated by dot. A depth value of 3 means that only nodes reachable from the
- -# root by following a path via at most 3 edges will be shown. Nodes that lay
- -# further from the root node will be omitted. Note that setting this option to 1
- -# or 2 may greatly reduce the computation time needed for large code bases. Also
- -# note that the size of a graph can be further restricted by
- -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
- -# Minimum value: 0, maximum value: 1000, default value: 0.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -MAX_DOT_GRAPH_DEPTH = 0
- -
- -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
- -# background. This is disabled by default, because dot on Windows does not seem
- -# to support this out of the box.
- -#
- -# Warning: Depending on the platform used, enabling this option may lead to
- -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
- -# read).
- -# The default value is: NO.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -DOT_TRANSPARENT = NO
- -
- -# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
- -# files in one run (i.e. multiple -o and -T options on the command line). This
- -# makes dot run faster, but since only newer versions of dot (>1.8.10) support
- -# this, this feature is disabled by default.
- -# The default value is: NO.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -DOT_MULTI_TARGETS = NO
- -
- -# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
- -# explaining the meaning of the various boxes and arrows in the dot generated
- -# graphs.
- -# The default value is: YES.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -GENERATE_LEGEND = YES
- -
- -# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
- -# files that are used to generate the various graphs.
- -# The default value is: YES.
- -# This tag requires that the tag HAVE_DOT is set to YES.
- -
- -DOT_CLEANUP = YES
- +# Doxyfile 1.8.12
- +
- +# This file describes the settings to be used by the documentation system
- +# doxygen (www.doxygen.org) for a project.
- +#
- +# All text after a double hash (##) is considered a comment and is placed in
- +# front of the TAG it is preceding.
- +#
- +# All text after a single hash (#) is considered a comment and will be ignored.
- +# The format is:
- +# TAG = value [value, ...]
- +# For lists, items can also be appended using:
- +# TAG += value [value, ...]
- +# Values that contain spaces should be placed between quotes (\" \").
- +
- +#---------------------------------------------------------------------------
- +# Project related configuration options
- +#---------------------------------------------------------------------------
- +
- +# This tag specifies the encoding used for all characters in the config file
- +# that follow. The default is UTF-8 which is also the encoding used for all text
- +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
- +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
- +# for the list of possible encodings.
- +# The default value is: UTF-8.
- +
- +DOXYFILE_ENCODING = UTF-8
- +
- +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
- +# double-quotes, unless you are using Doxywizard) that should identify the
- +# project for which the documentation is generated. This name is used in the
- +# title of most generated pages and in a few other places.
- +# The default value is: My Project.
- +
- +PROJECT_NAME = "Open Augmented Reality Kit (OpenARK)"
- +
- +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
- +# could be handy for archiving the generated documentation or if some version
- +# control system is used.
- +
- +PROJECT_NUMBER = 0.8
- +
- +# Using the PROJECT_BRIEF tag one can provide an optional one line description
- +# for a project that appears at the top of each page and should give viewer a
- +# quick idea about the purpose of the project. Keep the description short.
- +
- +PROJECT_BRIEF = "Open-source wearable augmented reality (AR) system founded at UC Berkeley in 2016"
- +
- +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
- +# in the documentation. The maximum height of the logo should not exceed 55
- +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
- +# the logo to the output directory.
- +
- +PROJECT_LOGO =
- +
- +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
- +# into which the generated documentation will be written. If a relative path is
- +# entered, it will be relative to the location where doxygen was started. If
- +# left blank the current directory will be used.
- +
- +OUTPUT_DIRECTORY = D:\OpenARK-Documentation\0.8
- +
- +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
- +# directories (in 2 levels) under the output directory of each output format and
- +# will distribute the generated files over these directories. Enabling this
- +# option can be useful when feeding doxygen a huge amount of source files, where
- +# putting all generated files in the same directory would otherwise causes
- +# performance problems for the file system.
- +# The default value is: NO.
- +
- +CREATE_SUBDIRS = NO
- +
- +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
- +# characters to appear in the names of generated files. If set to NO, non-ASCII
- +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
- +# U+3044.
- +# The default value is: NO.
- +
- +ALLOW_UNICODE_NAMES = NO
- +
- +# The OUTPUT_LANGUAGE tag is used to specify the language in which all
- +# documentation generated by doxygen is written. Doxygen will use this
- +# information to generate all constant output in the proper language.
- +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
- +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
- +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
- +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
- +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
- +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
- +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
- +# Ukrainian and Vietnamese.
- +# The default value is: English.
- +
- +OUTPUT_LANGUAGE = English
- +
- +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
- +# descriptions after the members that are listed in the file and class
- +# documentation (similar to Javadoc). Set to NO to disable this.
- +# The default value is: YES.
- +
- +BRIEF_MEMBER_DESC = YES
- +
- +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
- +# description of a member or function before the detailed description
- +#
- +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
- +# brief descriptions will be completely suppressed.
- +# The default value is: YES.
- +
- +REPEAT_BRIEF = YES
- +
- +# This tag implements a quasi-intelligent brief description abbreviator that is
- +# used to form the text in various listings. Each string in this list, if found
- +# as the leading text of the brief description, will be stripped from the text
- +# and the result, after processing the whole list, is used as the annotated
- +# text. Otherwise, the brief description is used as-is. If left blank, the
- +# following values are used ($name is automatically replaced with the name of
- +# the entity):The $name class, The $name widget, The $name file, is, provides,
- +# specifies, contains, represents, a, an and the.
- +
- +ABBREVIATE_BRIEF = "The $name class" \
- + "The $name widget" \
- + "The $name file" \
- + is \
- + provides \
- + specifies \
- + contains \
- + represents \
- + a \
- + an \
- + the
- +
- +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
- +# doxygen will generate a detailed section even if there is only a brief
- +# description.
- +# The default value is: NO.
- +
- +ALWAYS_DETAILED_SEC = NO
- +
- +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
- +# inherited members of a class in the documentation of that class as if those
- +# members were ordinary class members. Constructors, destructors and assignment
- +# operators of the base classes will not be shown.
- +# The default value is: NO.
- +
- +INLINE_INHERITED_MEMB = NO
- +
- +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
- +# before files name in the file list and in the header files. If set to NO the
- +# shortest path that makes the file name unique will be used
- +# The default value is: YES.
- +
- +FULL_PATH_NAMES = NO
- +
- +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
- +# Stripping is only done if one of the specified strings matches the left-hand
- +# part of the path. The tag can be used to show relative paths in the file list.
- +# If left blank the directory from which doxygen is run is used as the path to
- +# strip.
- +#
- +# Note that you can specify absolute paths here, but also relative paths, which
- +# will be relative from the directory where doxygen is started.
- +# This tag requires that the tag FULL_PATH_NAMES is set to YES.
- +
- +STRIP_FROM_PATH =
- +
- +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
- +# path mentioned in the documentation of a class, which tells the reader which
- +# header file to include in order to use a class. If left blank only the name of
- +# the header file containing the class definition is used. Otherwise one should
- +# specify the list of include paths that are normally passed to the compiler
- +# using the -I flag.
- +
- +STRIP_FROM_INC_PATH =
- +
- +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
- +# less readable) file names. This can be useful is your file systems doesn't
- +# support long names like on DOS, Mac, or CD-ROM.
- +# The default value is: NO.
- +
- +SHORT_NAMES = NO
- +
- +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
- +# first line (until the first dot) of a Javadoc-style comment as the brief
- +# description. If set to NO, the Javadoc-style will behave just like regular Qt-
- +# style comments (thus requiring an explicit @brief command for a brief
- +# description.)
- +# The default value is: NO.
- +
- +JAVADOC_AUTOBRIEF = YES
- +
- +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
- +# line (until the first dot) of a Qt-style comment as the brief description. If
- +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
- +# requiring an explicit \brief command for a brief description.)
- +# The default value is: NO.
- +
- +QT_AUTOBRIEF = NO
- +
- +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
- +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
- +# a brief description. This used to be the default behavior. The new default is
- +# to treat a multi-line C++ comment block as a detailed description. Set this
- +# tag to YES if you prefer the old behavior instead.
- +#
- +# Note that setting this tag to YES also means that rational rose comments are
- +# not recognized any more.
- +# The default value is: NO.
- +
- +MULTILINE_CPP_IS_BRIEF = NO
- +
- +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
- +# documentation from any documented member that it re-implements.
- +# The default value is: YES.
- +
- +INHERIT_DOCS = YES
- +
- +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
- +# page for each member. If set to NO, the documentation of a member will be part
- +# of the file/class/namespace that contains it.
- +# The default value is: NO.
- +
- +SEPARATE_MEMBER_PAGES = NO
- +
- +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
- +# uses this value to replace tabs by spaces in code fragments.
- +# Minimum value: 1, maximum value: 16, default value: 4.
- +
- +TAB_SIZE = 4
- +
- +# This tag can be used to specify a number of aliases that act as commands in
- +# the documentation. An alias has the form:
- +# name=value
- +# For example adding
- +# "sideeffect=@par Side Effects:\n"
- +# will allow you to put the command \sideeffect (or @sideeffect) in the
- +# documentation, which will result in a user-defined paragraph with heading
- +# "Side Effects:". You can put \n's in the value part of an alias to insert
- +# newlines.
- +
- +ALIASES =
- +
- +# This tag can be used to specify a number of word-keyword mappings (TCL only).
- +# A mapping has the form "name=value". For example adding "class=itcl::class"
- +# will allow you to use the command class in the itcl::class meaning.
- +
- +TCL_SUBST =
- +
- +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
- +# only. Doxygen will then generate output that is more tailored for C. For
- +# instance, some of the names that are used will be different. The list of all
- +# members will be omitted, etc.
- +# The default value is: NO.
- +
- +OPTIMIZE_OUTPUT_FOR_C = NO
- +
- +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
- +# Python sources only. Doxygen will then generate output that is more tailored
- +# for that language. For instance, namespaces will be presented as packages,
- +# qualified scopes will look different, etc.
- +# The default value is: NO.
- +
- +OPTIMIZE_OUTPUT_JAVA = NO
- +
- +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
- +# sources. Doxygen will then generate output that is tailored for Fortran.
- +# The default value is: NO.
- +
- +OPTIMIZE_FOR_FORTRAN = NO
- +
- +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
- +# sources. Doxygen will then generate output that is tailored for VHDL.
- +# The default value is: NO.
- +
- +OPTIMIZE_OUTPUT_VHDL = NO
- +
- +# Doxygen selects the parser to use depending on the extension of the files it
- +# parses. With this tag you can assign which parser to use for a given
- +# extension. Doxygen has a built-in mapping, but you can override or extend it
- +# using this tag. The format is ext=language, where ext is a file extension, and
- +# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
- +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
- +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
- +# Fortran. In the later case the parser tries to guess whether the code is fixed
- +# or free formatted code, this is the default for Fortran type files), VHDL. For
- +# instance to make doxygen treat .inc files as Fortran files (default is PHP),
- +# and .f files as C (default is Fortran), use: inc=Fortran f=C.
- +#
- +# Note: For files without extension you can use no_extension as a placeholder.
- +#
- +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
- +# the files are not read by doxygen.
- +
- +EXTENSION_MAPPING =
- +
- +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
- +# according to the Markdown format, which allows for more readable
- +# documentation. See http://daringfireball.net/projects/markdown/ for details.
- +# The output of markdown processing is further processed by doxygen, so you can
- +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
- +# case of backward compatibilities issues.
- +# The default value is: YES.
- +
- +MARKDOWN_SUPPORT = YES
- +
- +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
- +# to that level are automatically included in the table of contents, even if
- +# they do not have an id attribute.
- +# Note: This feature currently applies only to Markdown headings.
- +# Minimum value: 0, maximum value: 99, default value: 0.
- +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
- +
- +TOC_INCLUDE_HEADINGS = 0
- +
- +# When enabled doxygen tries to link words that correspond to documented
- +# classes, or namespaces to their corresponding documentation. Such a link can
- +# be prevented in individual cases by putting a % sign in front of the word or
- +# globally by setting AUTOLINK_SUPPORT to NO.
- +# The default value is: YES.
- +
- +AUTOLINK_SUPPORT = YES
- +
- +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
- +# to include (a tag file for) the STL sources as input, then you should set this
- +# tag to YES in order to let doxygen match functions declarations and
- +# definitions whose arguments contain STL classes (e.g. func(std::string);
- +# versus func(std::string) {}). This also make the inheritance and collaboration
- +# diagrams that involve STL classes more complete and accurate.
- +# The default value is: NO.
- +
- +BUILTIN_STL_SUPPORT = NO
- +
- +# If you use Microsoft's C++/CLI language, you should set this option to YES to
- +# enable parsing support.
- +# The default value is: NO.
- +
- +CPP_CLI_SUPPORT = NO
- +
- +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
- +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
- +# will parse them like normal C++ but will assume all classes use public instead
- +# of private inheritance when no explicit protection keyword is present.
- +# The default value is: NO.
- +
- +SIP_SUPPORT = NO
- +
- +# For Microsoft's IDL there are propget and propput attributes to indicate
- +# getter and setter methods for a property. Setting this option to YES will make
- +# doxygen to replace the get and set methods by a property in the documentation.
- +# This will only work if the methods are indeed getting or setting a simple
- +# type. If this is not the case, or you want to show the methods anyway, you
- +# should set this option to NO.
- +# The default value is: YES.
- +
- +IDL_PROPERTY_SUPPORT = YES
- +
- +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
- +# tag is set to YES then doxygen will reuse the documentation of the first
- +# member in the group (if any) for the other members of the group. By default
- +# all members of a group must be documented explicitly.
- +# The default value is: NO.
- +
- +DISTRIBUTE_GROUP_DOC = NO
- +
- +# If one adds a struct or class to a group and this option is enabled, then also
- +# any nested class or struct is added to the same group. By default this option
- +# is disabled and one has to add nested compounds explicitly via \ingroup.
- +# The default value is: NO.
- +
- +GROUP_NESTED_COMPOUNDS = NO
- +
- +# Set the SUBGROUPING tag to YES to allow class member groups of the same type
- +# (for instance a group of public functions) to be put as a subgroup of that
- +# type (e.g. under the Public Functions section). Set it to NO to prevent
- +# subgrouping. Alternatively, this can be done per class using the
- +# \nosubgrouping command.
- +# The default value is: YES.
- +
- +SUBGROUPING = YES
- +
- +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
- +# are shown inside the group in which they are included (e.g. using \ingroup)
- +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
- +# and RTF).
- +#
- +# Note that this feature does not work in combination with
- +# SEPARATE_MEMBER_PAGES.
- +# The default value is: NO.
- +
- +INLINE_GROUPED_CLASSES = NO
- +
- +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
- +# with only public data fields or simple typedef fields will be shown inline in
- +# the documentation of the scope in which they are defined (i.e. file,
- +# namespace, or group documentation), provided this scope is documented. If set
- +# to NO, structs, classes, and unions are shown on a separate page (for HTML and
- +# Man pages) or section (for LaTeX and RTF).
- +# The default value is: NO.
- +
- +INLINE_SIMPLE_STRUCTS = NO
- +
- +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
- +# enum is documented as struct, union, or enum with the name of the typedef. So
- +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
- +# with name TypeT. When disabled the typedef will appear as a member of a file,
- +# namespace, or class. And the struct will be named TypeS. This can typically be
- +# useful for C code in case the coding convention dictates that all compound
- +# types are typedef'ed and only the typedef is referenced, never the tag name.
- +# The default value is: NO.
- +
- +TYPEDEF_HIDES_STRUCT = NO
- +
- +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
- +# cache is used to resolve symbols given their name and scope. Since this can be
- +# an expensive process and often the same symbol appears multiple times in the
- +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
- +# doxygen will become slower. If the cache is too large, memory is wasted. The
- +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
- +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
- +# symbols. At the end of a run doxygen will report the cache usage and suggest
- +# the optimal cache size from a speed point of view.
- +# Minimum value: 0, maximum value: 9, default value: 0.
- +
- +LOOKUP_CACHE_SIZE = 0
- +
- +#---------------------------------------------------------------------------
- +# Build related configuration options
- +#---------------------------------------------------------------------------
- +
- +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
- +# documentation are documented, even if no documentation was available. Private
- +# class members and static file members will be hidden unless the
- +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
- +# Note: This will also disable the warnings about undocumented members that are
- +# normally produced when WARNINGS is set to YES.
- +# The default value is: NO.
- +
- +EXTRACT_ALL = YES
- +
- +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
- +# be included in the documentation.
- +# The default value is: NO.
- +
- +EXTRACT_PRIVATE = YES
- +
- +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
- +# scope will be included in the documentation.
- +# The default value is: NO.
- +
- +EXTRACT_PACKAGE = NO
- +
- +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
- +# included in the documentation.
- +# The default value is: NO.
- +
- +EXTRACT_STATIC = YES
- +
- +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
- +# locally in source files will be included in the documentation. If set to NO,
- +# only classes defined in header files are included. Does not have any effect
- +# for Java sources.
- +# The default value is: YES.
- +
- +EXTRACT_LOCAL_CLASSES = YES
- +
- +# This flag is only useful for Objective-C code. If set to YES, local methods,
- +# which are defined in the implementation section but not in the interface are
- +# included in the documentation. If set to NO, only methods in the interface are
- +# included.
- +# The default value is: NO.
- +
- +EXTRACT_LOCAL_METHODS = NO
- +
- +# If this flag is set to YES, the members of anonymous namespaces will be
- +# extracted and appear in the documentation as a namespace called
- +# 'anonymous_namespace{file}', where file will be replaced with the base name of
- +# the file that contains the anonymous namespace. By default anonymous namespace
- +# are hidden.
- +# The default value is: NO.
- +
- +EXTRACT_ANON_NSPACES = NO
- +
- +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
- +# undocumented members inside documented classes or files. If set to NO these
- +# members will be included in the various overviews, but no documentation
- +# section is generated. This option has no effect if EXTRACT_ALL is enabled.
- +# The default value is: NO.
- +
- +HIDE_UNDOC_MEMBERS = NO
- +
- +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
- +# undocumented classes that are normally visible in the class hierarchy. If set
- +# to NO, these classes will be included in the various overviews. This option
- +# has no effect if EXTRACT_ALL is enabled.
- +# The default value is: NO.
- +
- +HIDE_UNDOC_CLASSES = NO
- +
- +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
- +# (class|struct|union) declarations. If set to NO, these declarations will be
- +# included in the documentation.
- +# The default value is: NO.
- +
- +HIDE_FRIEND_COMPOUNDS = NO
- +
- +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
- +# documentation blocks found inside the body of a function. If set to NO, these
- +# blocks will be appended to the function's detailed documentation block.
- +# The default value is: NO.
- +
- +HIDE_IN_BODY_DOCS = NO
- +
- +# The INTERNAL_DOCS tag determines if documentation that is typed after a
- +# \internal command is included. If the tag is set to NO then the documentation
- +# will be excluded. Set it to YES to include the internal documentation.
- +# The default value is: NO.
- +
- +INTERNAL_DOCS = NO
- +
- +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
- +# names in lower-case letters. If set to YES, upper-case letters are also
- +# allowed. This is useful if you have classes or files whose names only differ
- +# in case and if your file system supports case sensitive file names. Windows
- +# and Mac users are advised to set this option to NO.
- +# The default value is: system dependent.
- +
- +CASE_SENSE_NAMES = NO
- +
- +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
- +# their full class and namespace scopes in the documentation. If set to YES, the
- +# scope will be hidden.
- +# The default value is: NO.
- +
- +HIDE_SCOPE_NAMES = NO
- +
- +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
- +# append additional text to a page's title, such as Class Reference. If set to
- +# YES the compound reference will be hidden.
- +# The default value is: NO.
- +
- +HIDE_COMPOUND_REFERENCE= NO
- +
- +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
- +# the files that are included by a file in the documentation of that file.
- +# The default value is: YES.
- +
- +SHOW_INCLUDE_FILES = YES
- +
- +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
- +# grouped member an include statement to the documentation, telling the reader
- +# which file to include in order to use the member.
- +# The default value is: NO.
- +
- +SHOW_GROUPED_MEMB_INC = NO
- +
- +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
- +# files with double quotes in the documentation rather than with sharp brackets.
- +# The default value is: NO.
- +
- +FORCE_LOCAL_INCLUDES = NO
- +
- +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
- +# documentation for inline members.
- +# The default value is: YES.
- +
- +INLINE_INFO = YES
- +
- +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
- +# (detailed) documentation of file and class members alphabetically by member
- +# name. If set to NO, the members will appear in declaration order.
- +# The default value is: YES.
- +
- +SORT_MEMBER_DOCS = YES
- +
- +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
- +# descriptions of file, namespace and class members alphabetically by member
- +# name. If set to NO, the members will appear in declaration order. Note that
- +# this will also influence the order of the classes in the class list.
- +# The default value is: NO.
- +
- +SORT_BRIEF_DOCS = NO
- +
- +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
- +# (brief and detailed) documentation of class members so that constructors and
- +# destructors are listed first. If set to NO the constructors will appear in the
- +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
- +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
- +# member documentation.
- +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
- +# detailed member documentation.
- +# The default value is: NO.
- +
- +SORT_MEMBERS_CTORS_1ST = NO
- +
- +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
- +# of group names into alphabetical order. If set to NO the group names will
- +# appear in their defined order.
- +# The default value is: NO.
- +
- +SORT_GROUP_NAMES = NO
- +
- +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
- +# fully-qualified names, including namespaces. If set to NO, the class list will
- +# be sorted only by class name, not including the namespace part.
- +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
- +# Note: This option applies only to the class list, not to the alphabetical
- +# list.
- +# The default value is: NO.
- +
- +SORT_BY_SCOPE_NAME = NO
- +
- +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
- +# type resolution of all parameters of a function it will reject a match between
- +# the prototype and the implementation of a member function even if there is
- +# only one candidate or it is obvious which candidate to choose by doing a
- +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
- +# accept a match between prototype and implementation in such cases.
- +# The default value is: NO.
- +
- +STRICT_PROTO_MATCHING = NO
- +
- +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
- +# list. This list is created by putting \todo commands in the documentation.
- +# The default value is: YES.
- +
- +GENERATE_TODOLIST = YES
- +
- +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
- +# list. This list is created by putting \test commands in the documentation.
- +# The default value is: YES.
- +
- +GENERATE_TESTLIST = YES
- +
- +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
- +# list. This list is created by putting \bug commands in the documentation.
- +# The default value is: YES.
- +
- +GENERATE_BUGLIST = YES
- +
- +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
- +# the deprecated list. This list is created by putting \deprecated commands in
- +# the documentation.
- +# The default value is: YES.
- +
- +GENERATE_DEPRECATEDLIST= YES
- +
- +# The ENABLED_SECTIONS tag can be used to enable conditional documentation
- +# sections, marked by \if <section_label> ... \endif and \cond <section_label>
- +# ... \endcond blocks.
- +
- +ENABLED_SECTIONS =
- +
- +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
- +# initial value of a variable or macro / define can have for it to appear in the
- +# documentation. If the initializer consists of more lines than specified here
- +# it will be hidden. Use a value of 0 to hide initializers completely. The
- +# appearance of the value of individual variables and macros / defines can be
- +# controlled using \showinitializer or \hideinitializer command in the
- +# documentation regardless of this setting.
- +# Minimum value: 0, maximum value: 10000, default value: 30.
- +
- +MAX_INITIALIZER_LINES = 30
- +
- +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
- +# the bottom of the documentation of classes and structs. If set to YES, the
- +# list will mention the files that were used to generate the documentation.
- +# The default value is: YES.
- +
- +SHOW_USED_FILES = YES
- +
- +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
- +# will remove the Files entry from the Quick Index and from the Folder Tree View
- +# (if specified).
- +# The default value is: YES.
- +
- +SHOW_FILES = YES
- +
- +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
- +# page. This will remove the Namespaces entry from the Quick Index and from the
- +# Folder Tree View (if specified).
- +# The default value is: YES.
- +
- +SHOW_NAMESPACES = YES
- +
- +# The FILE_VERSION_FILTER tag can be used to specify a program or script that
- +# doxygen should invoke to get the current version for each file (typically from
- +# the version control system). Doxygen will invoke the program by executing (via
- +# popen()) the command command input-file, where command is the value of the
- +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
- +# by doxygen. Whatever the program writes to standard output is used as the file
- +# version. For an example see the documentation.
- +
- +FILE_VERSION_FILTER =
- +
- +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
- +# by doxygen. The layout file controls the global structure of the generated
- +# output files in an output format independent way. To create the layout file
- +# that represents doxygen's defaults, run doxygen with the -l option. You can
- +# optionally specify a file name after the option, if omitted DoxygenLayout.xml
- +# will be used as the name of the layout file.
- +#
- +# Note that if you run doxygen from a directory containing a file called
- +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
- +# tag is left empty.
- +
- +LAYOUT_FILE =
- +
- +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
- +# the reference definitions. This must be a list of .bib files. The .bib
- +# extension is automatically appended if omitted. This requires the bibtex tool
- +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
- +# For LaTeX the style of the bibliography can be controlled using
- +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
- +# search path. See also \cite for info how to create references.
- +
- +CITE_BIB_FILES =
- +
- +#---------------------------------------------------------------------------
- +# Configuration options related to warning and progress messages
- +#---------------------------------------------------------------------------
- +
- +# The QUIET tag can be used to turn on/off the messages that are generated to
- +# standard output by doxygen. If QUIET is set to YES this implies that the
- +# messages are off.
- +# The default value is: NO.
- +
- +QUIET = NO
- +
- +# The WARNINGS tag can be used to turn on/off the warning messages that are
- +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
- +# this implies that the warnings are on.
- +#
- +# Tip: Turn warnings on while writing the documentation.
- +# The default value is: YES.
- +
- +WARNINGS = YES
- +
- +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
- +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
- +# will automatically be disabled.
- +# The default value is: YES.
- +
- +WARN_IF_UNDOCUMENTED = YES
- +
- +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
- +# potential errors in the documentation, such as not documenting some parameters
- +# in a documented function, or documenting parameters that don't exist or using
- +# markup commands wrongly.
- +# The default value is: YES.
- +
- +WARN_IF_DOC_ERROR = YES
- +
- +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
- +# are documented, but have no documentation for their parameters or return
- +# value. If set to NO, doxygen will only warn about wrong or incomplete
- +# parameter documentation, but not about the absence of documentation.
- +# The default value is: NO.
- +
- +WARN_NO_PARAMDOC = NO
- +
- +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
- +# a warning is encountered.
- +# The default value is: NO.
- +
- +WARN_AS_ERROR = NO
- +
- +# The WARN_FORMAT tag determines the format of the warning messages that doxygen
- +# can produce. The string should contain the $file, $line, and $text tags, which
- +# will be replaced by the file and line number from which the warning originated
- +# and the warning text. Optionally the format may contain $version, which will
- +# be replaced by the version of the file (if it could be obtained via
- +# FILE_VERSION_FILTER)
- +# The default value is: $file:$line: $text.
- +
- +WARN_FORMAT = "$file:$line: $text"
- +
- +# The WARN_LOGFILE tag can be used to specify a file to which warning and error
- +# messages should be written. If left blank the output is written to standard
- +# error (stderr).
- +
- +WARN_LOGFILE =
- +
- +#---------------------------------------------------------------------------
- +# Configuration options related to the input files
- +#---------------------------------------------------------------------------
- +
- +# The INPUT tag is used to specify the files and/or directories that contain
- +# documented source files. You may enter file names like myfile.cpp or
- +# directories like /usr/src/myproject. Separate the files or directories with
- +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
- +# Note: If this tag is empty the current directory is searched.
- +
- +INPUT = D:\OpenARK
- +
- +# This tag can be used to specify the character encoding of the source files
- +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
- +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
- +# documentation (see: http://www.gnu.org/software/libiconv) for the list of
- +# possible encodings.
- +# The default value is: UTF-8.
- +
- +INPUT_ENCODING = UTF-8
- +
- +# If the value of the INPUT tag contains directories, you can use the
- +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
- +# *.h) to filter out the source-files in the directories.
- +#
- +# Note that for custom extensions or not directly supported extensions you also
- +# need to set EXTENSION_MAPPING for the extension otherwise the files are not
- +# read by doxygen.
- +#
- +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
- +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
- +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
- +# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
- +# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
- +
- +FILE_PATTERNS = *.c \
- + *.cc \
- + *.cxx \
- + *.cpp \
- + *.c++ \
- + *.java \
- + *.ii \
- + *.ixx \
- + *.ipp \
- + *.i++ \
- + *.inl \
- + *.idl \
- + *.ddl \
- + *.odl \
- + *.h \
- + *.hh \
- + *.hxx \
- + *.hpp \
- + *.h++ \
- + *.cs \
- + *.d \
- + *.php \
- + *.php4 \
- + *.php5 \
- + *.phtml \
- + *.inc \
- + *.m \
- + *.markdown \
- + *.md \
- + *.mm \
- + *.dox \
- + *.py \
- + *.pyw \
- + *.f90 \
- + *.f95 \
- + *.f03 \
- + *.f08 \
- + *.f \
- + *.for \
- + *.tcl \
- + *.vhd \
- + *.vhdl \
- + *.ucf \
- + *.qsf
- +
- +# The RECURSIVE tag can be used to specify whether or not subdirectories should
- +# be searched for input files as well.
- +# The default value is: NO.
- +
- +RECURSIVE = YES
- +
- +# The EXCLUDE tag can be used to specify files and/or directories that should be
- +# excluded from the INPUT source files. This way you can easily exclude a
- +# subdirectory from a directory tree whose root is specified with the INPUT tag.
- +#
- +# Note that relative paths are relative to the directory from which doxygen is
- +# run.
- +
- +EXCLUDE = D:\OpenARK\SampleCode
- +
- +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
- +# directories that are symbolic links (a Unix file system feature) are excluded
- +# from the input.
- +# The default value is: NO.
- +
- +EXCLUDE_SYMLINKS = NO
- +
- +# If the value of the INPUT tag contains directories, you can use the
- +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
- +# certain files from those directories.
- +#
- +# Note that the wildcards are matched against the file with absolute path, so to
- +# exclude all test directories for example use the pattern */test/*
- +
- +EXCLUDE_PATTERNS =
- +
- +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
- +# (namespaces, classes, functions, etc.) that should be excluded from the
- +# output. The symbol name can be a fully qualified name, a word, or if the
- +# wildcard * is used, a substring. Examples: ANamespace, AClass,
- +# AClass::ANamespace, ANamespace::*Test
- +#
- +# Note that the wildcards are matched against the file with absolute path, so to
- +# exclude all test directories use the pattern */test/*
- +
- +EXCLUDE_SYMBOLS =
- +
- +# The EXAMPLE_PATH tag can be used to specify one or more files or directories
- +# that contain example code fragments that are included (see the \include
- +# command).
- +
- +EXAMPLE_PATH = D:\OpenARK\SampleCode
- +
- +# If the value of the EXAMPLE_PATH tag contains directories, you can use the
- +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
- +# *.h) to filter out the source-files in the directories. If left blank all
- +# files are included.
- +
- +EXAMPLE_PATTERNS = *
- +
- +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
- +# searched for input files to be used with the \include or \dontinclude commands
- +# irrespective of the value of the RECURSIVE tag.
- +# The default value is: NO.
- +
- +EXAMPLE_RECURSIVE = YES
- +
- +# The IMAGE_PATH tag can be used to specify one or more files or directories
- +# that contain images that are to be included in the documentation (see the
- +# \image command).
- +
- +IMAGE_PATH =
- +
- +# The INPUT_FILTER tag can be used to specify a program that doxygen should
- +# invoke to filter for each input file. Doxygen will invoke the filter program
- +# by executing (via popen()) the command:
- +#
- +# <filter> <input-file>
- +#
- +# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
- +# name of an input file. Doxygen will then use the output that the filter
- +# program writes to standard output. If FILTER_PATTERNS is specified, this tag
- +# will be ignored.
- +#
- +# Note that the filter must not add or remove lines; it is applied before the
- +# code is scanned, but not when the output code is generated. If lines are added
- +# or removed, the anchors will not be placed correctly.
- +#
- +# Note that for custom extensions or not directly supported extensions you also
- +# need to set EXTENSION_MAPPING for the extension otherwise the files are not
- +# properly processed by doxygen.
- +
- +INPUT_FILTER =
- +
- +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
- +# basis. Doxygen will compare the file name with each pattern and apply the
- +# filter if there is a match. The filters are a list of the form: pattern=filter
- +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
- +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
- +# patterns match the file name, INPUT_FILTER is applied.
- +#
- +# Note that for custom extensions or not directly supported extensions you also
- +# need to set EXTENSION_MAPPING for the extension otherwise the files are not
- +# properly processed by doxygen.
- +
- +FILTER_PATTERNS =
- +
- +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
- +# INPUT_FILTER) will also be used to filter the input files that are used for
- +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
- +# The default value is: NO.
- +
- +FILTER_SOURCE_FILES = NO
- +
- +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
- +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
- +# it is also possible to disable source filtering for a specific pattern using
- +# *.ext= (so without naming a filter).
- +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
- +
- +FILTER_SOURCE_PATTERNS =
- +
- +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
- +# is part of the input, its contents will be placed on the main page
- +# (index.html). This can be useful if you have a project on for instance GitHub
- +# and want to reuse the introduction page also for the doxygen output.
- +
- +USE_MDFILE_AS_MAINPAGE =
- +
- +#---------------------------------------------------------------------------
- +# Configuration options related to source browsing
- +#---------------------------------------------------------------------------
- +
- +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
- +# generated. Documented entities will be cross-referenced with these sources.
- +#
- +# Note: To get rid of all source code in the generated output, make sure that
- +# also VERBATIM_HEADERS is set to NO.
- +# The default value is: NO.
- +
- +SOURCE_BROWSER = NO
- +
- +# Setting the INLINE_SOURCES tag to YES will include the body of functions,
- +# classes and enums directly into the documentation.
- +# The default value is: NO.
- +
- +INLINE_SOURCES = NO
- +
- +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
- +# special comment blocks from generated source code fragments. Normal C, C++ and
- +# Fortran comments will always remain visible.
- +# The default value is: YES.
- +
- +STRIP_CODE_COMMENTS = YES
- +
- +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
- +# function all documented functions referencing it will be listed.
- +# The default value is: NO.
- +
- +REFERENCED_BY_RELATION = NO
- +
- +# If the REFERENCES_RELATION tag is set to YES then for each documented function
- +# all documented entities called/used by that function will be listed.
- +# The default value is: NO.
- +
- +REFERENCES_RELATION = NO
- +
- +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
- +# to YES then the hyperlinks from functions in REFERENCES_RELATION and
- +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
- +# link to the documentation.
- +# The default value is: YES.
- +
- +REFERENCES_LINK_SOURCE = YES
- +
- +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
- +# source code will show a tooltip with additional information such as prototype,
- +# brief description and links to the definition and documentation. Since this
- +# will make the HTML file larger and loading of large files a bit slower, you
- +# can opt to disable this feature.
- +# The default value is: YES.
- +# This tag requires that the tag SOURCE_BROWSER is set to YES.
- +
- +SOURCE_TOOLTIPS = YES
- +
- +# If the USE_HTAGS tag is set to YES then the references to source code will
- +# point to the HTML generated by the htags(1) tool instead of doxygen built-in
- +# source browser. The htags tool is part of GNU's global source tagging system
- +# (see http://www.gnu.org/software/global/global.html). You will need version
- +# 4.8.6 or higher.
- +#
- +# To use it do the following:
- +# - Install the latest version of global
- +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
- +# - Make sure the INPUT points to the root of the source tree
- +# - Run doxygen as normal
- +#
- +# Doxygen will invoke htags (and that will in turn invoke gtags), so these
- +# tools must be available from the command line (i.e. in the search path).
- +#
- +# The result: instead of the source browser generated by doxygen, the links to
- +# source code will now point to the output of htags.
- +# The default value is: NO.
- +# This tag requires that the tag SOURCE_BROWSER is set to YES.
- +
- +USE_HTAGS = NO
- +
- +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
- +# verbatim copy of the header file for each class for which an include is
- +# specified. Set to NO to disable this.
- +# See also: Section \class.
- +# The default value is: YES.
- +
- +VERBATIM_HEADERS = YES
- +
- +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
- +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
- +# cost of reduced performance. This can be particularly helpful with template
- +# rich C++ code for which doxygen's built-in parser lacks the necessary type
- +# information.
- +# Note: The availability of this option depends on whether or not doxygen was
- +# generated with the -Duse-libclang=ON option for CMake.
- +# The default value is: NO.
- +
- +CLANG_ASSISTED_PARSING = NO
- +
- +# If clang assisted parsing is enabled you can provide the compiler with command
- +# line options that you would normally use when invoking the compiler. Note that
- +# the include paths will already be set by doxygen for the files and directories
- +# specified with INPUT and INCLUDE_PATH.
- +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
- +
- +CLANG_OPTIONS =
- +
- +#---------------------------------------------------------------------------
- +# Configuration options related to the alphabetical class index
- +#---------------------------------------------------------------------------
- +
- +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
- +# compounds will be generated. Enable this if the project contains a lot of
- +# classes, structs, unions or interfaces.
- +# The default value is: YES.
- +
- +ALPHABETICAL_INDEX = YES
- +
- +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
- +# which the alphabetical index list will be split.
- +# Minimum value: 1, maximum value: 20, default value: 5.
- +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
- +
- +COLS_IN_ALPHA_INDEX = 5
- +
- +# In case all classes in a project start with a common prefix, all classes will
- +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
- +# can be used to specify a prefix (or a list of prefixes) that should be ignored
- +# while generating the index headers.
- +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
- +
- +IGNORE_PREFIX =
- +
- +#---------------------------------------------------------------------------
- +# Configuration options related to the HTML output
- +#---------------------------------------------------------------------------
- +
- +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
- +# The default value is: YES.
- +
- +GENERATE_HTML = YES
- +
- +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
- +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
- +# it.
- +# The default directory is: html.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +HTML_OUTPUT = html
- +
- +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
- +# generated HTML page (for example: .htm, .php, .asp).
- +# The default value is: .html.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +HTML_FILE_EXTENSION = .html
- +
- +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
- +# each generated HTML page. If the tag is left blank doxygen will generate a
- +# standard header.
- +#
- +# To get valid HTML the header file that includes any scripts and style sheets
- +# that doxygen needs, which is dependent on the configuration options used (e.g.
- +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
- +# default header using
- +# doxygen -w html new_header.html new_footer.html new_stylesheet.css
- +# YourConfigFile
- +# and then modify the file new_header.html. See also section "Doxygen usage"
- +# for information on how to generate the default header that doxygen normally
- +# uses.
- +# Note: The header is subject to change so you typically have to regenerate the
- +# default header when upgrading to a newer version of doxygen. For a description
- +# of the possible markers and block names see the documentation.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +HTML_HEADER =
- +
- +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
- +# generated HTML page. If the tag is left blank doxygen will generate a standard
- +# footer. See HTML_HEADER for more information on how to generate a default
- +# footer and what special commands can be used inside the footer. See also
- +# section "Doxygen usage" for information on how to generate the default footer
- +# that doxygen normally uses.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +HTML_FOOTER =
- +
- +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
- +# sheet that is used by each HTML page. It can be used to fine-tune the look of
- +# the HTML output. If left blank doxygen will generate a default style sheet.
- +# See also section "Doxygen usage" for information on how to generate the style
- +# sheet that doxygen normally uses.
- +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
- +# it is more robust and this tag (HTML_STYLESHEET) will in the future become
- +# obsolete.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +HTML_STYLESHEET =
- +
- +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
- +# cascading style sheets that are included after the standard style sheets
- +# created by doxygen. Using this option one can overrule certain style aspects.
- +# This is preferred over using HTML_STYLESHEET since it does not replace the
- +# standard style sheet and is therefore more robust against future updates.
- +# Doxygen will copy the style sheet files to the output directory.
- +# Note: The order of the extra style sheet files is of importance (e.g. the last
- +# style sheet in the list overrules the setting of the previous ones in the
- +# list). For an example see the documentation.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +HTML_EXTRA_STYLESHEET =
- +
- +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
- +# other source files which should be copied to the HTML output directory. Note
- +# that these files will be copied to the base HTML output directory. Use the
- +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
- +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
- +# files will be copied as-is; there are no commands or markers available.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +HTML_EXTRA_FILES =
- +
- +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
- +# will adjust the colors in the style sheet and background images according to
- +# this color. Hue is specified as an angle on a colorwheel, see
- +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
- +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
- +# purple, and 360 is red again.
- +# Minimum value: 0, maximum value: 359, default value: 220.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +HTML_COLORSTYLE_HUE = 220
- +
- +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
- +# in the HTML output. For a value of 0 the output will use grayscales only. A
- +# value of 255 will produce the most vivid colors.
- +# Minimum value: 0, maximum value: 255, default value: 100.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +HTML_COLORSTYLE_SAT = 100
- +
- +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
- +# luminance component of the colors in the HTML output. Values below 100
- +# gradually make the output lighter, whereas values above 100 make the output
- +# darker. The value divided by 100 is the actual gamma applied, so 80 represents
- +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
- +# change the gamma.
- +# Minimum value: 40, maximum value: 240, default value: 80.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +HTML_COLORSTYLE_GAMMA = 80
- +
- +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
- +# page will contain the date and time when the page was generated. Setting this
- +# to YES can help to show when doxygen was last run and thus if the
- +# documentation is up to date.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +HTML_TIMESTAMP = NO
- +
- +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
- +# documentation will contain sections that can be hidden and shown after the
- +# page has loaded.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +HTML_DYNAMIC_SECTIONS = NO
- +
- +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
- +# shown in the various tree structured indices initially; the user can expand
- +# and collapse entries dynamically later on. Doxygen will expand the tree to
- +# such a level that at most the specified number of entries are visible (unless
- +# a fully collapsed tree already exceeds this amount). So setting the number of
- +# entries 1 will produce a full collapsed tree by default. 0 is a special value
- +# representing an infinite number of entries and will result in a full expanded
- +# tree by default.
- +# Minimum value: 0, maximum value: 9999, default value: 100.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +HTML_INDEX_NUM_ENTRIES = 100
- +
- +# If the GENERATE_DOCSET tag is set to YES, additional index files will be
- +# generated that can be used as input for Apple's Xcode 3 integrated development
- +# environment (see: http://developer.apple.com/tools/xcode/), introduced with
- +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
- +# Makefile in the HTML output directory. Running make will produce the docset in
- +# that directory and running make install will install the docset in
- +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
- +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
- +# for more information.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +GENERATE_DOCSET = NO
- +
- +# This tag determines the name of the docset feed. A documentation feed provides
- +# an umbrella under which multiple documentation sets from a single provider
- +# (such as a company or product suite) can be grouped.
- +# The default value is: Doxygen generated docs.
- +# This tag requires that the tag GENERATE_DOCSET is set to YES.
- +
- +DOCSET_FEEDNAME = "Doxygen generated docs"
- +
- +# This tag specifies a string that should uniquely identify the documentation
- +# set bundle. This should be a reverse domain-name style string, e.g.
- +# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
- +# The default value is: org.doxygen.Project.
- +# This tag requires that the tag GENERATE_DOCSET is set to YES.
- +
- +DOCSET_BUNDLE_ID = org.doxygen.Project
- +
- +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
- +# the documentation publisher. This should be a reverse domain-name style
- +# string, e.g. com.mycompany.MyDocSet.documentation.
- +# The default value is: org.doxygen.Publisher.
- +# This tag requires that the tag GENERATE_DOCSET is set to YES.
- +
- +DOCSET_PUBLISHER_ID = org.doxygen.Publisher
- +
- +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
- +# The default value is: Publisher.
- +# This tag requires that the tag GENERATE_DOCSET is set to YES.
- +
- +DOCSET_PUBLISHER_NAME = Publisher
- +
- +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
- +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
- +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
- +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
- +# Windows.
- +#
- +# The HTML Help Workshop contains a compiler that can convert all HTML output
- +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
- +# files are now used as the Windows 98 help format, and will replace the old
- +# Windows help format (.hlp) on all Windows platforms in the future. Compressed
- +# HTML files also contain an index, a table of contents, and you can search for
- +# words in the documentation. The HTML workshop also contains a viewer for
- +# compressed HTML files.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +GENERATE_HTMLHELP = NO
- +
- +# The CHM_FILE tag can be used to specify the file name of the resulting .chm
- +# file. You can add a path in front of the file if the result should not be
- +# written to the html output directory.
- +# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
- +
- +CHM_FILE =
- +
- +# The HHC_LOCATION tag can be used to specify the location (absolute path
- +# including file name) of the HTML help compiler (hhc.exe). If non-empty,
- +# doxygen will try to run the HTML help compiler on the generated index.hhp.
- +# The file has to be specified with full path.
- +# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
- +
- +HHC_LOCATION =
- +
- +# The GENERATE_CHI flag controls if a separate .chi index file is generated
- +# (YES) or that it should be included in the master .chm file (NO).
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
- +
- +GENERATE_CHI = NO
- +
- +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
- +# and project file content.
- +# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
- +
- +CHM_INDEX_ENCODING =
- +
- +# The BINARY_TOC flag controls whether a binary table of contents is generated
- +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
- +# enables the Previous and Next buttons.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
- +
- +BINARY_TOC = NO
- +
- +# The TOC_EXPAND flag can be set to YES to add extra items for group members to
- +# the table of contents of the HTML help documentation and to the tree view.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
- +
- +TOC_EXPAND = NO
- +
- +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
- +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
- +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
- +# (.qch) of the generated HTML documentation.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +GENERATE_QHP = NO
- +
- +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
- +# the file name of the resulting .qch file. The path specified is relative to
- +# the HTML output folder.
- +# This tag requires that the tag GENERATE_QHP is set to YES.
- +
- +QCH_FILE =
- +
- +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
- +# Project output. For more information please see Qt Help Project / Namespace
- +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
- +# The default value is: org.doxygen.Project.
- +# This tag requires that the tag GENERATE_QHP is set to YES.
- +
- +QHP_NAMESPACE = org.doxygen.Project
- +
- +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
- +# Help Project output. For more information please see Qt Help Project / Virtual
- +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
- +# folders).
- +# The default value is: doc.
- +# This tag requires that the tag GENERATE_QHP is set to YES.
- +
- +QHP_VIRTUAL_FOLDER = doc
- +
- +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
- +# filter to add. For more information please see Qt Help Project / Custom
- +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
- +# filters).
- +# This tag requires that the tag GENERATE_QHP is set to YES.
- +
- +QHP_CUST_FILTER_NAME =
- +
- +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
- +# custom filter to add. For more information please see Qt Help Project / Custom
- +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
- +# filters).
- +# This tag requires that the tag GENERATE_QHP is set to YES.
- +
- +QHP_CUST_FILTER_ATTRS =
- +
- +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
- +# project's filter section matches. Qt Help Project / Filter Attributes (see:
- +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
- +# This tag requires that the tag GENERATE_QHP is set to YES.
- +
- +QHP_SECT_FILTER_ATTRS =
- +
- +# The QHG_LOCATION tag can be used to specify the location of Qt's
- +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
- +# generated .qhp file.
- +# This tag requires that the tag GENERATE_QHP is set to YES.
- +
- +QHG_LOCATION =
- +
- +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
- +# generated, together with the HTML files, they form an Eclipse help plugin. To
- +# install this plugin and make it available under the help contents menu in
- +# Eclipse, the contents of the directory containing the HTML and XML files needs
- +# to be copied into the plugins directory of eclipse. The name of the directory
- +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
- +# After copying Eclipse needs to be restarted before the help appears.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +GENERATE_ECLIPSEHELP = NO
- +
- +# A unique identifier for the Eclipse help plugin. When installing the plugin
- +# the directory name containing the HTML and XML files should also have this
- +# name. Each documentation set should have its own identifier.
- +# The default value is: org.doxygen.Project.
- +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
- +
- +ECLIPSE_DOC_ID = org.doxygen.Project
- +
- +# If you want full control over the layout of the generated HTML pages it might
- +# be necessary to disable the index and replace it with your own. The
- +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
- +# of each HTML page. A value of NO enables the index and the value YES disables
- +# it. Since the tabs in the index contain the same information as the navigation
- +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +DISABLE_INDEX = NO
- +
- +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
- +# structure should be generated to display hierarchical information. If the tag
- +# value is set to YES, a side panel will be generated containing a tree-like
- +# index structure (just like the one that is generated for HTML Help). For this
- +# to work a browser that supports JavaScript, DHTML, CSS and frames is required
- +# (i.e. any modern browser). Windows users are probably better off using the
- +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
- +# further fine-tune the look of the index. As an example, the default style
- +# sheet generated by doxygen has an example that shows how to put an image at
- +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
- +# the same information as the tab index, you could consider setting
- +# DISABLE_INDEX to YES when enabling this option.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +GENERATE_TREEVIEW = YES
- +
- +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
- +# doxygen will group on one line in the generated HTML documentation.
- +#
- +# Note that a value of 0 will completely suppress the enum values from appearing
- +# in the overview section.
- +# Minimum value: 0, maximum value: 20, default value: 4.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +ENUM_VALUES_PER_LINE = 4
- +
- +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
- +# to set the initial width (in pixels) of the frame in which the tree is shown.
- +# Minimum value: 0, maximum value: 1500, default value: 250.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +TREEVIEW_WIDTH = 250
- +
- +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
- +# external symbols imported via tag files in a separate window.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +EXT_LINKS_IN_WINDOW = NO
- +
- +# Use this tag to change the font size of LaTeX formulas included as images in
- +# the HTML documentation. When you change the font size after a successful
- +# doxygen run you need to manually remove any form_*.png images from the HTML
- +# output directory to force them to be regenerated.
- +# Minimum value: 8, maximum value: 50, default value: 10.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +FORMULA_FONTSIZE = 10
- +
- +# Use the FORMULA_TRANPARENT tag to determine whether or not the images
- +# generated for formulas are transparent PNGs. Transparent PNGs are not
- +# supported properly for IE 6.0, but are supported on all modern browsers.
- +#
- +# Note that when changing this option you need to delete any form_*.png files in
- +# the HTML output directory before the changes have effect.
- +# The default value is: YES.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +FORMULA_TRANSPARENT = YES
- +
- +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
- +# http://www.mathjax.org) which uses client side Javascript for the rendering
- +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
- +# installed or if you want to formulas look prettier in the HTML output. When
- +# enabled you may also need to install MathJax separately and configure the path
- +# to it using the MATHJAX_RELPATH option.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +USE_MATHJAX = NO
- +
- +# When MathJax is enabled you can set the default output format to be used for
- +# the MathJax output. See the MathJax site (see:
- +# http://docs.mathjax.org/en/latest/output.html) for more details.
- +# Possible values are: HTML-CSS (which is slower, but has the best
- +# compatibility), NativeMML (i.e. MathML) and SVG.
- +# The default value is: HTML-CSS.
- +# This tag requires that the tag USE_MATHJAX is set to YES.
- +
- +MATHJAX_FORMAT = HTML-CSS
- +
- +# When MathJax is enabled you need to specify the location relative to the HTML
- +# output directory using the MATHJAX_RELPATH option. The destination directory
- +# should contain the MathJax.js script. For instance, if the mathjax directory
- +# is located at the same level as the HTML output directory, then
- +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
- +# Content Delivery Network so you can quickly see the result without installing
- +# MathJax. However, it is strongly recommended to install a local copy of
- +# MathJax from http://www.mathjax.org before deployment.
- +# The default value is: http://cdn.mathjax.org/mathjax/latest.
- +# This tag requires that the tag USE_MATHJAX is set to YES.
- +
- +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
- +
- +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
- +# extension names that should be enabled during MathJax rendering. For example
- +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
- +# This tag requires that the tag USE_MATHJAX is set to YES.
- +
- +MATHJAX_EXTENSIONS =
- +
- +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
- +# of code that will be used on startup of the MathJax code. See the MathJax site
- +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
- +# example see the documentation.
- +# This tag requires that the tag USE_MATHJAX is set to YES.
- +
- +MATHJAX_CODEFILE =
- +
- +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
- +# the HTML output. The underlying search engine uses javascript and DHTML and
- +# should work on any modern browser. Note that when using HTML help
- +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
- +# there is already a search function so this one should typically be disabled.
- +# For large projects the javascript based search engine can be slow, then
- +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
- +# search using the keyboard; to jump to the search box use <access key> + S
- +# (what the <access key> is depends on the OS and browser, but it is typically
- +# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
- +# key> to jump into the search results window, the results can be navigated
- +# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
- +# the search. The filter options can be selected when the cursor is inside the
- +# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
- +# to select a filter and <Enter> or <escape> to activate or cancel the filter
- +# option.
- +# The default value is: YES.
- +# This tag requires that the tag GENERATE_HTML is set to YES.
- +
- +SEARCHENGINE = YES
- +
- +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
- +# implemented using a web server instead of a web client using Javascript. There
- +# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
- +# setting. When disabled, doxygen will generate a PHP script for searching and
- +# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
- +# and searching needs to be provided by external tools. See the section
- +# "External Indexing and Searching" for details.
- +# The default value is: NO.
- +# This tag requires that the tag SEARCHENGINE is set to YES.
- +
- +SERVER_BASED_SEARCH = NO
- +
- +# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
- +# script for searching. Instead the search results are written to an XML file
- +# which needs to be processed by an external indexer. Doxygen will invoke an
- +# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
- +# search results.
- +#
- +# Doxygen ships with an example indexer (doxyindexer) and search engine
- +# (doxysearch.cgi) which are based on the open source search engine library
- +# Xapian (see: http://xapian.org/).
- +#
- +# See the section "External Indexing and Searching" for details.
- +# The default value is: NO.
- +# This tag requires that the tag SEARCHENGINE is set to YES.
- +
- +EXTERNAL_SEARCH = NO
- +
- +# The SEARCHENGINE_URL should point to a search engine hosted by a web server
- +# which will return the search results when EXTERNAL_SEARCH is enabled.
- +#
- +# Doxygen ships with an example indexer (doxyindexer) and search engine
- +# (doxysearch.cgi) which are based on the open source search engine library
- +# Xapian (see: http://xapian.org/). See the section "External Indexing and
- +# Searching" for details.
- +# This tag requires that the tag SEARCHENGINE is set to YES.
- +
- +SEARCHENGINE_URL =
- +
- +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
- +# search data is written to a file for indexing by an external tool. With the
- +# SEARCHDATA_FILE tag the name of this file can be specified.
- +# The default file is: searchdata.xml.
- +# This tag requires that the tag SEARCHENGINE is set to YES.
- +
- +SEARCHDATA_FILE = searchdata.xml
- +
- +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
- +# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
- +# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
- +# projects and redirect the results back to the right project.
- +# This tag requires that the tag SEARCHENGINE is set to YES.
- +
- +EXTERNAL_SEARCH_ID =
- +
- +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
- +# projects other than the one defined by this configuration file, but that are
- +# all added to the same external search index. Each project needs to have a
- +# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
- +# to a relative location where the documentation can be found. The format is:
- +# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
- +# This tag requires that the tag SEARCHENGINE is set to YES.
- +
- +EXTRA_SEARCH_MAPPINGS =
- +
- +#---------------------------------------------------------------------------
- +# Configuration options related to the LaTeX output
- +#---------------------------------------------------------------------------
- +
- +# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
- +# The default value is: YES.
- +
- +GENERATE_LATEX = YES
- +
- +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
- +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
- +# it.
- +# The default directory is: latex.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +LATEX_OUTPUT = latex
- +
- +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
- +# invoked.
- +#
- +# Note that when enabling USE_PDFLATEX this option is only used for generating
- +# bitmaps for formulas in the HTML output, but not in the Makefile that is
- +# written to the output directory.
- +# The default file is: latex.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +LATEX_CMD_NAME = latex
- +
- +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
- +# index for LaTeX.
- +# The default file is: makeindex.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +MAKEINDEX_CMD_NAME = makeindex
- +
- +# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
- +# documents. This may be useful for small projects and may help to save some
- +# trees in general.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +COMPACT_LATEX = NO
- +
- +# The PAPER_TYPE tag can be used to set the paper type that is used by the
- +# printer.
- +# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
- +# 14 inches) and executive (7.25 x 10.5 inches).
- +# The default value is: a4.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +PAPER_TYPE = a4
- +
- +# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
- +# that should be included in the LaTeX output. The package can be specified just
- +# by its name or with the correct syntax as to be used with the LaTeX
- +# \usepackage command. To get the times font for instance you can specify :
- +# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
- +# To use the option intlimits with the amsmath package you can specify:
- +# EXTRA_PACKAGES=[intlimits]{amsmath}
- +# If left blank no extra packages will be included.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +EXTRA_PACKAGES =
- +
- +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
- +# generated LaTeX document. The header should contain everything until the first
- +# chapter. If it is left blank doxygen will generate a standard header. See
- +# section "Doxygen usage" for information on how to let doxygen write the
- +# default header to a separate file.
- +#
- +# Note: Only use a user-defined header if you know what you are doing! The
- +# following commands have a special meaning inside the header: $title,
- +# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
- +# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
- +# string, for the replacement values of the other commands the user is referred
- +# to HTML_HEADER.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +LATEX_HEADER =
- +
- +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
- +# generated LaTeX document. The footer should contain everything after the last
- +# chapter. If it is left blank doxygen will generate a standard footer. See
- +# LATEX_HEADER for more information on how to generate a default footer and what
- +# special commands can be used inside the footer.
- +#
- +# Note: Only use a user-defined footer if you know what you are doing!
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +LATEX_FOOTER =
- +
- +# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
- +# LaTeX style sheets that are included after the standard style sheets created
- +# by doxygen. Using this option one can overrule certain style aspects. Doxygen
- +# will copy the style sheet files to the output directory.
- +# Note: The order of the extra style sheet files is of importance (e.g. the last
- +# style sheet in the list overrules the setting of the previous ones in the
- +# list).
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +LATEX_EXTRA_STYLESHEET =
- +
- +# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
- +# other source files which should be copied to the LATEX_OUTPUT output
- +# directory. Note that the files will be copied as-is; there are no commands or
- +# markers available.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +LATEX_EXTRA_FILES =
- +
- +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
- +# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
- +# contain links (just like the HTML output) instead of page references. This
- +# makes the output suitable for online browsing using a PDF viewer.
- +# The default value is: YES.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +PDF_HYPERLINKS = YES
- +
- +# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
- +# the PDF file directly from the LaTeX files. Set this option to YES, to get a
- +# higher quality PDF documentation.
- +# The default value is: YES.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +USE_PDFLATEX = YES
- +
- +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
- +# command to the generated LaTeX files. This will instruct LaTeX to keep running
- +# if errors occur, instead of asking the user for help. This option is also used
- +# when generating formulas in HTML.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +LATEX_BATCHMODE = NO
- +
- +# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
- +# index chapters (such as File Index, Compound Index, etc.) in the output.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +LATEX_HIDE_INDICES = NO
- +
- +# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
- +# code with syntax highlighting in the LaTeX output.
- +#
- +# Note that which sources are shown also depends on other settings such as
- +# SOURCE_BROWSER.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +LATEX_SOURCE_CODE = NO
- +
- +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
- +# bibliography, e.g. plainnat, or ieeetr. See
- +# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
- +# The default value is: plain.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +LATEX_BIB_STYLE = plain
- +
- +# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
- +# page will contain the date and time when the page was generated. Setting this
- +# to NO can help when comparing the output of multiple runs.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_LATEX is set to YES.
- +
- +LATEX_TIMESTAMP = NO
- +
- +#---------------------------------------------------------------------------
- +# Configuration options related to the RTF output
- +#---------------------------------------------------------------------------
- +
- +# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
- +# RTF output is optimized for Word 97 and may not look too pretty with other RTF
- +# readers/editors.
- +# The default value is: NO.
- +
- +GENERATE_RTF = NO
- +
- +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
- +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
- +# it.
- +# The default directory is: rtf.
- +# This tag requires that the tag GENERATE_RTF is set to YES.
- +
- +RTF_OUTPUT = rtf
- +
- +# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
- +# documents. This may be useful for small projects and may help to save some
- +# trees in general.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_RTF is set to YES.
- +
- +COMPACT_RTF = NO
- +
- +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
- +# contain hyperlink fields. The RTF file will contain links (just like the HTML
- +# output) instead of page references. This makes the output suitable for online
- +# browsing using Word or some other Word compatible readers that support those
- +# fields.
- +#
- +# Note: WordPad (write) and others do not support links.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_RTF is set to YES.
- +
- +RTF_HYPERLINKS = NO
- +
- +# Load stylesheet definitions from file. Syntax is similar to doxygen's config
- +# file, i.e. a series of assignments. You only have to provide replacements,
- +# missing definitions are set to their default value.
- +#
- +# See also section "Doxygen usage" for information on how to generate the
- +# default style sheet that doxygen normally uses.
- +# This tag requires that the tag GENERATE_RTF is set to YES.
- +
- +RTF_STYLESHEET_FILE =
- +
- +# Set optional variables used in the generation of an RTF document. Syntax is
- +# similar to doxygen's config file. A template extensions file can be generated
- +# using doxygen -e rtf extensionFile.
- +# This tag requires that the tag GENERATE_RTF is set to YES.
- +
- +RTF_EXTENSIONS_FILE =
- +
- +# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
- +# with syntax highlighting in the RTF output.
- +#
- +# Note that which sources are shown also depends on other settings such as
- +# SOURCE_BROWSER.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_RTF is set to YES.
- +
- +RTF_SOURCE_CODE = NO
- +
- +#---------------------------------------------------------------------------
- +# Configuration options related to the man page output
- +#---------------------------------------------------------------------------
- +
- +# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
- +# classes and files.
- +# The default value is: NO.
- +
- +GENERATE_MAN = NO
- +
- +# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
- +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
- +# it. A directory man3 will be created inside the directory specified by
- +# MAN_OUTPUT.
- +# The default directory is: man.
- +# This tag requires that the tag GENERATE_MAN is set to YES.
- +
- +MAN_OUTPUT = man
- +
- +# The MAN_EXTENSION tag determines the extension that is added to the generated
- +# man pages. In case the manual section does not start with a number, the number
- +# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
- +# optional.
- +# The default value is: .3.
- +# This tag requires that the tag GENERATE_MAN is set to YES.
- +
- +MAN_EXTENSION = .3
- +
- +# The MAN_SUBDIR tag determines the name of the directory created within
- +# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
- +# MAN_EXTENSION with the initial . removed.
- +# This tag requires that the tag GENERATE_MAN is set to YES.
- +
- +MAN_SUBDIR =
- +
- +# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
- +# will generate one additional man file for each entity documented in the real
- +# man page(s). These additional files only source the real man page, but without
- +# them the man command would be unable to find the correct page.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_MAN is set to YES.
- +
- +MAN_LINKS = NO
- +
- +#---------------------------------------------------------------------------
- +# Configuration options related to the XML output
- +#---------------------------------------------------------------------------
- +
- +# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
- +# captures the structure of the code including all documentation.
- +# The default value is: NO.
- +
- +GENERATE_XML = NO
- +
- +# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
- +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
- +# it.
- +# The default directory is: xml.
- +# This tag requires that the tag GENERATE_XML is set to YES.
- +
- +XML_OUTPUT = xml
- +
- +# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
- +# listings (including syntax highlighting and cross-referencing information) to
- +# the XML output. Note that enabling this will significantly increase the size
- +# of the XML output.
- +# The default value is: YES.
- +# This tag requires that the tag GENERATE_XML is set to YES.
- +
- +XML_PROGRAMLISTING = YES
- +
- +#---------------------------------------------------------------------------
- +# Configuration options related to the DOCBOOK output
- +#---------------------------------------------------------------------------
- +
- +# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
- +# that can be used to generate PDF.
- +# The default value is: NO.
- +
- +GENERATE_DOCBOOK = NO
- +
- +# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
- +# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
- +# front of it.
- +# The default directory is: docbook.
- +# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
- +
- +DOCBOOK_OUTPUT = docbook
- +
- +# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
- +# program listings (including syntax highlighting and cross-referencing
- +# information) to the DOCBOOK output. Note that enabling this will significantly
- +# increase the size of the DOCBOOK output.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
- +
- +DOCBOOK_PROGRAMLISTING = NO
- +
- +#---------------------------------------------------------------------------
- +# Configuration options for the AutoGen Definitions output
- +#---------------------------------------------------------------------------
- +
- +# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
- +# AutoGen Definitions (see http://autogen.sf.net) file that captures the
- +# structure of the code including all documentation. Note that this feature is
- +# still experimental and incomplete at the moment.
- +# The default value is: NO.
- +
- +GENERATE_AUTOGEN_DEF = NO
- +
- +#---------------------------------------------------------------------------
- +# Configuration options related to the Perl module output
- +#---------------------------------------------------------------------------
- +
- +# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
- +# file that captures the structure of the code including all documentation.
- +#
- +# Note that this feature is still experimental and incomplete at the moment.
- +# The default value is: NO.
- +
- +GENERATE_PERLMOD = NO
- +
- +# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
- +# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
- +# output from the Perl module output.
- +# The default value is: NO.
- +# This tag requires that the tag GENERATE_PERLMOD is set to YES.
- +
- +PERLMOD_LATEX = NO
- +
- +# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
- +# formatted so it can be parsed by a human reader. This is useful if you want to
- +# understand what is going on. On the other hand, if this tag is set to NO, the
- +# size of the Perl module output will be much smaller and Perl will parse it
- +# just the same.
- +# The default value is: YES.
- +# This tag requires that the tag GENERATE_PERLMOD is set to YES.
- +
- +PERLMOD_PRETTY = YES
- +
- +# The names of the make variables in the generated doxyrules.make file are
- +# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
- +# so different doxyrules.make files included by the same Makefile don't
- +# overwrite each other's variables.
- +# This tag requires that the tag GENERATE_PERLMOD is set to YES.
- +
- +PERLMOD_MAKEVAR_PREFIX =
- +
- +#---------------------------------------------------------------------------
- +# Configuration options related to the preprocessor
- +#---------------------------------------------------------------------------
- +
- +# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
- +# C-preprocessor directives found in the sources and include files.
- +# The default value is: YES.
- +
- +ENABLE_PREPROCESSING = YES
- +
- +# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
- +# in the source code. If set to NO, only conditional compilation will be
- +# performed. Macro expansion can be done in a controlled way by setting
- +# EXPAND_ONLY_PREDEF to YES.
- +# The default value is: NO.
- +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
- +
- +MACRO_EXPANSION = NO
- +
- +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
- +# the macro expansion is limited to the macros specified with the PREDEFINED and
- +# EXPAND_AS_DEFINED tags.
- +# The default value is: NO.
- +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
- +
- +EXPAND_ONLY_PREDEF = NO
- +
- +# If the SEARCH_INCLUDES tag is set to YES, the include files in the
- +# INCLUDE_PATH will be searched if a #include is found.
- +# The default value is: YES.
- +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
- +
- +SEARCH_INCLUDES = YES
- +
- +# The INCLUDE_PATH tag can be used to specify one or more directories that
- +# contain include files that are not input files but should be processed by the
- +# preprocessor.
- +# This tag requires that the tag SEARCH_INCLUDES is set to YES.
- +
- +INCLUDE_PATH =
- +
- +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
- +# patterns (like *.h and *.hpp) to filter out the header-files in the
- +# directories. If left blank, the patterns specified with FILE_PATTERNS will be
- +# used.
- +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
- +
- +INCLUDE_FILE_PATTERNS =
- +
- +# The PREDEFINED tag can be used to specify one or more macro names that are
- +# defined before the preprocessor is started (similar to the -D option of e.g.
- +# gcc). The argument of the tag is a list of macros of the form: name or
- +# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
- +# is assumed. To prevent a macro definition from being undefined via #undef or
- +# recursively expanded use the := operator instead of the = operator.
- +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
- +
- +PREDEFINED =
- +
- +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
- +# tag can be used to specify a list of macro names that should be expanded. The
- +# macro definition that is found in the sources will be used. Use the PREDEFINED
- +# tag if you want to use a different macro definition that overrules the
- +# definition found in the source code.
- +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
- +
- +EXPAND_AS_DEFINED =
- +
- +# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
- +# remove all references to function-like macros that are alone on a line, have
- +# an all uppercase name, and do not end with a semicolon. Such function macros
- +# are typically used for boiler-plate code, and will confuse the parser if not
- +# removed.
- +# The default value is: YES.
- +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
- +
- +SKIP_FUNCTION_MACROS = YES
- +
- +#---------------------------------------------------------------------------
- +# Configuration options related to external references
- +#---------------------------------------------------------------------------
- +
- +# The TAGFILES tag can be used to specify one or more tag files. For each tag
- +# file the location of the external documentation should be added. The format of
- +# a tag file without this location is as follows:
- +# TAGFILES = file1 file2 ...
- +# Adding location for the tag files is done as follows:
- +# TAGFILES = file1=loc1 "file2 = loc2" ...
- +# where loc1 and loc2 can be relative or absolute paths or URLs. See the
- +# section "Linking to external documentation" for more information about the use
- +# of tag files.
- +# Note: Each tag file must have a unique name (where the name does NOT include
- +# the path). If a tag file is not located in the directory in which doxygen is
- +# run, you must also specify the path to the tagfile here.
- +
- +TAGFILES =
- +
- +# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
- +# tag file that is based on the input files it reads. See section "Linking to
- +# external documentation" for more information about the usage of tag files.
- +
- +GENERATE_TAGFILE =
- +
- +# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
- +# the class index. If set to NO, only the inherited external classes will be
- +# listed.
- +# The default value is: NO.
- +
- +ALLEXTERNALS = NO
- +
- +# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
- +# in the modules index. If set to NO, only the current project's groups will be
- +# listed.
- +# The default value is: YES.
- +
- +EXTERNAL_GROUPS = YES
- +
- +# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
- +# the related pages index. If set to NO, only the current project's pages will
- +# be listed.
- +# The default value is: YES.
- +
- +EXTERNAL_PAGES = YES
- +
- +# The PERL_PATH should be the absolute path and name of the perl script
- +# interpreter (i.e. the result of 'which perl').
- +# The default file (with absolute path) is: /usr/bin/perl.
- +
- +PERL_PATH = /usr/bin/perl
- +
- +#---------------------------------------------------------------------------
- +# Configuration options related to the dot tool
- +#---------------------------------------------------------------------------
- +
- +# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
- +# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
- +# NO turns the diagrams off. Note that this option also works with HAVE_DOT
- +# disabled, but it is recommended to install and use dot, since it yields more
- +# powerful graphs.
- +# The default value is: YES.
- +
- +CLASS_DIAGRAMS = YES
- +
- +# You can define message sequence charts within doxygen comments using the \msc
- +# command. Doxygen will then run the mscgen tool (see:
- +# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
- +# documentation. The MSCGEN_PATH tag allows you to specify the directory where
- +# the mscgen tool resides. If left empty the tool is assumed to be found in the
- +# default search path.
- +
- +MSCGEN_PATH =
- +
- +# You can include diagrams made with dia in doxygen documentation. Doxygen will
- +# then run dia to produce the diagram and insert it in the documentation. The
- +# DIA_PATH tag allows you to specify the directory where the dia binary resides.
- +# If left empty dia is assumed to be found in the default search path.
- +
- +DIA_PATH =
- +
- +# If set to YES the inheritance and collaboration graphs will hide inheritance
- +# and usage relations if the target is undocumented or is not a class.
- +# The default value is: YES.
- +
- +HIDE_UNDOC_RELATIONS = YES
- +
- +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
- +# available from the path. This tool is part of Graphviz (see:
- +# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
- +# Bell Labs. The other options in this section have no effect if this option is
- +# set to NO
- +# The default value is: NO.
- +
- +HAVE_DOT = NO
- +
- +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
- +# to run in parallel. When set to 0 doxygen will base this on the number of
- +# processors available in the system. You can set it explicitly to a value
- +# larger than 0 to get control over the balance between CPU load and processing
- +# speed.
- +# Minimum value: 0, maximum value: 32, default value: 0.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +DOT_NUM_THREADS = 0
- +
- +# When you want a differently looking font in the dot files that doxygen
- +# generates you can specify the font name using DOT_FONTNAME. You need to make
- +# sure dot is able to find the font, which can be done by putting it in a
- +# standard location or by setting the DOTFONTPATH environment variable or by
- +# setting DOT_FONTPATH to the directory containing the font.
- +# The default value is: Helvetica.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +DOT_FONTNAME = Helvetica
- +
- +# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
- +# dot graphs.
- +# Minimum value: 4, maximum value: 24, default value: 10.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +DOT_FONTSIZE = 10
- +
- +# By default doxygen will tell dot to use the default font as specified with
- +# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
- +# the path where dot can find it using this tag.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +DOT_FONTPATH =
- +
- +# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
- +# each documented class showing the direct and indirect inheritance relations.
- +# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
- +# The default value is: YES.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +CLASS_GRAPH = YES
- +
- +# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
- +# graph for each documented class showing the direct and indirect implementation
- +# dependencies (inheritance, containment, and class references variables) of the
- +# class with other documented classes.
- +# The default value is: YES.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +COLLABORATION_GRAPH = YES
- +
- +# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
- +# groups, showing the direct groups dependencies.
- +# The default value is: YES.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +GROUP_GRAPHS = YES
- +
- +# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
- +# collaboration diagrams in a style similar to the OMG's Unified Modeling
- +# Language.
- +# The default value is: NO.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +UML_LOOK = NO
- +
- +# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
- +# class node. If there are many fields or methods and many nodes the graph may
- +# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
- +# number of items for each type to make the size more manageable. Set this to 0
- +# for no limit. Note that the threshold may be exceeded by 50% before the limit
- +# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
- +# but if the number exceeds 15, the total amount of fields shown is limited to
- +# 10.
- +# Minimum value: 0, maximum value: 100, default value: 10.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +UML_LIMIT_NUM_FIELDS = 10
- +
- +# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
- +# collaboration graphs will show the relations between templates and their
- +# instances.
- +# The default value is: NO.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +TEMPLATE_RELATIONS = NO
- +
- +# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
- +# YES then doxygen will generate a graph for each documented file showing the
- +# direct and indirect include dependencies of the file with other documented
- +# files.
- +# The default value is: YES.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +INCLUDE_GRAPH = YES
- +
- +# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
- +# set to YES then doxygen will generate a graph for each documented file showing
- +# the direct and indirect include dependencies of the file with other documented
- +# files.
- +# The default value is: YES.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +INCLUDED_BY_GRAPH = YES
- +
- +# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
- +# dependency graph for every global function or class method.
- +#
- +# Note that enabling this option will significantly increase the time of a run.
- +# So in most cases it will be better to enable call graphs for selected
- +# functions only using the \callgraph command. Disabling a call graph can be
- +# accomplished by means of the command \hidecallgraph.
- +# The default value is: NO.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +CALL_GRAPH = NO
- +
- +# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
- +# dependency graph for every global function or class method.
- +#
- +# Note that enabling this option will significantly increase the time of a run.
- +# So in most cases it will be better to enable caller graphs for selected
- +# functions only using the \callergraph command. Disabling a caller graph can be
- +# accomplished by means of the command \hidecallergraph.
- +# The default value is: NO.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +CALLER_GRAPH = NO
- +
- +# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
- +# hierarchy of all classes instead of a textual one.
- +# The default value is: YES.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +GRAPHICAL_HIERARCHY = YES
- +
- +# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
- +# dependencies a directory has on other directories in a graphical way. The
- +# dependency relations are determined by the #include relations between the
- +# files in the directories.
- +# The default value is: YES.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +DIRECTORY_GRAPH = YES
- +
- +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
- +# generated by dot. For an explanation of the image formats see the section
- +# output formats in the documentation of the dot tool (Graphviz (see:
- +# http://www.graphviz.org/)).
- +# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
- +# to make the SVG files visible in IE 9+ (other browsers do not have this
- +# requirement).
- +# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
- +# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
- +# png:gdiplus:gdiplus.
- +# The default value is: png.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +DOT_IMAGE_FORMAT = png
- +
- +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
- +# enable generation of interactive SVG images that allow zooming and panning.
- +#
- +# Note that this requires a modern browser other than Internet Explorer. Tested
- +# and working are Firefox, Chrome, Safari, and Opera.
- +# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
- +# the SVG files visible. Older versions of IE do not have SVG support.
- +# The default value is: NO.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +INTERACTIVE_SVG = NO
- +
- +# The DOT_PATH tag can be used to specify the path where the dot tool can be
- +# found. If left blank, it is assumed the dot tool can be found in the path.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +DOT_PATH =
- +
- +# The DOTFILE_DIRS tag can be used to specify one or more directories that
- +# contain dot files that are included in the documentation (see the \dotfile
- +# command).
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +DOTFILE_DIRS =
- +
- +# The MSCFILE_DIRS tag can be used to specify one or more directories that
- +# contain msc files that are included in the documentation (see the \mscfile
- +# command).
- +
- +MSCFILE_DIRS =
- +
- +# The DIAFILE_DIRS tag can be used to specify one or more directories that
- +# contain dia files that are included in the documentation (see the \diafile
- +# command).
- +
- +DIAFILE_DIRS =
- +
- +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
- +# path where java can find the plantuml.jar file. If left blank, it is assumed
- +# PlantUML is not used or called during a preprocessing step. Doxygen will
- +# generate a warning when it encounters a \startuml command in this case and
- +# will not generate output for the diagram.
- +
- +PLANTUML_JAR_PATH =
- +
- +# When using plantuml, the specified paths are searched for files specified by
- +# the !include statement in a plantuml block.
- +
- +PLANTUML_INCLUDE_PATH =
- +
- +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
- +# that will be shown in the graph. If the number of nodes in a graph becomes
- +# larger than this value, doxygen will truncate the graph, which is visualized
- +# by representing a node as a red box. Note that doxygen if the number of direct
- +# children of the root node in a graph is already larger than
- +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
- +# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
- +# Minimum value: 0, maximum value: 10000, default value: 50.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +DOT_GRAPH_MAX_NODES = 50
- +
- +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
- +# generated by dot. A depth value of 3 means that only nodes reachable from the
- +# root by following a path via at most 3 edges will be shown. Nodes that lay
- +# further from the root node will be omitted. Note that setting this option to 1
- +# or 2 may greatly reduce the computation time needed for large code bases. Also
- +# note that the size of a graph can be further restricted by
- +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
- +# Minimum value: 0, maximum value: 1000, default value: 0.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +MAX_DOT_GRAPH_DEPTH = 0
- +
- +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
- +# background. This is disabled by default, because dot on Windows does not seem
- +# to support this out of the box.
- +#
- +# Warning: Depending on the platform used, enabling this option may lead to
- +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
- +# read).
- +# The default value is: NO.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +DOT_TRANSPARENT = NO
- +
- +# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
- +# files in one run (i.e. multiple -o and -T options on the command line). This
- +# makes dot run faster, but since only newer versions of dot (>1.8.10) support
- +# this, this feature is disabled by default.
- +# The default value is: NO.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +DOT_MULTI_TARGETS = NO
- +
- +# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
- +# explaining the meaning of the various boxes and arrows in the dot generated
- +# graphs.
- +# The default value is: YES.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +GENERATE_LEGEND = YES
- +
- +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
- +# files that are used to generate the various graphs.
- +# The default value is: YES.
- +# This tag requires that the tag HAVE_DOT is set to YES.
- +
- +DOT_CLEANUP = YES
- diff --git a/Hand.cpp b/Hand.cpp
- index 214c78a..732a664 100644
- --- a/Hand.cpp
- +++ b/Hand.cpp
- @@ -1,299 +1,289 @@
- -#include "Hand.h"
- -#include "Util.h"
- -#include "Visualizer.h"
- -#include "global.h"
- -
- -Hand::Hand()
- -{
- -
- -}
- -
- -Hand::Hand(cv::Mat xyzMap, float angle_threshhold, int cluster_thresh)
- -{
- - CLUSTER_THRESHOLD = cluster_thresh;
- - ANGLE_THRESHHOLD = angle_threshhold;
- - analyzeHand(xyzMap);
- -}
- -
- -Hand::~Hand()
- -{
- -
- -}
- -
- -void Hand::analyzeHand(cv::Mat xyzMap)
- -{
- -
- - cv::Mat normalizedDepthMap;
- - cv::Mat channel[3];
- - cv::split(xyzMap, channel);
- - cv::normalize(channel[2], normalizedDepthMap, 0, 255, cv::NORM_MINMAX, CV_8UC1);
- -
- - // Resize input
- - cv::Mat input;
- - cv::pyrUp(normalizedDepthMap, input, cv::Size(normalizedDepthMap.cols * 2, normalizedDepthMap.rows * 2));
- -
- - cv::pyrUp(input, input, cv::Size(input.cols * 2, input.rows * 2));
- - cv::Mat threshold_output;
- - std::vector< std::vector<cv::Point> > contours;
- - std::vector<cv::Vec4i> hierarchy;
- -
- - // Find contours
- -
- - cv::threshold(input, threshold_output, 100, 255, cv::THRESH_BINARY);
- - cv::findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));
- -
- - // Find contour polygon
- -
- - std::vector< std::vector< cv::Point> > contours_poly(contours.size());
- - for (int i = 0; i < contours.size(); i++) {
- - cv::approxPolyDP(cv::Mat(contours[i]), contours_poly[i], 3, true);
- - }
- -
- - // Find largest contour
- - std::vector<cv::Point> contour = Hand::findComplexContour(contours);
- -
- - // Find approximated convex hull
- -
- - std::vector<cv::Point> hull;
- - std::vector<cv::Point> completeHull;
- - std::vector<int> indexHull;
- - if (contour.size() > 1) {
- - cv::convexHull(contour, completeHull, 0, 1);
- - cv::convexHull(contour, indexHull, 0, 0);
- - hull = Hand::clusterConvexHull(completeHull, Hand::CLUSTER_THRESHOLD);
- - }
- -
- - // Find convexityDefects
- -
- - std::vector<cv::Vec4i> defects;
- - if (indexHull.size() > 3) {
- - cv::convexityDefects(contour, indexHull, defects);
- - }
- -
- - // Find max and min distances
- - double minVal, maxVal;
- - cv::Point minLoc, maxLoc;
- - cv::minMaxLoc(channel[2], &minVal, &maxVal, &minLoc, &maxLoc);
- -
- - // Find center of contour
- -
- - cv::Point center = Hand::findCenter(contour);
- - centroid_xyz = xyzMap.at<cv::Vec3f>(center.y / 4, center.x / 4);
- - centroid_ij = cv::Point2i(center.x, center.y); // SCALING
- -
- - // Generate visual
- - cv::Mat img = cv::Mat::zeros(input.rows, input.cols, CV_8UC3);
- - cv::Scalar color = cv::Scalar(0, 255, 0);
- -
- - // Draw contours
- - cv::circle(img, center, 5, cv::Scalar(255, 0, 0), 2);
- -
- - for (int i = 0; i < contours.size(); i++) {
- - cv::drawContours(img, contours_poly, i, color, 1, 8, std::vector<cv::Vec4i>(), 0, cv::Point());
- - }
- -
- - // Draw hull
- -
- - cv::Point index;
- - cv::Point index_right;
- - cv::Point index_left;
- - double farthest = 0;
- -
- - if (hull.size() > 1) {
- - for (int i = 0; i < hull.size(); i++) {
- - cv::Point p1 = hull[i];
- - cv::Point p2 = hull[(i + 1) % hull.size()];
- - //cv::line(img, p1, p2, cv::Scalar(255, 0, 0), 1);
- -
- - if (p1.y < centroid_ij.y && Util::euclideanDistance2D(p1, centroid_ij) > farthest) {
- - farthest = Util::euclideanDistance2D(p1, centroid_ij);
- - index = p1;
- - index_right = hull[(i + 1) % hull.size()];
- - index_left = hull[(i - 1) % hull.size()];
- - }
- - }
- - }
- -
- - // Draw defects (filter)
- -
- - std::vector<cv::Point> endpoints;
- - std::vector<cv::Point> fingerDefects;
- - cv::Point lastStart;
- - int found = -1;
- - for (int i = 0; i < defects.size(); i++) {
- - cv::Vec4i defect = defects[i];
- - cv::Point start = contour[defect[0]];
- - cv::Point end = contour[defect[1]];
- - cv::Point farPt = contour[defect[2]];
- - // Depth from edge of contour
- - // std::cout << "Depth: " << depth << "\tThreshold: " << cv::norm(maxLoc - center) << "\t";
- - // Defect conditions: depth is sufficient, inside contour, y value is above center
- - int depth = defect[3];
- -
- - // maxLoc largest depth
- - // first condition replace with meters distance from the edge
- - // second test if inside the hull (no change)
- - // above the center (no change)
- - if (cv::norm(maxLoc - center) * 15 < depth && cv::pointPolygonTest(hull, farPt, false) > 0 && farPt.y < center.y) {
- - cv::Vec3f pt1 = xyzMap.at<cv::Vec3f>(farPt.y / 4, farPt.x / 4);
- - if (Util::euclidianDistance3D(pt1, centroid_xyz) > 0.05) {
- - endpoints.push_back(start);
- - endpoints.push_back(end);
- - fingerDefects.push_back(farPt);
- - }
- - }
- - }
- -
- - // Cluster fingertip locations
- -
- - endpoints = Hand::clusterConvexHull(endpoints, Hand::CLUSTER_THRESHOLD);
- - for (int i = 0; i < endpoints.size(); i++) {
- - cv::Point endpoint = endpoints[i];
- -
- - cv::Point closestDefect;
- - int minDefectDistance = 1 << 29;
- - for (int i = 0; i < fingerDefects.size(); i++) {
- - if (cv::norm(endpoint - fingerDefects[i]) < minDefectDistance) {
- - minDefectDistance = cv::norm(endpoint - fingerDefects[i]);
- - closestDefect = fingerDefects[i];
- - }
- - }
- - cv::Vec3f endPoint_xyz = Util::averageAroundPoint(xyzMap, cv::Point2i(endpoint.x / 4, endpoint.y / 4), 10);
- - cv::Vec3f closestDefect_xyz = Util::averageAroundPoint(xyzMap, cv::Point2i(closestDefect.x / 4, closestDefect.y / 4), 10);
- - double finger_length = Util::euclidianDistance3D(endPoint_xyz, closestDefect_xyz);
- - if (finger_length < 0.08 && finger_length > 0.025 && endpoint.y < closestDefect.y) {
- - fingers_xyz.push_back(endPoint_xyz);
- - fingers_ij.push_back(cv::Point2i(endpoint.x, endpoint.y)); // SCALING
- -
- - defects_xyz.push_back(Util::averageAroundPoint(xyzMap, cv::Point2i(closestDefect.x / 4, closestDefect.y / 4), 5));
- - defects_ij.push_back(cv::Point2i(closestDefect.x, closestDefect.y)); // SCALING
- - }
- - }
- - if ((float)cv::countNonZero(channel[2]) / (xyzMap.rows*xyzMap.cols) > 0.3) {
- - return;
- - }
- -
- - // If there is one or less visible fingers
- - if (fingers_xyz.size() <= 1)
- - {
- - fingers_xyz.clear();
- - fingers_ij.clear();
- -
- - cv::Vec3f indexFinger = Util::averageAroundPoint(xyzMap, cv::Point2i(index.x / 4, index.y / 4), 10);
- - fingers_xyz.push_back(indexFinger);
- - fingers_ij.push_back(cv::Point2i(index.x, index.y)); // SCALING
- -
- - double angle = Util::TriangleAngleCalculation(index_left.x, index_left.y, index.x, index.y, index_right.x, index_right.y);
- - if (defects_ij.size() != 0) {
- - for (int i = 0; i < fingers_xyz.size(); i++) {
- - cv::circle(img, fingers_ij[i], 5, cv::Scalar(0, 0, 255), 3);
- - cv::line(img, defects_ij[i], fingers_ij[i], cv::Scalar(255, 0, 255), 2);
- - cv::circle(img, defects_ij[i], 5, cv::Scalar(0, 255, 255), 2);
- - cv::line(img, defects_ij[i], centroid_ij, cv::Scalar(255, 0, 255), 2);
- - }
- - }
- - else if (angle > ANGLE_THRESHHOLD) {
- - cv::circle(img, fingers_ij[0], 5, cv::Scalar(0, 0, 255), 3);
- - cv::line(img, fingers_ij[0], centroid_ij, cv::Scalar(255, 0, 255), 2);
- - }
- -
- - }
- - else {
- - for (int i = 0; i < fingers_xyz.size(); i++) {
- - cv::circle(img, fingers_ij[i], 5, cv::Scalar(0, 0, 255), 3);
- - cv::line(img, defects_ij[i], fingers_ij[i], cv::Scalar(255, 0, 255), 2);
- - cv::circle(img, defects_ij[i], 3, cv::Scalar(0, 255, 255), 2);
- - cv::line(img, defects_ij[i], centroid_ij, cv::Scalar(255, 0, 255), 2);
- - }
- - }
- -
- - if (camera_name == "sr300") {
- - cv::Mat img_dst;
- - cv::resize(img, img_dst, cv::Size(640, 489), 0, 0, cv::INTER_AREA);
- - cv::namedWindow("Contours", CV_WINDOW_AUTOSIZE);
- - cv::imshow("Contours", img_dst);
- - }
- - else {
- - cv::namedWindow("Contours", CV_WINDOW_AUTOSIZE);
- - cv::imshow("Contours", img);
- - }
- -
- -}
- -
- -std::vector<cv::Point> Hand::findComplexContour(std::vector< std::vector<cv::Point> > contours) {
- - std::vector<cv::Point> contour;
- - int maxPoints = 0;
- - for (int i = 0; i < contours.size(); i++) {
- - if (contours[i].size() > maxPoints) {
- - maxPoints = contours[i].size();
- - contour = contours[i];
- - }
- - }
- - return contour;
- -}
- -
- -std::vector<cv::Point> Hand::clusterConvexHull(std::vector<cv::Point> convexHull, int threshold) {
- - std::vector<cv::Point> clusterHull;
- - int i = 0;
- - while (i < convexHull.size()) {
- - // Select a point from cluster
- - std::vector<cv::Point> cluster;
- - cv::Point hullPoint = convexHull[i];
- - cluster.push_back(hullPoint);
- - i++;
- - while (i < convexHull.size()) {
- - cv::Point clusterPoint = convexHull[i];
- - double distance = cv::norm(hullPoint - clusterPoint);
- - if (distance < threshold) {
- - cluster.push_back(clusterPoint);
- - i++;
- - }
- - else {
- - break;
- - }
- - }
- - hullPoint = cluster[cluster.size() / 2];
- - cv::Point center = findCenter(convexHull);
- - int maxDist = cv::norm(hullPoint - center);
- - for (int i = 0; i < cluster.size(); i++) {
- - if (cv::norm(cluster[i] - center) > maxDist) {
- - maxDist = cv::norm(cluster[i] - center);
- - hullPoint = cluster[i];
- - }
- - }
- - clusterHull.push_back(hullPoint);
- - }
- - return clusterHull;
- -}
- -
- -cv::Point Hand::findCenter(std::vector<cv::Point> contour) {
- - cv::Point center;
- - cv::Moments M = cv::moments(contour, false);
- - center = cv::Point((int)M.m10 / M.m00, (int)M.m01 / M.m00);
- - return center;
- -}
- -
- -bool Hand::touchObject(std::vector<double> &equation, const double threshold)
- -{
- - if (equation.size() == 0) {
- - return false;
- - }
- -
- - for (int i = 0; i < fingers_xyz.size(); i++) {
- - double x = fingers_xyz[i][0];
- - double y = fingers_xyz[i][1];
- - double z = fingers_xyz[i][2];
- - if (z == 0) {
- - return false;
- - }
- -
- - double z_hat = equation[0] * x + equation[1] * y + equation[2];
- - double r_squared = (z - z_hat) * (z - z_hat);
- -
- - if (r_squared < threshold) {
- - return true;
- - }
- - }
- -
- - return false;
- +#include "Hand.h"
- +#include "Util.h"
- +#include "Visualizer.h"
- +
- +Hand::Hand()
- +{
- +
- +}
- +
- +Hand::Hand(cv::Mat xyzMap, float angle_threshhold, int cluster_thresh)
- +{
- + CLUSTER_THRESHOLD = cluster_thresh;
- + ANGLE_THRESHHOLD = angle_threshhold;
- + analyzeHand(xyzMap);
- +}
- +
- +Hand::~Hand()
- +{
- +
- +}
- +
- +void Hand::analyzeHand(cv::Mat xyzMap)
- +{
- +
- + cv::Mat normalizedDepthMap;
- + cv::Mat channel[3];
- + cv::split(xyzMap, channel);
- + cv::normalize(channel[2], normalizedDepthMap, 0, 255, cv::NORM_MINMAX, CV_8UC1);
- +
- + // Resize input
- + cv::Mat input;
- + cv::pyrUp(normalizedDepthMap, input, cv::Size(normalizedDepthMap.cols * 2, normalizedDepthMap.rows * 2));
- + cv::pyrUp(input, input, cv::Size(input.cols * 2, input.rows * 2));
- +
- + cv::Mat threshold_output;
- + std::vector< std::vector<cv::Point> > contours;
- + std::vector<cv::Vec4i> hierarchy;
- +
- + // Find contours
- +
- + cv::threshold(input, threshold_output, 100, 255, cv::THRESH_BINARY);
- + cv::findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));
- +
- + // Find contour polygon
- +
- + std::vector< std::vector< cv::Point> > contours_poly(contours.size());
- + for (int i = 0; i < contours.size(); i++) {
- + cv::approxPolyDP(cv::Mat(contours[i]), contours_poly[i], 3, true);
- + }
- +
- + // Find largest contour
- + std::vector<cv::Point> contour = Hand::findComplexContour(contours);
- +
- + // Find approximated convex hull
- +
- + std::vector<cv::Point> hull;
- + std::vector<cv::Point> completeHull;
- + std::vector<int> indexHull;
- + if (contour.size() > 1) {
- + cv::convexHull(contour, completeHull, 0, 1);
- + cv::convexHull(contour, indexHull, 0, 0);
- + hull = Hand::clusterConvexHull(completeHull, Hand::CLUSTER_THRESHOLD);
- + }
- +
- + // Find convexityDefects
- +
- + std::vector<cv::Vec4i> defects;
- + if (indexHull.size() > 3) {
- + cv::convexityDefects(contour, indexHull, defects);
- + }
- +
- + // Find max and min distances
- + double minVal, maxVal;
- + cv::Point minLoc, maxLoc;
- + cv::minMaxLoc(channel[2], &minVal, &maxVal, &minLoc, &maxLoc);
- +
- + // Find center of contour
- +
- + cv::Point center = Hand::findCenter(contour);
- + centroid_xyz = xyzMap.at<cv::Vec3f>(center.y / 4, center.x / 4);
- + centroid_ij = cv::Point2i(center.x, center.y); // SCALING
- +
- + // Generate visual
- + cv::Mat img = cv::Mat::zeros(input.rows, input.cols, CV_8UC3);
- + cv::Scalar color = cv::Scalar(0, 255, 0);
- +
- + // Draw contours
- + cv::circle(img, center, 5, cv::Scalar(255, 0, 0), 2);
- +
- + for (int i = 0; i < contours.size(); i++) {
- + cv::drawContours(img, contours_poly, i, color, 1, 8, std::vector<cv::Vec4i>(), 0, cv::Point());
- + }
- +
- + // Draw hull
- +
- + cv::Point index;
- + cv::Point index_right;
- + cv::Point index_left;
- + double farthest = 0;
- +
- + if (hull.size() > 1) {
- + for (int i = 0; i < hull.size(); i++) {
- + cv::Point p1 = hull[i];
- + cv::Point p2 = hull[(i + 1) % hull.size()];
- + //cv::line(img, p1, p2, cv::Scalar(255, 0, 0), 1);
- +
- + if (p1.y < centroid_ij.y && Util::euclideanDistance2D(p1, centroid_ij) > farthest) {
- + farthest = Util::euclideanDistance2D(p1, centroid_ij);
- + index = p1;
- + index_right = hull[(i + 1) % hull.size()];
- + index_left = hull[(i - 1) % hull.size()];
- + }
- + }
- + }
- +
- + // Draw defects (filter)
- +
- + std::vector<cv::Point> endpoints;
- + std::vector<cv::Point> fingerDefects;
- + cv::Point lastStart;
- + int found = -1;
- + for (int i = 0; i < defects.size(); i++) {
- + cv::Vec4i defect = defects[i];
- + cv::Point start = contour[defect[0]];
- + cv::Point end = contour[defect[1]];
- + cv::Point farPt = contour[defect[2]];
- + // Depth from edge of contour
- + // std::cout << "Depth: " << depth << "\tThreshold: " << cv::norm(maxLoc - center) << "\t";
- + // Defect conditions: depth is sufficient, inside contour, y value is above center
- + int depth = defect[3];
- +
- + // maxLoc largest depth
- + // first condition replace with meters distance from the edge
- + // second test if inside the hull (no change)
- + // above the center (no change)
- + if (cv::norm(maxLoc - center) * 15 < depth && cv::pointPolygonTest(hull, farPt, false) > 0 && farPt.y < center.y) {
- + cv::Vec3f pt1 = xyzMap.at<cv::Vec3f>(farPt.y / 4, farPt.x / 4);
- + if (Util::euclidianDistance3D(pt1, centroid_xyz) > 0.05) {
- + endpoints.push_back(start);
- + endpoints.push_back(end);
- + fingerDefects.push_back(farPt);
- + }
- + }
- + }
- +
- + // Cluster fingertip locations
- +
- + endpoints = Hand::clusterConvexHull(endpoints, Hand::CLUSTER_THRESHOLD);
- + for (int i = 0; i < endpoints.size(); i++) {
- + cv::Point endpoint = endpoints[i];
- +
- + cv::Point closestDefect;
- + int minDefectDistance = 1 << 29;
- + for (int i = 0; i < fingerDefects.size(); i++) {
- + if (cv::norm(endpoint - fingerDefects[i]) < minDefectDistance) {
- + minDefectDistance = cv::norm(endpoint - fingerDefects[i]);
- + closestDefect = fingerDefects[i];
- + }
- + }
- + cv::Vec3f endPoint_xyz = Util::averageAroundPoint(xyzMap, cv::Point2i(endpoint.x / 4, endpoint.y / 4), 10);
- + cv::Vec3f closestDefect_xyz = Util::averageAroundPoint(xyzMap, cv::Point2i(closestDefect.x / 4, closestDefect.y / 4), 10);
- + double finger_length = Util::euclidianDistance3D(endPoint_xyz, closestDefect_xyz);
- + if (finger_length < 0.08 && finger_length > 0.025 && endpoint.y < closestDefect.y) {
- + fingers_xyz.push_back(endPoint_xyz);
- + fingers_ij.push_back(cv::Point2i(endpoint.x, endpoint.y)); // SCALING
- +
- + defects_xyz.push_back(Util::averageAroundPoint(xyzMap, cv::Point2i(closestDefect.x / 4, closestDefect.y / 4), 5));
- + defects_ij.push_back(cv::Point2i(closestDefect.x, closestDefect.y)); // SCALING
- + }
- + }
- + if ((float)cv::countNonZero(channel[2]) / (xyzMap.rows*xyzMap.cols) > 0.3) {
- + return;
- + }
- +
- + // If there is one or less visible fingers
- + if (fingers_xyz.size() <= 1)
- + {
- + fingers_xyz.clear();
- + fingers_ij.clear();
- +
- + cv::Vec3f indexFinger = Util::averageAroundPoint(xyzMap, cv::Point2i(index.x / 4, index.y / 4), 10);
- + fingers_xyz.push_back(indexFinger);
- + fingers_ij.push_back(cv::Point2i(index.x, index.y)); // SCALING
- +
- + double angle = Util::TriangleAngleCalculation(index_left.x, index_left.y, index.x, index.y, index_right.x, index_right.y);
- + if (defects_ij.size() != 0) {
- + for (int i = 0; i < fingers_xyz.size(); i++) {
- + cv::circle(img, fingers_ij[i], 5, cv::Scalar(0, 0, 255), 3);
- + cv::line(img, defects_ij[i], fingers_ij[i], cv::Scalar(255, 0, 255), 2);
- + cv::circle(img, defects_ij[i], 5, cv::Scalar(0, 255, 255), 2);
- + cv::line(img, defects_ij[i], centroid_ij, cv::Scalar(255, 0, 255), 2);
- + }
- + }
- + else if (angle > ANGLE_THRESHHOLD) {
- + cv::circle(img, fingers_ij[0], 5, cv::Scalar(0, 0, 255), 3);
- + cv::line(img, fingers_ij[0], centroid_ij, cv::Scalar(255, 0, 255), 2);
- + }
- +
- + }
- + else {
- + for (int i = 0; i < fingers_xyz.size(); i++) {
- + cv::circle(img, fingers_ij[i], 5, cv::Scalar(0, 0, 255), 3);
- + cv::line(img, defects_ij[i], fingers_ij[i], cv::Scalar(255, 0, 255), 2);
- + cv::circle(img, defects_ij[i], 3, cv::Scalar(0, 255, 255), 2);
- + cv::line(img, defects_ij[i], centroid_ij, cv::Scalar(255, 0, 255), 2);
- + }
- + }
- + cv::imshow("Contours", img);
- +
- +
- +}
- +
- +std::vector<cv::Point> Hand::findComplexContour(std::vector< std::vector<cv::Point> > contours) {
- + std::vector<cv::Point> contour;
- + int maxPoints = 0;
- + for (int i = 0; i < contours.size(); i++) {
- + if (contours[i].size() > maxPoints) {
- + maxPoints = contours[i].size();
- + contour = contours[i];
- + }
- + }
- + return contour;
- +}
- +
- +std::vector<cv::Point> Hand::clusterConvexHull(std::vector<cv::Point> convexHull, int threshold) {
- + std::vector<cv::Point> clusterHull;
- + int i = 0;
- + while (i < convexHull.size()) {
- + // Select a point from cluster
- + std::vector<cv::Point> cluster;
- + cv::Point hullPoint = convexHull[i];
- + cluster.push_back(hullPoint);
- + i++;
- + while (i < convexHull.size()) {
- + cv::Point clusterPoint = convexHull[i];
- + double distance = cv::norm(hullPoint - clusterPoint);
- + if (distance < threshold) {
- + cluster.push_back(clusterPoint);
- + i++;
- + }
- + else {
- + break;
- + }
- + }
- + hullPoint = cluster[cluster.size() / 2];
- + cv::Point center = findCenter(convexHull);
- + int maxDist = cv::norm(hullPoint - center);
- + for (int i = 0; i < cluster.size(); i++) {
- + if (cv::norm(cluster[i] - center) > maxDist) {
- + maxDist = cv::norm(cluster[i] - center);
- + hullPoint = cluster[i];
- + }
- + }
- + clusterHull.push_back(hullPoint);
- + }
- + return clusterHull;
- +}
- +
- +cv::Point Hand::findCenter(std::vector<cv::Point> contour) {
- + cv::Point center;
- + cv::Moments M = cv::moments(contour, false);
- + center = cv::Point((int)M.m10 / M.m00, (int)M.m01 / M.m00);
- + return center;
- +}
- +
- +bool Hand::touchObject(std::vector<double> &equation, const double threshold)
- +{
- + if (equation.size() == 0) {
- + return false;
- + }
- +
- + for (int i = 0; i < fingers_xyz.size(); i++) {
- + double x = fingers_xyz[i][0];
- + double y = fingers_xyz[i][1];
- + double z = fingers_xyz[i][2];
- + if (z == 0) {
- + return false;
- + }
- +
- + double z_hat = equation[0] * x + equation[1] * y + equation[2];
- + double r_squared = (z - z_hat) * (z - z_hat);
- +
- + if (r_squared < threshold) {
- + return true;
- + }
- + }
- +
- + return false;
- }
- \ No newline at end of file
- diff --git a/Hand.h b/Hand.h
- index 345bf47..62e57d7 100644
- --- a/Hand.h
- +++ b/Hand.h
- @@ -1,107 +1,105 @@
- -#pragma once
- -// C++ Libraries
- -#include <iostream>
- -#include <vector>
- -#include <cmath>
- -
- -// OpenCV Libraries
- -#include <opencv2/core/core.hpp>
- -#include <opencv2/core.hpp>
- -#include <opencv2/highgui/highgui.hpp>
- -#include <opencv2/highgui.hpp>
- -#include <opencv2/imgproc.hpp>
- -#include <opencv2/imgcodecs.hpp>
- -
- -class Hand {
- -public:
- -
- -
- - // Public constructors
- - /**
- - * Default constructor for a hand object
- - */
- - Hand();
- -
- - /**
- - * Constructs a hand object based on point cloud and constraints.
- - * @param xyzMap Input point cloud containing only the hand (nothing else can be in this point cluod)
- - * @param angle_treshhold Sharpest allowable angle formed by finger tip and neighboring defects
- - * @param cluster_thresh Maximum allowable distance between two finger tips
- - */
- - Hand(cv::Mat xyzMap, float angle_treshhold, int cluster_thresh = 30);
- -
- - /**
- - * Deconstructor for the hand object
- - */
- - ~Hand();
- -
- - // Public variables
- -
- - /**
- - * Maximum allowable distance between adjacent finger tips
- - */
- - int CLUSTER_THRESHOLD;
- -
- - /**
- - * (x,y,z) position of all detected finger tips
- - */
- - std::vector<cv::Vec3f> fingers_xyz;
- -
- - /**
- - * (i,j) coordinates of all detected finger tips
- - */
- - std::vector<cv::Point2i> fingers_ij;
- -
- - /**
- - * (x,y,z) position of hand centroid
- - */
- - cv::Vec3f centroid_xyz;
- -
- - /**
- - * (i,j) coordinates of hand centroid
- - */
- - cv::Point2i centroid_ij;
- -
- - /**
- - * (x,y,z) position of detected defects
- - */
- - std::vector<cv::Vec3f> defects_xyz;
- -
- - /**
- - * (i,j) position of detected defects
- - */
- - std::vector<cv::Point2i> defects_ij;
- -
- - // Public functions
- -
- - /**
- - * Determine whether one of the fingers is in contact with a tracked object.
- - * @param equation Regression equation of the object
- - * @param threshold Thickness of the plane modeled by the regression equation
- - * @return TRUE if hand is contacting a tracked object. FALSE otherwise
- - */
- - bool touchObject(std::vector<double> &equation, const double threshold);
- -
- -private:
- - // Private constructors
- - /**
- - * Find the contour with max number of vertices.
- - **/
- - std::vector<cv::Point> findComplexContour(std::vector< std::vector<cv::Point> > contours);
- -
- - /**
- - * Groups vertices within a threshold and selects the median of each group.
- - **/
- - std::vector<cv::Point> clusterConvexHull(std::vector<cv::Point> convexHull, int threshold);
- -
- - /**
- - * Find the centroid of contour using 0th and 1st degree moments
- - **/
- - cv::Point findCenter(std::vector<cv::Point> contour);
- -
- - // Private variables
- - float ANGLE_THRESHHOLD;
- -
- - // Private functions
- - void analyzeHand(cv::Mat xyzMap);
- -};
- +#pragma once
- +// C++ Libraries
- +#include <iostream>
- +#include <vector>
- +#include <cmath>
- +
- +// OpenCV Libraries
- +#include <opencv2/core/core.hpp>
- +#include <opencv2/core.hpp>
- +#include <opencv2/highgui/highgui.hpp>
- +#include <opencv2/highgui.hpp>
- +#include <opencv2/imgproc.hpp>
- +#include <opencv2/imgcodecs.hpp>
- +
- +class Hand {
- +public:
- + // Public constructors
- + /**
- + * Default constructor for a hand object
- + */
- + Hand();
- +
- + /**
- + * Constructs a hand object based on point cloud and constraints.
- + * @param xyzMap Input point cloud containing only the hand (nothing else can be in this point cluod)
- + * @param angle_treshhold Sharpest allowable angle formed by finger tip and neighboring defects
- + * @param cluster_thresh Maximum allowable distance between two finger tips
- + */
- + Hand(cv::Mat xyzMap, float angle_treshhold, int cluster_thresh = 30);
- +
- + /**
- + * Deconstructor for the hand object
- + */
- + ~Hand();
- +
- + // Public variables
- +
- + /**
- + * Maximum allowable distance between adjacent finger tips
- + */
- + int CLUSTER_THRESHOLD;
- +
- + /**
- + * (x,y,z) position of all detected finger tips
- + */
- + std::vector<cv::Vec3f> fingers_xyz;
- +
- + /**
- + * (i,j) coordinates of all detected finger tips
- + */
- + std::vector<cv::Point2i> fingers_ij;
- +
- + /**
- + * (x,y,z) position of hand centroid
- + */
- + cv::Vec3f centroid_xyz;
- +
- + /**
- + * (i,j) coordinates of hand centroid
- + */
- + cv::Point2i centroid_ij;
- +
- + /**
- + * (x,y,z) position of detected defects
- + */
- + std::vector<cv::Vec3f> defects_xyz;
- +
- + /**
- + * (i,j) position of detected defects
- + */
- + std::vector<cv::Point2i> defects_ij;
- +
- + // Public functions
- +
- + /**
- + * Determine whether one of the fingers is in contact with a tracked object.
- + * @param equation Regression equation of the object
- + * @param threshold Thickness of the plane modeled by the regression equation
- + * @return TRUE if hand is contacting a tracked object. FALSE otherwise
- + */
- + bool touchObject(std::vector<double> &equation, const double threshold);
- +
- +private:
- + // Private constructors
- + /**
- + * Find the contour with max number of vertices.
- + **/
- + std::vector<cv::Point> findComplexContour(std::vector< std::vector<cv::Point> > contours);
- +
- + /**
- + * Groups vertices within a threshold and selects the median of each group.
- + **/
- + std::vector<cv::Point> clusterConvexHull(std::vector<cv::Point> convexHull, int threshold);
- +
- + /**
- + * Find the centroid of contour using 0th and 1st degree moments
- + **/
- + cv::Point findCenter(std::vector<cv::Point> contour);
- +
- + // Private variables
- + float ANGLE_THRESHHOLD;
- +
- + // Private functions
- + void analyzeHand(cv::Mat xyzMap);
- +};
- diff --git a/LICENSE.md b/LICENSE.md
- index e787980..4053413 100644
- --- a/LICENSE.md
- +++ b/LICENSE.md
- @@ -1,201 +1,201 @@
- - Apache License
- - Version 2.0, January 2004
- - http://www.apache.org/licenses/
- -
- - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
- -
- - 1. Definitions.
- -
- - "License" shall mean the terms and conditions for use, reproduction,
- - and distribution as defined by Sections 1 through 9 of this document.
- -
- - "Licensor" shall mean the copyright owner or entity authorized by
- - the copyright owner that is granting the License.
- -
- - "Legal Entity" shall mean the union of the acting entity and all
- - other entities that control, are controlled by, or are under common
- - control with that entity. For the purposes of this definition,
- - "control" means (i) the power, direct or indirect, to cause the
- - direction or management of such entity, whether by contract or
- - otherwise, or (ii) ownership of fifty percent (50%) or more of the
- - outstanding shares, or (iii) beneficial ownership of such entity.
- -
- - "You" (or "Your") shall mean an individual or Legal Entity
- - exercising permissions granted by this License.
- -
- - "Source" form shall mean the preferred form for making modifications,
- - including but not limited to software source code, documentation
- - source, and configuration files.
- -
- - "Object" form shall mean any form resulting from mechanical
- - transformation or translation of a Source form, including but
- - not limited to compiled object code, generated documentation,
- - and conversions to other media types.
- -
- - "Work" shall mean the work of authorship, whether in Source or
- - Object form, made available under the License, as indicated by a
- - copyright notice that is included in or attached to the work
- - (an example is provided in the Appendix below).
- -
- - "Derivative Works" shall mean any work, whether in Source or Object
- - form, that is based on (or derived from) the Work and for which the
- - editorial revisions, annotations, elaborations, or other modifications
- - represent, as a whole, an original work of authorship. For the purposes
- - of this License, Derivative Works shall not include works that remain
- - separable from, or merely link (or bind by name) to the interfaces of,
- - the Work and Derivative Works thereof.
- -
- - "Contribution" shall mean any work of authorship, including
- - the original version of the Work and any modifications or additions
- - to that Work or Derivative Works thereof, that is intentionally
- - submitted to Licensor for inclusion in the Work by the copyright owner
- - or by an individual or Legal Entity authorized to submit on behalf of
- - the copyright owner. For the purposes of this definition, "submitted"
- - means any form of electronic, verbal, or written communication sent
- - to the Licensor or its representatives, including but not limited to
- - communication on electronic mailing lists, source code control systems,
- - and issue tracking systems that are managed by, or on behalf of, the
- - Licensor for the purpose of discussing and improving the Work, but
- - excluding communication that is conspicuously marked or otherwise
- - designated in writing by the copyright owner as "Not a Contribution."
- -
- - "Contributor" shall mean Licensor and any individual or Legal Entity
- - on behalf of whom a Contribution has been received by Licensor and
- - subsequently incorporated within the Work.
- -
- - 2. Grant of Copyright License. Subject to the terms and conditions of
- - this License, each Contributor hereby grants to You a perpetual,
- - worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- - copyright license to reproduce, prepare Derivative Works of,
- - publicly display, publicly perform, sublicense, and distribute the
- - Work and such Derivative Works in Source or Object form.
- -
- - 3. Grant of Patent License. Subject to the terms and conditions of
- - this License, each Contributor hereby grants to You a perpetual,
- - worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- - (except as stated in this section) patent license to make, have made,
- - use, offer to sell, sell, import, and otherwise transfer the Work,
- - where such license applies only to those patent claims licensable
- - by such Contributor that are necessarily infringed by their
- - Contribution(s) alone or by combination of their Contribution(s)
- - with the Work to which such Contribution(s) was submitted. If You
- - institute patent litigation against any entity (including a
- - cross-claim or counterclaim in a lawsuit) alleging that the Work
- - or a Contribution incorporated within the Work constitutes direct
- - or contributory patent infringement, then any patent licenses
- - granted to You under this License for that Work shall terminate
- - as of the date such litigation is filed.
- -
- - 4. Redistribution. You may reproduce and distribute copies of the
- - Work or Derivative Works thereof in any medium, with or without
- - modifications, and in Source or Object form, provided that You
- - meet the following conditions:
- -
- - (a) You must give any other recipients of the Work or
- - Derivative Works a copy of this License; and
- -
- - (b) You must cause any modified files to carry prominent notices
- - stating that You changed the files; and
- -
- - (c) You must retain, in the Source form of any Derivative Works
- - that You distribute, all copyright, patent, trademark, and
- - attribution notices from the Source form of the Work,
- - excluding those notices that do not pertain to any part of
- - the Derivative Works; and
- -
- - (d) If the Work includes a "NOTICE" text file as part of its
- - distribution, then any Derivative Works that You distribute must
- - include a readable copy of the attribution notices contained
- - within such NOTICE file, excluding those notices that do not
- - pertain to any part of the Derivative Works, in at least one
- - of the following places: within a NOTICE text file distributed
- - as part of the Derivative Works; within the Source form or
- - documentation, if provided along with the Derivative Works; or,
- - within a display generated by the Derivative Works, if and
- - wherever such third-party notices normally appear. The contents
- - of the NOTICE file are for informational purposes only and
- - do not modify the License. You may add Your own attribution
- - notices within Derivative Works that You distribute, alongside
- - or as an addendum to the NOTICE text from the Work, provided
- - that such additional attribution notices cannot be construed
- - as modifying the License.
- -
- - You may add Your own copyright statement to Your modifications and
- - may provide additional or different license terms and conditions
- - for use, reproduction, or distribution of Your modifications, or
- - for any such Derivative Works as a whole, provided Your use,
- - reproduction, and distribution of the Work otherwise complies with
- - the conditions stated in this License.
- -
- - 5. Submission of Contributions. Unless You explicitly state otherwise,
- - any Contribution intentionally submitted for inclusion in the Work
- - by You to the Licensor shall be under the terms and conditions of
- - this License, without any additional terms or conditions.
- - Notwithstanding the above, nothing herein shall supersede or modify
- - the terms of any separate license agreement you may have executed
- - with Licensor regarding such Contributions.
- -
- - 6. Trademarks. This License does not grant permission to use the trade
- - names, trademarks, service marks, or product names of the Licensor,
- - except as required for reasonable and customary use in describing the
- - origin of the Work and reproducing the content of the NOTICE file.
- -
- - 7. Disclaimer of Warranty. Unless required by applicable law or
- - agreed to in writing, Licensor provides the Work (and each
- - Contributor provides its Contributions) on an "AS IS" BASIS,
- - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- - implied, including, without limitation, any warranties or conditions
- - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- - PARTICULAR PURPOSE. You are solely responsible for determining the
- - appropriateness of using or redistributing the Work and assume any
- - risks associated with Your exercise of permissions under this License.
- -
- - 8. Limitation of Liability. In no event and under no legal theory,
- - whether in tort (including negligence), contract, or otherwise,
- - unless required by applicable law (such as deliberate and grossly
- - negligent acts) or agreed to in writing, shall any Contributor be
- - liable to You for damages, including any direct, indirect, special,
- - incidental, or consequential damages of any character arising as a
- - result of this License or out of the use or inability to use the
- - Work (including but not limited to damages for loss of goodwill,
- - work stoppage, computer failure or malfunction, or any and all
- - other commercial damages or losses), even if such Contributor
- - has been advised of the possibility of such damages.
- -
- - 9. Accepting Warranty or Additional Liability. While redistributing
- - the Work or Derivative Works thereof, You may choose to offer,
- - and charge a fee for, acceptance of support, warranty, indemnity,
- - or other liability obligations and/or rights consistent with this
- - License. However, in accepting such obligations, You may act only
- - on Your own behalf and on Your sole responsibility, not on behalf
- - of any other Contributor, and only if You agree to indemnify,
- - defend, and hold each Contributor harmless for any liability
- - incurred by, or claims asserted against, such Contributor by reason
- - of your accepting any such warranty or additional liability.
- -
- - END OF TERMS AND CONDITIONS
- -
- - APPENDIX: How to apply the Apache License to your work.
- -
- - To apply the Apache License to your work, attach the following
- - boilerplate notice, with the fields enclosed by brackets "{}"
- - replaced with your own identifying information. (Don't include
- - the brackets!) The text should be enclosed in the appropriate
- - comment syntax for the file format. We also recommend that a
- - file or class name and description of purpose be included on the
- - same "printed page" as the copyright notice for easier
- - identification within third-party archives.
- -
- - Copyright {2017} {UC Berkeley}
- -
- - Licensed under the Apache License, Version 2.0 (the "License");
- - you may not use this file except in compliance with the License.
- - You may obtain a copy of the License at
- -
- - http://www.apache.org/licenses/LICENSE-2.0
- -
- - Unless required by applicable law or agreed to in writing, software
- - distributed under the License is distributed on an "AS IS" BASIS,
- - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- - See the License for the specific language governing permissions and
- - limitations under the License.
- + Apache License
- + Version 2.0, January 2004
- + http://www.apache.org/licenses/
- +
- + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
- +
- + 1. Definitions.
- +
- + "License" shall mean the terms and conditions for use, reproduction,
- + and distribution as defined by Sections 1 through 9 of this document.
- +
- + "Licensor" shall mean the copyright owner or entity authorized by
- + the copyright owner that is granting the License.
- +
- + "Legal Entity" shall mean the union of the acting entity and all
- + other entities that control, are controlled by, or are under common
- + control with that entity. For the purposes of this definition,
- + "control" means (i) the power, direct or indirect, to cause the
- + direction or management of such entity, whether by contract or
- + otherwise, or (ii) ownership of fifty percent (50%) or more of the
- + outstanding shares, or (iii) beneficial ownership of such entity.
- +
- + "You" (or "Your") shall mean an individual or Legal Entity
- + exercising permissions granted by this License.
- +
- + "Source" form shall mean the preferred form for making modifications,
- + including but not limited to software source code, documentation
- + source, and configuration files.
- +
- + "Object" form shall mean any form resulting from mechanical
- + transformation or translation of a Source form, including but
- + not limited to compiled object code, generated documentation,
- + and conversions to other media types.
- +
- + "Work" shall mean the work of authorship, whether in Source or
- + Object form, made available under the License, as indicated by a
- + copyright notice that is included in or attached to the work
- + (an example is provided in the Appendix below).
- +
- + "Derivative Works" shall mean any work, whether in Source or Object
- + form, that is based on (or derived from) the Work and for which the
- + editorial revisions, annotations, elaborations, or other modifications
- + represent, as a whole, an original work of authorship. For the purposes
- + of this License, Derivative Works shall not include works that remain
- + separable from, or merely link (or bind by name) to the interfaces of,
- + the Work and Derivative Works thereof.
- +
- + "Contribution" shall mean any work of authorship, including
- + the original version of the Work and any modifications or additions
- + to that Work or Derivative Works thereof, that is intentionally
- + submitted to Licensor for inclusion in the Work by the copyright owner
- + or by an individual or Legal Entity authorized to submit on behalf of
- + the copyright owner. For the purposes of this definition, "submitted"
- + means any form of electronic, verbal, or written communication sent
- + to the Licensor or its representatives, including but not limited to
- + communication on electronic mailing lists, source code control systems,
- + and issue tracking systems that are managed by, or on behalf of, the
- + Licensor for the purpose of discussing and improving the Work, but
- + excluding communication that is conspicuously marked or otherwise
- + designated in writing by the copyright owner as "Not a Contribution."
- +
- + "Contributor" shall mean Licensor and any individual or Legal Entity
- + on behalf of whom a Contribution has been received by Licensor and
- + subsequently incorporated within the Work.
- +
- + 2. Grant of Copyright License. Subject to the terms and conditions of
- + this License, each Contributor hereby grants to You a perpetual,
- + worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- + copyright license to reproduce, prepare Derivative Works of,
- + publicly display, publicly perform, sublicense, and distribute the
- + Work and such Derivative Works in Source or Object form.
- +
- + 3. Grant of Patent License. Subject to the terms and conditions of
- + this License, each Contributor hereby grants to You a perpetual,
- + worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- + (except as stated in this section) patent license to make, have made,
- + use, offer to sell, sell, import, and otherwise transfer the Work,
- + where such license applies only to those patent claims licensable
- + by such Contributor that are necessarily infringed by their
- + Contribution(s) alone or by combination of their Contribution(s)
- + with the Work to which such Contribution(s) was submitted. If You
- + institute patent litigation against any entity (including a
- + cross-claim or counterclaim in a lawsuit) alleging that the Work
- + or a Contribution incorporated within the Work constitutes direct
- + or contributory patent infringement, then any patent licenses
- + granted to You under this License for that Work shall terminate
- + as of the date such litigation is filed.
- +
- + 4. Redistribution. You may reproduce and distribute copies of the
- + Work or Derivative Works thereof in any medium, with or without
- + modifications, and in Source or Object form, provided that You
- + meet the following conditions:
- +
- + (a) You must give any other recipients of the Work or
- + Derivative Works a copy of this License; and
- +
- + (b) You must cause any modified files to carry prominent notices
- + stating that You changed the files; and
- +
- + (c) You must retain, in the Source form of any Derivative Works
- + that You distribute, all copyright, patent, trademark, and
- + attribution notices from the Source form of the Work,
- + excluding those notices that do not pertain to any part of
- + the Derivative Works; and
- +
- + (d) If the Work includes a "NOTICE" text file as part of its
- + distribution, then any Derivative Works that You distribute must
- + include a readable copy of the attribution notices contained
- + within such NOTICE file, excluding those notices that do not
- + pertain to any part of the Derivative Works, in at least one
- + of the following places: within a NOTICE text file distributed
- + as part of the Derivative Works; within the Source form or
- + documentation, if provided along with the Derivative Works; or,
- + within a display generated by the Derivative Works, if and
- + wherever such third-party notices normally appear. The contents
- + of the NOTICE file are for informational purposes only and
- + do not modify the License. You may add Your own attribution
- + notices within Derivative Works that You distribute, alongside
- + or as an addendum to the NOTICE text from the Work, provided
- + that such additional attribution notices cannot be construed
- + as modifying the License.
- +
- + You may add Your own copyright statement to Your modifications and
- + may provide additional or different license terms and conditions
- + for use, reproduction, or distribution of Your modifications, or
- + for any such Derivative Works as a whole, provided Your use,
- + reproduction, and distribution of the Work otherwise complies with
- + the conditions stated in this License.
- +
- + 5. Submission of Contributions. Unless You explicitly state otherwise,
- + any Contribution intentionally submitted for inclusion in the Work
- + by You to the Licensor shall be under the terms and conditions of
- + this License, without any additional terms or conditions.
- + Notwithstanding the above, nothing herein shall supersede or modify
- + the terms of any separate license agreement you may have executed
- + with Licensor regarding such Contributions.
- +
- + 6. Trademarks. This License does not grant permission to use the trade
- + names, trademarks, service marks, or product names of the Licensor,
- + except as required for reasonable and customary use in describing the
- + origin of the Work and reproducing the content of the NOTICE file.
- +
- + 7. Disclaimer of Warranty. Unless required by applicable law or
- + agreed to in writing, Licensor provides the Work (and each
- + Contributor provides its Contributions) on an "AS IS" BASIS,
- + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- + implied, including, without limitation, any warranties or conditions
- + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- + PARTICULAR PURPOSE. You are solely responsible for determining the
- + appropriateness of using or redistributing the Work and assume any
- + risks associated with Your exercise of permissions under this License.
- +
- + 8. Limitation of Liability. In no event and under no legal theory,
- + whether in tort (including negligence), contract, or otherwise,
- + unless required by applicable law (such as deliberate and grossly
- + negligent acts) or agreed to in writing, shall any Contributor be
- + liable to You for damages, including any direct, indirect, special,
- + incidental, or consequential damages of any character arising as a
- + result of this License or out of the use or inability to use the
- + Work (including but not limited to damages for loss of goodwill,
- + work stoppage, computer failure or malfunction, or any and all
- + other commercial damages or losses), even if such Contributor
- + has been advised of the possibility of such damages.
- +
- + 9. Accepting Warranty or Additional Liability. While redistributing
- + the Work or Derivative Works thereof, You may choose to offer,
- + and charge a fee for, acceptance of support, warranty, indemnity,
- + or other liability obligations and/or rights consistent with this
- + License. However, in accepting such obligations, You may act only
- + on Your own behalf and on Your sole responsibility, not on behalf
- + of any other Contributor, and only if You agree to indemnify,
- + defend, and hold each Contributor harmless for any liability
- + incurred by, or claims asserted against, such Contributor by reason
- + of your accepting any such warranty or additional liability.
- +
- + END OF TERMS AND CONDITIONS
- +
- + APPENDIX: How to apply the Apache License to your work.
- +
- + To apply the Apache License to your work, attach the following
- + boilerplate notice, with the fields enclosed by brackets "{}"
- + replaced with your own identifying information. (Don't include
- + the brackets!) The text should be enclosed in the appropriate
- + comment syntax for the file format. We also recommend that a
- + file or class name and description of purpose be included on the
- + same "printed page" as the copyright notice for easier
- + identification within third-party archives.
- +
- + Copyright {2017} {UC Berkeley}
- +
- + Licensed under the Apache License, Version 2.0 (the "License");
- + you may not use this file except in compliance with the License.
- + You may obtain a copy of the License at
- +
- + http://www.apache.org/licenses/LICENSE-2.0
- +
- + Unless required by applicable law or agreed to in writing, software
- + distributed under the License is distributed on an "AS IS" BASIS,
- + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- + See the License for the specific language governing permissions and
- + limitations under the License.
- diff --git a/LightVis - Shortcut.lnk b/LightVis - Shortcut.lnk
- deleted file mode 100644
- index 049ee43..0000000
- Binary files a/LightVis - Shortcut.lnk and /dev/null differ
- diff --git a/Object3D.cpp b/Object3D.cpp
- index e87caba..99fcbb3 100644
- --- a/Object3D.cpp
- +++ b/Object3D.cpp
- @@ -1,174 +1,174 @@
- -#include "Object3D.h"
- -#include "Visualizer.h"
- -#include "Util.h"
- -
- -Object3D::Object3D()
- -{
- -
- -}
- -
- -Object3D::Object3D(cv::Mat cluster) {
- - // Step 1: Initialize variables
- - rightEdgeConnected = false;
- - leftEdgeConnected = false;
- - hasHand = false;
- - hasPlane = false;
- - hasShape = false;
- -
- - // Step 1: determine whether cluster is hand
- -
- - if (checkForHand(cluster, 0.005, 0.25)) {
- - hand = Hand(cluster, 50);
- - hasHand = true;
- - return;
- - }
- -
- -
- - // Step 2: determine whether there is a plane
- -
- - plane = new Plane(cluster);
- - // Step 2.1 If there is plane, remove plane and look for hand
- - std::vector<cv::Point2i> points = plane->getPlaneIndicies();
- - if (points.size() != 0) {
- - hasPlane = true;
- - for (int i = 0; i < points.size();i++) {
- - int x = points[i].x;
- - int y = points[i].y;
- - cluster.at<cv::Vec3f>(y, x)[0] = 0;
- - cluster.at<cv::Vec3f>(y, x)[1] = 0;
- - cluster.at<cv::Vec3f>(y, x)[2] = 0;
- - }
- -
- - cv::Point center = Util::findCentroid(cluster);
- -
- - cv::Mat hand_cluster = cv::Mat::zeros(cluster.rows, cluster.cols, cluster.type());
- - Util::floodFill(center.x, center.y, cluster, hand_cluster, 0.02);
- -
- - if (checkForHand(hand_cluster, -0.99, 0.2)) {
- - hand = Hand(hand_cluster, 30);
- - double finger_length = Util::euclidianDistance3D(hand.fingers_xyz[0], hand.centroid_xyz);
- - if (finger_length > 0.03 && finger_length < 0.2) {
- - hasHand = true;
- - return;
- - }
- - }
- - }
- -
- -
- - // Step 2.1.1 If there is plane, no hand, then the rest of points are shape
- - shape = cluster;
- - hasShape = true;
- -}
- -
- -Hand Object3D::getHand() {
- - return hand;
- -}
- -
- -Plane Object3D::getPlane() {
- - return *plane;
- -}
- -
- -cv::Mat Object3D::getShape() {
- - return shape;
- -}
- -
- -double Object3D::centroidCircleSweep(cv::Mat cluster, double distance)
- -{
- - cv::Mat channels[3];
- - cv::split(cluster, channels);
- - cv::Mat show_img = Visualizer::visualizeXYZMap(cluster);
- -
- - // Step 1: Find the center
- - cv::Moments m = cv::moments(channels[2], false);
- - cv::Point center(m.m10 / m.m00, m.m01 / m.m00);
- - cv::circle(show_img, center, 2, cv::Scalar(255, 0, 0),2);
- -
- - // Step 2: Find the radius (pixels) that correspond to distance (meters)
- - double distancePerPixel = Util::euclideanDistancePerPixel(cluster, center, 5);
- - int radius = distance / distancePerPixel;
- - if (radius <= 0 || radius > cluster.cols / 4) {
- - return -1;
- - }
- -
- - // Step 3: Extract all pixels within distance
- - cv::Mat binary_img;
- - cv::normalize(channels[2], binary_img, 0, 255, cv::NORM_MINMAX, CV_8UC1);
- - cv::Mat mask = cv::Mat::zeros(binary_img.size(), binary_img.type());
- - cv::Mat dstImg = cv::Mat::zeros(binary_img.size(), binary_img.type());
- - cv::circle(mask, center, radius, cv::Scalar(255, 255, 255));
- - binary_img.copyTo(dstImg, mask);
- -
- -
- - int covered = 0;
- - for (int r = center.y; r > 0; r--) {
- - for (int c = 0; c < dstImg.cols; c++) {
- - if (dstImg.at<uchar>(r, c) != 0) {
- - covered++;
- - }
- - }
- - }
- -
- - double coverage = (double) covered / cv::countNonZero(mask);
- - return coverage;
- -}
- -
- -bool Object3D::checkForHand(cv::Mat cluster, double min_coverage, double max_coverage, double pointer_finger_distance)
- -{
- - checkEdgeConnected(cluster);
- - if ((rightEdgeConnected && !leftEdgeConnected) || (leftEdgeConnected && rightEdgeConnected)) {
- - double coverage = centroidCircleSweep(cluster, pointer_finger_distance);
- - if (coverage < max_coverage && coverage > min_coverage) {
- - return true;
- - }
- - }
- -
- - return false;
- -}
- -
- -void Object3D::checkEdgeConnected(cv::Mat cluster) {
- - int cols = cluster.cols;
- - int rows = cluster.rows;
- -
- - // Bottom Sweep
- - int r = (int)(rows * 0.9);
- - for (int c = 0; c < cols / 4 ; c++) {
- - if (cluster.at<cv::Vec3f>(r, c)[2] != 0) {
- - leftEdgeConnected = true;
- - break;
- - }
- - }
- -
- - // Left Side Sweep
- - int c = (int)(cols * 0.2);
- - for (int r = 0; r < rows; r++) {
- - if (cluster.at<cv::Vec3f>(r, c)[2] != 0) {
- - leftEdgeConnected = true;
- - break;
- - }
- - }
- -
- - // Bottom Sweep
- - r = (int)(rows * 0.9);
- - for (int c = cols / 4; c < cols; c++) {
- - if (cluster.at<cv::Vec3f>(r, c)[2] != 0) {
- - rightEdgeConnected = true;
- - break;
- - }
- - }
- -
- - // Right Side Sweep
- - c = (int)(cols * 0.8);
- - for (int r = rows / 2; r < rows; r++) {
- - if (cluster.at<cv::Vec3f>(r, c)[2] != 0) {
- - rightEdgeConnected = true;
- - break;
- - }
- - }
- -
- -}
- -
- -
- -Object3D::~Object3D()
- -{
- -
- +#include "Object3D.h"
- +#include "Visualizer.h"
- +#include "Util.h"
- +
- +Object3D::Object3D()
- +{
- +
- +}
- +
- +Object3D::Object3D(cv::Mat cluster) {
- + // Step 1: Initialize variables
- + rightEdgeConnected = false;
- + leftEdgeConnected = false;
- + hasHand = false;
- + hasPlane = false;
- + hasShape = false;
- +
- + // Step 1: determine whether cluster is hand
- +
- + if (checkForHand(cluster, 0.005, 0.25)) {
- + hand = Hand(cluster, 50);
- + hasHand = true;
- + return;
- + }
- +
- +
- + // Step 2: determine whether there is a plane
- +
- + plane = new Plane(cluster);
- + // Step 2.1 If there is plane, remove plane and look for hand
- + std::vector<cv::Point2i> points = plane->getPlaneIndicies();
- + if (points.size() != 0) {
- + hasPlane = true;
- + for (int i = 0; i < points.size();i++) {
- + int x = points[i].x;
- + int y = points[i].y;
- + cluster.at<cv::Vec3f>(y, x)[0] = 0;
- + cluster.at<cv::Vec3f>(y, x)[1] = 0;
- + cluster.at<cv::Vec3f>(y, x)[2] = 0;
- + }
- +
- + cv::Point center = Util::findCentroid(cluster);
- +
- + cv::Mat hand_cluster = cv::Mat::zeros(cluster.rows, cluster.cols, cluster.type());
- + Util::floodFill(center.x, center.y, cluster, hand_cluster, 0.02);
- +
- + if (checkForHand(hand_cluster, -0.99, 0.2)) {
- + hand = Hand(hand_cluster, 30);
- + double finger_length = Util::euclidianDistance3D(hand.fingers_xyz[0], hand.centroid_xyz);
- + if (finger_length > 0.03 && finger_length < 0.2) {
- + hasHand = true;
- + return;
- + }
- + }
- + }
- +
- +
- + // Step 2.1.1 If there is plane, no hand, then the rest of points are shape
- + shape = cluster;
- + hasShape = true;
- +}
- +
- +Hand Object3D::getHand() {
- + return hand;
- +}
- +
- +Plane Object3D::getPlane() {
- + return *plane;
- +}
- +
- +cv::Mat Object3D::getShape() {
- + return shape;
- +}
- +
- +double Object3D::centroidCircleSweep(cv::Mat cluster, double distance)
- +{
- + cv::Mat channels[3];
- + cv::split(cluster, channels);
- + cv::Mat show_img = Visualizer::visualizeXYZMap(cluster);
- +
- + // Step 1: Find the center
- + cv::Moments m = cv::moments(channels[2], false);
- + cv::Point center(m.m10 / m.m00, m.m01 / m.m00);
- + cv::circle(show_img, center, 2, cv::Scalar(255, 0, 0),2);
- +
- + // Step 2: Find the radius (pixels) that correspond to distance (meters)
- + double distancePerPixel = Util::euclideanDistancePerPixel(cluster, center, 5);
- + int radius = distance / distancePerPixel;
- + if (radius <= 0 || radius > cluster.cols / 4) {
- + return -1;
- + }
- +
- + // Step 3: Extract all pixels within distance
- + cv::Mat binary_img;
- + cv::normalize(channels[2], binary_img, 0, 255, cv::NORM_MINMAX, CV_8UC1);
- + cv::Mat mask = cv::Mat::zeros(binary_img.size(), binary_img.type());
- + cv::Mat dstImg = cv::Mat::zeros(binary_img.size(), binary_img.type());
- + cv::circle(mask, center, radius, cv::Scalar(255, 255, 255));
- + binary_img.copyTo(dstImg, mask);
- +
- +
- + int covered = 0;
- + for (int r = center.y; r > 0; r--) {
- + for (int c = 0; c < dstImg.cols; c++) {
- + if (dstImg.at<uchar>(r, c) != 0) {
- + covered++;
- + }
- + }
- + }
- +
- + double coverage = (double) covered / cv::countNonZero(mask);
- + return coverage;
- +}
- +
- +bool Object3D::checkForHand(cv::Mat cluster, double min_coverage, double max_coverage, double pointer_finger_distance)
- +{
- + checkEdgeConnected(cluster);
- + if ((rightEdgeConnected && !leftEdgeConnected) || (leftEdgeConnected && rightEdgeConnected)) {
- + double coverage = centroidCircleSweep(cluster, pointer_finger_distance);
- + if (coverage < max_coverage && coverage > min_coverage) {
- + return true;
- + }
- + }
- +
- + return false;
- +}
- +
- +void Object3D::checkEdgeConnected(cv::Mat cluster) {
- + int cols = cluster.cols;
- + int rows = cluster.rows;
- +
- + // Bottom Sweep
- + int r = (int)(rows * 0.9);
- + for (int c = 0; c < cols / 4 ; c++) {
- + if (cluster.at<cv::Vec3f>(r, c)[2] != 0) {
- + leftEdgeConnected = true;
- + break;
- + }
- + }
- +
- + // Left Side Sweep
- + int c = (int)(cols * 0.2);
- + for (int r = 0; r < rows; r++) {
- + if (cluster.at<cv::Vec3f>(r, c)[2] != 0) {
- + leftEdgeConnected = true;
- + break;
- + }
- + }
- +
- + // Bottom Sweep
- + r = (int)(rows * 0.9);
- + for (int c = cols / 4; c < cols; c++) {
- + if (cluster.at<cv::Vec3f>(r, c)[2] != 0) {
- + rightEdgeConnected = true;
- + break;
- + }
- + }
- +
- + // Right Side Sweep
- + c = (int)(cols * 0.8);
- + for (int r = rows / 2; r < rows; r++) {
- + if (cluster.at<cv::Vec3f>(r, c)[2] != 0) {
- + rightEdgeConnected = true;
- + break;
- + }
- + }
- +
- +}
- +
- +
- +Object3D::~Object3D()
- +{
- +
- }
- \ No newline at end of file
- diff --git a/Object3D.h b/Object3D.h
- index 115e91b..cf3f61b 100644
- --- a/Object3D.h
- +++ b/Object3D.h
- @@ -1,110 +1,111 @@
- -#pragma once
- -// OpenARK Libraries
- -#include "Hand.h"
- -#include "Plane.h"
- -
- -class Object3D
- -{
- -public:
- - /**
- - * Whether the object is attached to the right edge of the frame.
- - * Edge connected implies that object is likely connected to the user's body (hand, arm, etc)
- - */
- - bool rightEdgeConnected;
- -
- - /**
- - * Whether the object is attached to the left edge of the frame.
- - * Edge connected implies that object is likely connected to the user's body (hand, arm, etc)
- - */
- - bool leftEdgeConnected;
- -
- - /**
- - * Constructs a empty instance of a Object3D.
- - */
- - Object3D();
- -
- - /**
- - * Constructs a instance of Object3D based on a point cloud.
- - * @param cluster point cloud representatino of the object
- - */
- - Object3D(cv::Mat cluster);
- -
- - /**
- - * Deconstructs a Object3D instance.
- - */
- - ~Object3D();
- -
- - /**
- - * Whether the object contains a hand.
- - */
- - bool hasHand;
- -
- - /**
- - * Whether the object contains a plane.
- - */
- - bool hasPlane;
- -
- - /**
- - * Whether the object contains a shape.
- - * A shape is defined by anything that is not a plane or a hand
- - */
- - bool hasShape;
- -
- - /**
- - * Gets instance of hand object if a hand is found.
- - * @return instance of hand object
- - */
- - Hand getHand();
- -
- - /**
- - * Gets instance of plane object is plane is found.
- - * @return instance of plane object
- - */
- - Plane getPlane();
- -
- - /**
- - * Gets instance of shape object.
- - * @return instance of shape object
- - */
- - cv::Mat getShape();
- -
- -private:
- - /**
- - * Reference to the hand instance.
- - */
- - Hand hand;
- -
- - /**
- - * Reference to the plane instance.
- - */
- - Plane *plane;
- -
- - /**
- - * Reference to the shape instance.
- - */
- - cv::Mat shape;
- -
- - /**
- - * Determine whether the object is connected to an edge.
- - * @param cluster point cloud of the object
- - */
- - void checkEdgeConnected(cv::Mat cluster);
- -
- - /**
- - * Check whether the object is a hand
- - * @param cluster the input point cloud
- - * @param min_coverage the smallest allowable coverage for the index finger
- - * @param max_coverage the maximum allowable coverage for the index finger
- - * @param pointer_finger_distance the length of the pointer finger (meters)
- - * @return whether the cluster is a hand
- - */
- - bool checkForHand(cv::Mat cluster, double min_coverage, double max_coverage, double pointer_finger_distance = 0.08);
- -
- - /**
- - * Returns all points within a radius of a centroid
- - * @param cluster the input point cloud
- - * @param distance the radius (meters)
- - * @return the percentage of points in the cluster that is "distance" away from the centroid
- - */
- - double centroidCircleSweep(cv::Mat cluster, double distance);
- +#pragma once
- +
- +// OpenARK Libraries
- +#include "Hand.h"
- +#include "Plane.h"
- +
- +class Object3D
- +{
- +public:
- + /**
- + * Whether the object is attached to the right edge of the frame.
- + * Edge connected implies that object is likely connected to the user's body (hand, arm, etc)
- + */
- + bool rightEdgeConnected;
- +
- + /**
- + * Whether the object is attached to the left edge of the frame.
- + * Edge connected implies that object is likely connected to the user's body (hand, arm, etc)
- + */
- + bool leftEdgeConnected;
- +
- + /**
- + * Constructs a empty instance of a Object3D.
- + */
- + Object3D();
- +
- + /**
- + * Constructs a instance of Object3D based on a point cloud.
- + * @param cluster point cloud representatino of the object
- + */
- + Object3D(cv::Mat cluster);
- +
- + /**
- + * Deconstructs a Object3D instance.
- + */
- + ~Object3D();
- +
- + /**
- + * Whether the object contains a hand.
- + */
- + bool hasHand;
- +
- + /**
- + * Whether the object contains a plane.
- + */
- + bool hasPlane;
- +
- + /**
- + * Whether the object contains a shape.
- + * A shape is defined by anything that is not a plane or a hand
- + */
- + bool hasShape;
- +
- + /**
- + * Gets instance of hand object if a hand is found.
- + * @return instance of hand object
- + */
- + Hand getHand();
- +
- + /**
- + * Gets instance of plane object is plane is found.
- + * @return instance of plane object
- + */
- + Plane getPlane();
- +
- + /**
- + * Gets instance of shape object.
- + * @return instance of shape object
- + */
- + cv::Mat getShape();
- +
- +private:
- + /**
- + * Reference to the hand instance.
- + */
- + Hand hand;
- +
- + /**
- + * Reference to the plane instance.
- + */
- + Plane *plane;
- +
- + /**
- + * Reference to the shape instance.
- + */
- + cv::Mat shape;
- +
- + /**
- + * Determine whether the object is connected to an edge.
- + * @param cluster point cloud of the object
- + */
- + void checkEdgeConnected(cv::Mat cluster);
- +
- + /**
- + * Check whether the object is a hand
- + * @param cluster the input point cloud
- + * @param min_coverage the smallest allowable coverage for the index finger
- + * @param max_coverage the maximum allowable coverage for the index finger
- + * @param pointer_finger_distance the length of the pointer finger (meters)
- + * @return whether the cluster is a hand
- + */
- + bool checkForHand(cv::Mat cluster, double min_coverage, double max_coverage, double pointer_finger_distance = 0.08);
- +
- + /**
- + * Returns all points within a radius of a centroid
- + * @param cluster the input point cloud
- + * @param distance the radius (meters)
- + * @return the percentage of points in the cluster that is "distance" away from the centroid
- + */
- + double centroidCircleSweep(cv::Mat cluster, double distance);
- };
- \ No newline at end of file
- diff --git a/OpenARK-SDK.sln b/OpenARK-SDK.sln
- index c7657ec..9a96a38 100644
- --- a/OpenARK-SDK.sln
- +++ b/OpenARK-SDK.sln
- @@ -1,28 +1,28 @@
- -
- -Microsoft Visual Studio Solution File, Format Version 12.00
- -# Visual Studio 14
- -VisualStudioVersion = 14.0.25123.0
- -MinimumVisualStudioVersion = 10.0.40219.1
- -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenARK-SDK", "OpenARK-SDK\OpenARK-SDK.vcxproj", "{3625C413-17C5-47C4-8878-B43FADFD79E2}"
- -EndProject
- -Global
- - GlobalSection(SolutionConfigurationPlatforms) = preSolution
- - Debug|x64 = Debug|x64
- - Debug|x86 = Debug|x86
- - Release|x64 = Release|x64
- - Release|x86 = Release|x86
- - EndGlobalSection
- - GlobalSection(ProjectConfigurationPlatforms) = postSolution
- - {3625C413-17C5-47C4-8878-B43FADFD79E2}.Debug|x64.ActiveCfg = Debug|x64
- - {3625C413-17C5-47C4-8878-B43FADFD79E2}.Debug|x64.Build.0 = Debug|x64
- - {3625C413-17C5-47C4-8878-B43FADFD79E2}.Debug|x86.ActiveCfg = Debug|Win32
- - {3625C413-17C5-47C4-8878-B43FADFD79E2}.Debug|x86.Build.0 = Debug|Win32
- - {3625C413-17C5-47C4-8878-B43FADFD79E2}.Release|x64.ActiveCfg = Release|x64
- - {3625C413-17C5-47C4-8878-B43FADFD79E2}.Release|x64.Build.0 = Release|x64
- - {3625C413-17C5-47C4-8878-B43FADFD79E2}.Release|x86.ActiveCfg = Release|Win32
- - {3625C413-17C5-47C4-8878-B43FADFD79E2}.Release|x86.Build.0 = Release|Win32
- - EndGlobalSection
- - GlobalSection(SolutionProperties) = preSolution
- - HideSolutionNode = FALSE
- - EndGlobalSection
- -EndGlobal
- +
- +Microsoft Visual Studio Solution File, Format Version 12.00
- +# Visual Studio 14
- +VisualStudioVersion = 14.0.25123.0
- +MinimumVisualStudioVersion = 10.0.40219.1
- +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OpenARK-SDK", "OpenARK-SDK\OpenARK-SDK.vcxproj", "{3625C413-17C5-47C4-8878-B43FADFD79E2}"
- +EndProject
- +Global
- + GlobalSection(SolutionConfigurationPlatforms) = preSolution
- + Debug|x64 = Debug|x64
- + Debug|x86 = Debug|x86
- + Release|x64 = Release|x64
- + Release|x86 = Release|x86
- + EndGlobalSection
- + GlobalSection(ProjectConfigurationPlatforms) = postSolution
- + {3625C413-17C5-47C4-8878-B43FADFD79E2}.Debug|x64.ActiveCfg = Debug|x64
- + {3625C413-17C5-47C4-8878-B43FADFD79E2}.Debug|x64.Build.0 = Debug|x64
- + {3625C413-17C5-47C4-8878-B43FADFD79E2}.Debug|x86.ActiveCfg = Debug|Win32
- + {3625C413-17C5-47C4-8878-B43FADFD79E2}.Debug|x86.Build.0 = Debug|Win32
- + {3625C413-17C5-47C4-8878-B43FADFD79E2}.Release|x64.ActiveCfg = Release|x64
- + {3625C413-17C5-47C4-8878-B43FADFD79E2}.Release|x64.Build.0 = Release|x64
- + {3625C413-17C5-47C4-8878-B43FADFD79E2}.Release|x86.ActiveCfg = Release|Win32
- + {3625C413-17C5-47C4-8878-B43FADFD79E2}.Release|x86.Build.0 = Release|Win32
- + EndGlobalSection
- + GlobalSection(SolutionProperties) = preSolution
- + HideSolutionNode = FALSE
- + EndGlobalSection
- +EndGlobal
- diff --git a/OpenARK-SDK/CMakeFindPackage.tx b/OpenARK-SDK/CMakeFindPackage.tx
- index 316e9bc..1d69a0a 100644
- --- a/OpenARK-SDK/CMakeFindPackage.tx
- +++ b/OpenARK-SDK/CMakeFindPackage.tx
- @@ -1,6 +1,6 @@
- -FIND_PACKAGE([%package%] REQUIRED)
- -IF ([%package%]_FOUND)
- - INCLUDE_DIRECTORIES(${[%package%]_INCLUDE_DIR})
- - ADD_DEFINITIONS( "-DHAS_[%package_upcase%]" )
- -ENDIF()
- +FIND_PACKAGE([%package%] REQUIRED)
- +IF ([%package%]_FOUND)
- + INCLUDE_DIRECTORIES(${[%package%]_INCLUDE_DIR})
- + ADD_DEFINITIONS( "-DHAS_[%package_upcase%]" )
- +ENDIF()
- \ No newline at end of file
- diff --git a/OpenARK-SDK/CMakeLists.tx b/OpenARK-SDK/CMakeLists.tx
- index 2ca3e1e..12eacbd 100644
- --- a/OpenARK-SDK/CMakeLists.tx
- +++ b/OpenARK-SDK/CMakeLists.tx
- @@ -1,88 +1,88 @@
- -cmake_minimum_required(VERSION 2.8)
- -
- -## section: Macro
- -MACRO(ADD_MSVC_PRECOMPILED_HEADER PrecompiledHeader PrecompiledSource SourcesVar)
- - IF(MSVC)
- - GET_FILENAME_COMPONENT(PrecompiledBasename ${PrecompiledHeader} NAME_WE)
- - SET(PrecompiledBinary "${CMAKE_CURRENT_BINARY_DIR}/${PrecompiledBasename}.pch")
- - SET(Sources ${${SourcesVar}})
- -
- - SET_SOURCE_FILES_PROPERTIES(${PrecompiledSource}
- - PROPERTIES COMPILE_FLAGS "/Yc\"${PrecompiledHeader}\" /Fp\"${PrecompiledBinary}\""
- - OBJECT_OUTPUTS "${PrecompiledBinary}")
- - SET_SOURCE_FILES_PROPERTIES(${Sources}
- - PROPERTIES COMPILE_FLAGS "/Yu\"${PrecompiledBinary}\" /FI\"${PrecompiledBinary}\" /Fp\"${PrecompiledBinary}\""
- - OBJECT_DEPENDS "${PrecompiledBinary}")
- - # Add precompiled header to SourcesVar
- - LIST(APPEND ${SourcesVar} ${PrecompiledSource})
- - ENDIF(MSVC)
- -ENDMACRO(ADD_MSVC_PRECOMPILED_HEADER)
- -
- -## start setting
- -SET (this_target [% $target %])
- -PROJECT(${this_target})
- -
- -[% IF charset == 'Unicode' %]
- -add_definitions(-DUNICODE -D_UNICODE)
- -[% END %]
- -
- -## section: include directory
- -INCLUDE_DIRECTORIES(
- - [% $include %]
- - )
- -
- -## section: source files
- -# Add your source files here (one file per line), please SORT in alphabetical order for future maintenance
- -SET (${this_target}_SOURCE_FILES
- - [% $src %]
- - )
- -
- -## section: header files
- -# Add your header files here(one file per line), please SORT in alphabetical order for future maintenance!
- -SET(${this_target}_HEADER_FILES
- - [% $header %]
- - )
- -
- -[% source_groups %]
- -
- -## section: precompiled header
- -#ADD_MSVC_PRECOMPILED_HEADER("precompiled.h" "precompiled.cpp" MySources)
- -#ADD_LIBRARY(MyLibrary ${MySources})
- -
- -SET_SOURCE_FILES_PROPERTIES(${this_target}_HEADER_FILES
- - PROPERTIES HEADER_FILE_ONLY TRUE)
- -LIST(APPEND ${this_target}_SOURCE_FILES ${${this_target}_HEADER_FILES})
- -
- -## section: add definitions
- -# add prefix -D. example> -DSHP
- -# - DO NOT add the following definitions(already defined in ${OSP_DEFINITIONS}:
- -# -DSHP, -DWIN32, -D_WINDOWS, -D_DEBUG, -D_USRDLL, -D_CRT_SECURE_NO_DEPRECATE
- -ADD_DEFINITIONS(
- - [% $def %]
- - )
- -
- -## section: add target
- -[% SWITCH type %]
- -[% CASE 'Application' %]
- -ADD_EXECUTABLE(${this_target} ${${this_target}_SOURCE_FILES})
- -[% CASE 'DynamicLibrary' %]
- -ADD_LIBRARY(${this_target} SHARED ${${this_target}_SOURCE_FILES} )
- -[% CASE 'StaticLibrary' %]
- -ADD_LIBRARY(${this_target} STATIC ${${this_target}_SOURCE_FILES} )
- -[% CASE 'Module' %]
- -ADD_LIBRARY(${this_target} MODULE ${${this_target}_SOURCE_FILES} )
- -[% END %]
- -
- -[%- IF lib -%]
- -## section: add dependency
- -# dependency determines overall build order.
- -ADD_DEPENDENCIES(${this_target}
- - [% $lib %]
- - )
- -
- -## section: set link libraries
- -TARGET_LINK_LIBRARIES( ${this_target}
- - [% $lib %]
- - )
- -[%- END -%]
- -
- +cmake_minimum_required(VERSION 2.8)
- +
- +## section: Macro
- +MACRO(ADD_MSVC_PRECOMPILED_HEADER PrecompiledHeader PrecompiledSource SourcesVar)
- + IF(MSVC)
- + GET_FILENAME_COMPONENT(PrecompiledBasename ${PrecompiledHeader} NAME_WE)
- + SET(PrecompiledBinary "${CMAKE_CURRENT_BINARY_DIR}/${PrecompiledBasename}.pch")
- + SET(Sources ${${SourcesVar}})
- +
- + SET_SOURCE_FILES_PROPERTIES(${PrecompiledSource}
- + PROPERTIES COMPILE_FLAGS "/Yc\"${PrecompiledHeader}\" /Fp\"${PrecompiledBinary}\""
- + OBJECT_OUTPUTS "${PrecompiledBinary}")
- + SET_SOURCE_FILES_PROPERTIES(${Sources}
- + PROPERTIES COMPILE_FLAGS "/Yu\"${PrecompiledBinary}\" /FI\"${PrecompiledBinary}\" /Fp\"${PrecompiledBinary}\""
- + OBJECT_DEPENDS "${PrecompiledBinary}")
- + # Add precompiled header to SourcesVar
- + LIST(APPEND ${SourcesVar} ${PrecompiledSource})
- + ENDIF(MSVC)
- +ENDMACRO(ADD_MSVC_PRECOMPILED_HEADER)
- +
- +## start setting
- +SET (this_target [% $target %])
- +PROJECT(${this_target})
- +
- +[% IF charset == 'Unicode' %]
- +add_definitions(-DUNICODE -D_UNICODE)
- +[% END %]
- +
- +## section: include directory
- +INCLUDE_DIRECTORIES(
- + [% $include %]
- + )
- +
- +## section: source files
- +# Add your source files here (one file per line), please SORT in alphabetical order for future maintenance
- +SET (${this_target}_SOURCE_FILES
- + [% $src %]
- + )
- +
- +## section: header files
- +# Add your header files here(one file per line), please SORT in alphabetical order for future maintenance!
- +SET(${this_target}_HEADER_FILES
- + [% $header %]
- + )
- +
- +[% source_groups %]
- +
- +## section: precompiled header
- +#ADD_MSVC_PRECOMPILED_HEADER("precompiled.h" "precompiled.cpp" MySources)
- +#ADD_LIBRARY(MyLibrary ${MySources})
- +
- +SET_SOURCE_FILES_PROPERTIES(${this_target}_HEADER_FILES
- + PROPERTIES HEADER_FILE_ONLY TRUE)
- +LIST(APPEND ${this_target}_SOURCE_FILES ${${this_target}_HEADER_FILES})
- +
- +## section: add definitions
- +# add prefix -D. example> -DSHP
- +# - DO NOT add the following definitions(already defined in ${OSP_DEFINITIONS}:
- +# -DSHP, -DWIN32, -D_WINDOWS, -D_DEBUG, -D_USRDLL, -D_CRT_SECURE_NO_DEPRECATE
- +ADD_DEFINITIONS(
- + [% $def %]
- + )
- +
- +## section: add target
- +[% SWITCH type %]
- +[% CASE 'Application' %]
- +ADD_EXECUTABLE(${this_target} ${${this_target}_SOURCE_FILES})
- +[% CASE 'DynamicLibrary' %]
- +ADD_LIBRARY(${this_target} SHARED ${${this_target}_SOURCE_FILES} )
- +[% CASE 'StaticLibrary' %]
- +ADD_LIBRARY(${this_target} STATIC ${${this_target}_SOURCE_FILES} )
- +[% CASE 'Module' %]
- +ADD_LIBRARY(${this_target} MODULE ${${this_target}_SOURCE_FILES} )
- +[% END %]
- +
- +[%- IF lib -%]
- +## section: add dependency
- +# dependency determines overall build order.
- +ADD_DEPENDENCIES(${this_target}
- + [% $lib %]
- + )
- +
- +## section: set link libraries
- +TARGET_LINK_LIBRARIES( ${this_target}
- + [% $lib %]
- + )
- +[%- END -%]
- +
- diff --git a/OpenARK-SDK/CMakeLists.txt b/OpenARK-SDK/CMakeLists.txt
- index ec076ba..0fe91e2 100644
- --- a/OpenARK-SDK/CMakeLists.txt
- +++ b/OpenARK-SDK/CMakeLists.txt
- @@ -1,101 +1,101 @@
- -cmake_minimum_required(VERSION 2.8)
- -
- -## section: Macro
- -MACRO(ADD_MSVC_PRECOMPILED_HEADER PrecompiledHeader PrecompiledSource SourcesVar)
- - IF(MSVC)
- - GET_FILENAME_COMPONENT(PrecompiledBasename ${PrecompiledHeader} NAME_WE)
- - SET(PrecompiledBinary "${CMAKE_CURRENT_BINARY_DIR}/${PrecompiledBasename}.pch")
- - SET(Sources ${${SourcesVar}})
- -
- - SET_SOURCE_FILES_PROPERTIES(${PrecompiledSource}
- - PROPERTIES COMPILE_FLAGS "/Yc\"${PrecompiledHeader}\" /Fp\"${PrecompiledBinary}\""
- - OBJECT_OUTPUTS "${PrecompiledBinary}")
- - SET_SOURCE_FILES_PROPERTIES(${Sources}
- - PROPERTIES COMPILE_FLAGS "/Yu\"${PrecompiledBinary}\" /FI\"${PrecompiledBinary}\" /Fp\"${PrecompiledBinary}\""
- - OBJECT_DEPENDS "${PrecompiledBinary}")
- - # Add precompiled header to SourcesVar
- - LIST(APPEND ${SourcesVar} ${PrecompiledSource})
- - ENDIF(MSVC)
- -ENDMACRO(ADD_MSVC_PRECOMPILED_HEADER)
- -
- -## start setting
- -SET (this_target OpenARKSDK)
- -PROJECT(${this_target})
- -
- -
- -
- -## section: include directory
- -INCLUDE_DIRECTORIES(
- -
- - )
- -
- -## section: source files
- -# Add your source files here (one file per line), please SORT in alphabetical order for future maintenance
- -SET (${this_target}_SOURCE_FILES
- - ..\Clustering.cpp
- - ..\DepthSensor.cpp
- - ..\main.cpp
- - ..\PMDSensor.cpp
- - ..\RGBSensor.cpp
- - ..\Visualizer.cpp
- - ..\Sensor.cpp
- - ..\Webcam.cpp
- - )
- -
- -## section: header files
- -# Add your header files here(one file per line), please SORT in alphabetical order for future maintenance!
- -SET(${this_target}_HEADER_FILES
- - ..\Clustering.h
- - ..\DepthSensor.h
- - ..\Hand.h
- - ..\PMDSensor.h
- - ..\RGBSensor.h
- - ..\Sensor.h
- - ..\Visualizer.h
- - ..\Webcam.h
- - )
- -
- -SOURCE_GROUP("Source Files" FILES
- - ..\main.cpp
- - ..\Sensor.cpp
- - ..\DepthSensor.cpp
- - ..\PMDSensor.cpp
- - ..\Visualizer.cpp
- - ..\RGBSensor.cpp
- - ..\Webcam.cpp
- - ..\Clustering.cpp
- - )
- -SOURCE_GROUP("Header Files" FILES
- - ..\Sensor.h
- - ..\DepthSensor.h
- - ..\PMDSensor.h
- - ..\Visualizer.h
- - ..\RGBSensor.h
- - ..\Webcam.h
- - ..\Clustering.h
- - ..\Hand.h
- - )
- -SOURCE_GROUP("Resource Files" FILES
- -
- - )
- -
- -
- -## section: precompiled header
- -#ADD_MSVC_PRECOMPILED_HEADER("precompiled.h" "precompiled.cpp" MySources)
- -#ADD_LIBRARY(MyLibrary ${MySources})
- -
- -SET_SOURCE_FILES_PROPERTIES(${this_target}_HEADER_FILES
- - PROPERTIES HEADER_FILE_ONLY TRUE)
- -LIST(APPEND ${this_target}_SOURCE_FILES ${${this_target}_HEADER_FILES})
- -
- -## section: add definitions
- -# add prefix -D. example> -DSHP
- -# - DO NOT add the following definitions(already defined in ${OSP_DEFINITIONS}:
- -# -DSHP, -DWIN32, -D_WINDOWS, -D_DEBUG, -D_USRDLL, -D_CRT_SECURE_NO_DEPRECATE
- -ADD_DEFINITIONS(
- -
- - )
- -
- -## section: add target
- -
- -
- +cmake_minimum_required(VERSION 2.8)
- +
- +## section: Macro
- +MACRO(ADD_MSVC_PRECOMPILED_HEADER PrecompiledHeader PrecompiledSource SourcesVar)
- + IF(MSVC)
- + GET_FILENAME_COMPONENT(PrecompiledBasename ${PrecompiledHeader} NAME_WE)
- + SET(PrecompiledBinary "${CMAKE_CURRENT_BINARY_DIR}/${PrecompiledBasename}.pch")
- + SET(Sources ${${SourcesVar}})
- +
- + SET_SOURCE_FILES_PROPERTIES(${PrecompiledSource}
- + PROPERTIES COMPILE_FLAGS "/Yc\"${PrecompiledHeader}\" /Fp\"${PrecompiledBinary}\""
- + OBJECT_OUTPUTS "${PrecompiledBinary}")
- + SET_SOURCE_FILES_PROPERTIES(${Sources}
- + PROPERTIES COMPILE_FLAGS "/Yu\"${PrecompiledBinary}\" /FI\"${PrecompiledBinary}\" /Fp\"${PrecompiledBinary}\""
- + OBJECT_DEPENDS "${PrecompiledBinary}")
- + # Add precompiled header to SourcesVar
- + LIST(APPEND ${SourcesVar} ${PrecompiledSource})
- + ENDIF(MSVC)
- +ENDMACRO(ADD_MSVC_PRECOMPILED_HEADER)
- +
- +## start setting
- +SET (this_target OpenARKSDK)
- +PROJECT(${this_target})
- +
- +
- +
- +## section: include directory
- +INCLUDE_DIRECTORIES(
- +
- + )
- +
- +## section: source files
- +# Add your source files here (one file per line), please SORT in alphabetical order for future maintenance
- +SET (${this_target}_SOURCE_FILES
- + ..\Clustering.cpp
- + ..\DepthSensor.cpp
- + ..\main.cpp
- + ..\PMDSensor.cpp
- + ..\RGBSensor.cpp
- + ..\Visualizer.cpp
- + ..\Sensor.cpp
- + ..\Webcam.cpp
- + )
- +
- +## section: header files
- +# Add your header files here(one file per line), please SORT in alphabetical order for future maintenance!
- +SET(${this_target}_HEADER_FILES
- + ..\Clustering.h
- + ..\DepthSensor.h
- + ..\Hand.h
- + ..\PMDSensor.h
- + ..\RGBSensor.h
- + ..\Sensor.h
- + ..\Visualizer.h
- + ..\Webcam.h
- + )
- +
- +SOURCE_GROUP("Source Files" FILES
- + ..\main.cpp
- + ..\Sensor.cpp
- + ..\DepthSensor.cpp
- + ..\PMDSensor.cpp
- + ..\Visualizer.cpp
- + ..\RGBSensor.cpp
- + ..\Webcam.cpp
- + ..\Clustering.cpp
- + )
- +SOURCE_GROUP("Header Files" FILES
- + ..\Sensor.h
- + ..\DepthSensor.h
- + ..\PMDSensor.h
- + ..\Visualizer.h
- + ..\RGBSensor.h
- + ..\Webcam.h
- + ..\Clustering.h
- + ..\Hand.h
- + )
- +SOURCE_GROUP("Resource Files" FILES
- +
- + )
- +
- +
- +## section: precompiled header
- +#ADD_MSVC_PRECOMPILED_HEADER("precompiled.h" "precompiled.cpp" MySources)
- +#ADD_LIBRARY(MyLibrary ${MySources})
- +
- +SET_SOURCE_FILES_PROPERTIES(${this_target}_HEADER_FILES
- + PROPERTIES HEADER_FILE_ONLY TRUE)
- +LIST(APPEND ${this_target}_SOURCE_FILES ${${this_target}_HEADER_FILES})
- +
- +## section: add definitions
- +# add prefix -D. example> -DSHP
- +# - DO NOT add the following definitions(already defined in ${OSP_DEFINITIONS}:
- +# -DSHP, -DWIN32, -D_WINDOWS, -D_DEBUG, -D_USRDLL, -D_CRT_SECURE_NO_DEPRECATE
- +ADD_DEFINITIONS(
- +
- + )
- +
- +## section: add target
- +
- +
- diff --git a/OpenARK-SDK/CMakeSourceGroup.tx b/OpenARK-SDK/CMakeSourceGroup.tx
- index 599285d..935387d 100644
- --- a/OpenARK-SDK/CMakeSourceGroup.tx
- +++ b/OpenARK-SDK/CMakeSourceGroup.tx
- @@ -1,3 +1,3 @@
- -SOURCE_GROUP("[% flter %]" FILES
- - [% files %]
- - )
- +SOURCE_GROUP("[% flter %]" FILES
- + [% files %]
- + )
- diff --git a/OpenARK-SDK/OpenARK-SDK.vcxproj b/OpenARK-SDK/OpenARK-SDK.vcxproj
- index 2f48d4c..8124c1c 100644
- --- a/OpenARK-SDK/OpenARK-SDK.vcxproj
- +++ b/OpenARK-SDK/OpenARK-SDK.vcxproj
- @@ -1,160 +1,148 @@
- -<?xml version="1.0" encoding="utf-8"?>
- -<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- - <ItemGroup Label="ProjectConfigurations">
- - <ProjectConfiguration Include="Debug|Win32">
- - <Configuration>Debug</Configuration>
- - <Platform>Win32</Platform>
- - </ProjectConfiguration>
- - <ProjectConfiguration Include="Release|Win32">
- - <Configuration>Release</Configuration>
- - <Platform>Win32</Platform>
- - </ProjectConfiguration>
- - <ProjectConfiguration Include="Debug|x64">
- - <Configuration>Debug</Configuration>
- - <Platform>x64</Platform>
- - </ProjectConfiguration>
- - <ProjectConfiguration Include="Release|x64">
- - <Configuration>Release</Configuration>
- - <Platform>x64</Platform>
- - </ProjectConfiguration>
- - </ItemGroup>
- - <PropertyGroup Label="Globals">
- - <ProjectGuid>{3625C413-17C5-47C4-8878-B43FADFD79E2}</ProjectGuid>
- - <RootNamespace>OpenARKSDK</RootNamespace>
- - <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
- - </PropertyGroup>
- - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- - <ConfigurationType>Application</ConfigurationType>
- - <UseDebugLibraries>true</UseDebugLibraries>
- - <PlatformToolset>v140</PlatformToolset>
- - <CharacterSet>MultiByte</CharacterSet>
- - </PropertyGroup>
- - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- - <ConfigurationType>Application</ConfigurationType>
- - <UseDebugLibraries>false</UseDebugLibraries>
- - <PlatformToolset>v140</PlatformToolset>
- - <WholeProgramOptimization>true</WholeProgramOptimization>
- - <CharacterSet>MultiByte</CharacterSet>
- - </PropertyGroup>
- - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
- - <ConfigurationType>Application</ConfigurationType>
- - <UseDebugLibraries>true</UseDebugLibraries>
- - <PlatformToolset>v140</PlatformToolset>
- - <CharacterSet>MultiByte</CharacterSet>
- - </PropertyGroup>
- - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
- - <ConfigurationType>Application</ConfigurationType>
- - <UseDebugLibraries>false</UseDebugLibraries>
- - <PlatformToolset>v140</PlatformToolset>
- - <WholeProgramOptimization>true</WholeProgramOptimization>
- - <CharacterSet>MultiByte</CharacterSet>
- - </PropertyGroup>
- - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- - <ImportGroup Label="ExtensionSettings">
- - </ImportGroup>
- - <ImportGroup Label="Shared">
- - </ImportGroup>
- - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- - <Import Project="..\..\Program Files (x86)\Intel\RSSDK\props\VS2012-15.Integration.MD.props" />
- - </ImportGroup>
- - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- - <Import Project="..\..\Program Files (x86)\Intel\RSSDK\props\VS2012-15.Integration.MD.props" />
- - </ImportGroup>
- - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- - <Import Project="..\..\Program Files (x86)\Intel\RSSDK\props\VS2012-15.Integration.MD.props" />
- - </ImportGroup>
- - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- - <Import Project="..\..\Program Files (x86)\Intel\RSSDK\props\VS2012-15.Integration.MD.props" />
- - </ImportGroup>
- - <PropertyGroup Label="UserMacros" />
- - <PropertyGroup />
- - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- - <ClCompile>
- - <WarningLevel>Level3</WarningLevel>
- - <Optimization>Disabled</Optimization>
- - <SDLCheck>true</SDLCheck>
- - </ClCompile>
- - </ItemDefinitionGroup>
- - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- - <ClCompile>
- - <WarningLevel>Level3</WarningLevel>
- - <Optimization>Disabled</Optimization>
- - <SDLCheck>true</SDLCheck>
- - </ClCompile>
- - </ItemDefinitionGroup>
- - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- - <ClCompile>
- - <WarningLevel>Level3</WarningLevel>
- - <Optimization>MaxSpeed</Optimization>
- - <FunctionLevelLinking>true</FunctionLevelLinking>
- - <IntrinsicFunctions>true</IntrinsicFunctions>
- - <SDLCheck>true</SDLCheck>
- - </ClCompile>
- - <Link>
- - <EnableCOMDATFolding>true</EnableCOMDATFolding>
- - <OptimizeReferences>true</OptimizeReferences>
- - </Link>
- - </ItemDefinitionGroup>
- - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- - <ClCompile>
- - <WarningLevel>Level3</WarningLevel>
- - <Optimization>MaxSpeed</Optimization>
- - <FunctionLevelLinking>true</FunctionLevelLinking>
- - <IntrinsicFunctions>true</IntrinsicFunctions>
- - <SDLCheck>true</SDLCheck>
- - <AdditionalIncludeDirectories>C:\Program Files\PCL 1.8.0\3rdParty\VTK\include\vtk-7.0;C:\Program Files\PCL 1.8.0\include\pcl-1.8;C:\Program Files\PCL 1.8.0\3rdParty\Eigen\eigen3;C:\Program Files\PCL 1.8.0\3rdParty\Boost\include\boost-1_61;C:\Program Files\PCL 1.8.0\3rdParty\Qhull\include;C:\Program Files\PCL 1.8.0\3rdParty\FLANN\include;C:\Program Files\PCL 1.8.0\3rdParty\Boost;C:\Program Files\OpenNI\Include;C:\Program Files\OpenNI2\Include;C:\opencv\build\include\opencv2;C:\opencv\build\include;C:\pmdsdk\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- - <PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- - </ClCompile>
- - <Link>
- - <EnableCOMDATFolding>true</EnableCOMDATFolding>
- - <OptimizeReferences>true</OptimizeReferences>
- - <AdditionalLibraryDirectories>C:\Program Files\PCL 1.8.0\lib;C:\Program Files\PCL 1.8.0\lib\$(Configuration);C:\opencv\build\x64\vc14\lib;C:\pmd\PMDSDK\bin;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- - <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_system-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_filesystem-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_thread-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_date_time-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_iostreams-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_serialization-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_chrono-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_atomic-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_regex-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\lib\pcl_common_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_octree_release.lib;C:\Program Files\OpenNI\Lib64\openNI64.lib;C:\Program Files\OpenNI2\Lib\OpenNI2.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkalglib-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkChartsCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonColor-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonDataModel-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonMath-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtksys-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonMisc-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonSystem-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonTransforms-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkInfovisCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersExtraction-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonExecutionModel-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersGeneral-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonComputationalGeometry-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersStatistics-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingFourier-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingContext2D-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersGeometry-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersSources-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingFreeType-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkfreetype-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkzlib-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkDICOMParser-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkDomainsChemistry-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOXML-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOGeometry-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOXMLParser-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkexpat-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkexoIIc-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkNetCDF-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkNetCDF_cxx-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkhdf5_hl-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkhdf5-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersAMR-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkParallelCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOLegacy-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersFlowPaths-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersGeneric-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersHybrid-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingSources-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersHyperTree-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersImaging-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingGeneral-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersModeling-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersParallel-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersParallelImaging-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersProgrammable-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersSelection-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersSMP-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersTexture-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersVerdict-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkverdict-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkGeovisCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkInfovisLayout-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingHybrid-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOImage-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkmetaio-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkjpeg-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkpng-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtktiff-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkInteractionStyle-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkInteractionWidgets-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingAnnotation-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingColor-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingVolume-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkViewsCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkproj4-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkgl2ps-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingMath-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingMorphological-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingStatistics-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingStencil-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkInteractionImage-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOAMR-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOEnSight-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOExodus-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOExport-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingGL2PS-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingContextOpenGL-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingOpenGL-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingLabel-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOImport-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOInfovis-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtklibxml2-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOLSDyna-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOMINC-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOMovie-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkoggtheora-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIONetCDF-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOParallel-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkjsoncpp-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOParallelXML-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOPLY-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOSQL-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtksqlite-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOVideo-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingImage-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingLIC-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingLOD-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingVolumeOpenGL-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkViewsContext2D-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkViewsInfovis-7.0.lib;C:\Program Files\PCL 1.8.0\lib\pcl_io_release.lib;C:\Program Files\PCL 1.8.0\3rdParty\FLANN\lib\flann_cpp_s.lib;C:\Program Files\PCL 1.8.0\lib\pcl_kdtree_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_search_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_sample_consensus_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_filters_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_features_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_ml_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_segmentation_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_visualization_release.lib;C:\Program Files\PCL 1.8.0\3rdParty\Qhull\lib\qhullstatic.lib;C:\Program Files\PCL 1.8.0\lib\pcl_surface_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_registration_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_keypoints_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_tracking_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_recognition_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_stereo_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_outofcore_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_people_release.lib;opencv_world320.lib;vfw32.lib;glu32.lib;opengl32.lib;comctl32.lib;wsock32.lib;ws2_32.lib;Psapi.lib;pmdaccess2.lib;%(AdditionalDependencies)</AdditionalDependencies>
- - <StackReserveSize>20000000</StackReserveSize>
- - <StackCommitSize>20000000</StackCommitSize>
- - </Link>
- - </ItemDefinitionGroup>
- - <ItemGroup>
- - <ClCompile Include="..\Calibration.cpp" />
- - <ClCompile Include="..\Converter.cpp" />
- - <ClCompile Include="..\DepthCamera.cpp" />
- - <ClCompile Include="..\global.cpp" />
- - <ClCompile Include="..\Hand.cpp" />
- - <ClCompile Include="..\main.cpp" />
- - <ClCompile Include="..\Object3D.cpp" />
- - <ClCompile Include="..\Plane.cpp" />
- - <ClCompile Include="..\PMDCamera.cpp" />
- - <ClCompile Include="..\RGBCamera.cpp" />
- - <ClCompile Include="..\SR300Camera.cpp" />
- - <ClCompile Include="..\StreamingAverager.cpp" />
- - <ClCompile Include="..\UDPSender.cpp" />
- - <ClCompile Include="..\Util.cpp" />
- - <ClCompile Include="..\Visualizer.cpp" />
- - <ClCompile Include="..\Webcam.cpp" />
- - </ItemGroup>
- - <ItemGroup>
- - <ClInclude Include="..\Calibration.h" />
- - <ClInclude Include="..\Converter.h" />
- - <ClInclude Include="..\DepthCamera.h" />
- - <ClInclude Include="..\global.h" />
- - <ClInclude Include="..\Hand.h" />
- - <ClInclude Include="..\Object3D.h" />
- - <ClInclude Include="..\Plane.h" />
- - <ClInclude Include="..\PMDCamera.h" />
- - <ClInclude Include="..\RGBCamera.h" />
- - <ClInclude Include="..\SR300Camera.h" />
- - <ClInclude Include="..\StreamingAverager.h" />
- - <ClInclude Include="..\UDPSender.h" />
- - <ClInclude Include="..\Util.h" />
- - <ClInclude Include="..\Visualizer.h" />
- - <ClInclude Include="..\Webcam.h" />
- - </ItemGroup>
- - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- - <ImportGroup Label="ExtensionTargets">
- - </ImportGroup>
- +<?xml version="1.0" encoding="utf-8"?>
- +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- + <ItemGroup Label="ProjectConfigurations">
- + <ProjectConfiguration Include="Debug|Win32">
- + <Configuration>Debug</Configuration>
- + <Platform>Win32</Platform>
- + </ProjectConfiguration>
- + <ProjectConfiguration Include="Release|Win32">
- + <Configuration>Release</Configuration>
- + <Platform>Win32</Platform>
- + </ProjectConfiguration>
- + <ProjectConfiguration Include="Debug|x64">
- + <Configuration>Debug</Configuration>
- + <Platform>x64</Platform>
- + </ProjectConfiguration>
- + <ProjectConfiguration Include="Release|x64">
- + <Configuration>Release</Configuration>
- + <Platform>x64</Platform>
- + </ProjectConfiguration>
- + </ItemGroup>
- + <PropertyGroup Label="Globals">
- + <ProjectGuid>{3625C413-17C5-47C4-8878-B43FADFD79E2}</ProjectGuid>
- + <RootNamespace>OpenARKSDK</RootNamespace>
- + <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
- + </PropertyGroup>
- + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
- + <ConfigurationType>Application</ConfigurationType>
- + <UseDebugLibraries>true</UseDebugLibraries>
- + <PlatformToolset>v140</PlatformToolset>
- + <CharacterSet>MultiByte</CharacterSet>
- + </PropertyGroup>
- + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
- + <ConfigurationType>Application</ConfigurationType>
- + <UseDebugLibraries>false</UseDebugLibraries>
- + <PlatformToolset>v140</PlatformToolset>
- + <WholeProgramOptimization>true</WholeProgramOptimization>
- + <CharacterSet>MultiByte</CharacterSet>
- + </PropertyGroup>
- + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
- + <ConfigurationType>Application</ConfigurationType>
- + <UseDebugLibraries>true</UseDebugLibraries>
- + <PlatformToolset>v140</PlatformToolset>
- + <CharacterSet>MultiByte</CharacterSet>
- + </PropertyGroup>
- + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
- + <ConfigurationType>Application</ConfigurationType>
- + <UseDebugLibraries>false</UseDebugLibraries>
- + <PlatformToolset>v140</PlatformToolset>
- + <WholeProgramOptimization>true</WholeProgramOptimization>
- + <CharacterSet>MultiByte</CharacterSet>
- + </PropertyGroup>
- + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- + <ImportGroup Label="ExtensionSettings">
- + </ImportGroup>
- + <ImportGroup Label="Shared">
- + </ImportGroup>
- + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- + </ImportGroup>
- + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- + </ImportGroup>
- + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- + </ImportGroup>
- + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
- + </ImportGroup>
- + <PropertyGroup Label="UserMacros" />
- + <PropertyGroup />
- + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
- + <ClCompile>
- + <WarningLevel>Level3</WarningLevel>
- + <Optimization>Disabled</Optimization>
- + <SDLCheck>true</SDLCheck>
- + </ClCompile>
- + </ItemDefinitionGroup>
- + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
- + <ClCompile>
- + <WarningLevel>Level3</WarningLevel>
- + <Optimization>Disabled</Optimization>
- + <SDLCheck>true</SDLCheck>
- + </ClCompile>
- + </ItemDefinitionGroup>
- + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
- + <ClCompile>
- + <WarningLevel>Level3</WarningLevel>
- + <Optimization>MaxSpeed</Optimization>
- + <FunctionLevelLinking>true</FunctionLevelLinking>
- + <IntrinsicFunctions>true</IntrinsicFunctions>
- + <SDLCheck>true</SDLCheck>
- + </ClCompile>
- + <Link>
- + <EnableCOMDATFolding>true</EnableCOMDATFolding>
- + <OptimizeReferences>true</OptimizeReferences>
- + </Link>
- + </ItemDefinitionGroup>
- + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
- + <ClCompile>
- + <WarningLevel>Level3</WarningLevel>
- + <Optimization>MaxSpeed</Optimization>
- + <FunctionLevelLinking>true</FunctionLevelLinking>
- + <IntrinsicFunctions>true</IntrinsicFunctions>
- + <SDLCheck>true</SDLCheck>
- + <AdditionalIncludeDirectories>C:\Program Files\PCL 1.8.0\3rdParty\VTK\include\vtk-7.0;C:\Program Files\PCL 1.8.0\include\pcl-1.8;C:\Program Files\PCL 1.8.0\3rdParty\Eigen\eigen3;C:\Program Files\PCL 1.8.0\3rdParty\Boost\include\boost-1_61;C:\Program Files\OpenNI\Include;C:\Program Files\OpenNI2\Include;C:\Program Files\PCL 1.8.0\3rdParty\FLANN\include;C:\Program Files\PCL 1.8.0\3rdParty\Qhull\include;D:\PCL 1.8.0\3rdParty\VTK\include;$(OPENCV_DIR)\..\..\include;C:\dev\PMDDrivers\Windows\Windows64bit\PMDSDK\include;C:\Program Files\PCL 1.8.0\3rdParty\Boost;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
- + <PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
- + </ClCompile>
- + <Link>
- + <EnableCOMDATFolding>true</EnableCOMDATFolding>
- + <OptimizeReferences>true</OptimizeReferences>
- + <AdditionalLibraryDirectories>C:\Program Files\PCL 1.8.0\lib;C:\Program Files\PCL 1.8.0\lib\$(Configuration);$(OPENCV_DIR)\lib;C:\dev\PMDDrivers\Windows\Windows64bit\PMDSDK\bin;$(OPENCV_DIR)\lib\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
- + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_system-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_filesystem-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_thread-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_date_time-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_iostreams-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_serialization-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_chrono-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_atomic-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\3rdParty\Boost\lib\libboost_regex-vc140-mt-1_61.lib;C:\Program Files\PCL 1.8.0\lib\pcl_common_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_octree_release.lib;C:\Program Files\OpenNI\Lib64\openNI64.lib;C:\Program Files\OpenNI2\Lib\OpenNI2.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkalglib-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkChartsCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonColor-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonDataModel-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonMath-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtksys-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonMisc-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonSystem-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonTransforms-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkInfovisCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersExtraction-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonExecutionModel-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersGeneral-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkCommonComputationalGeometry-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersStatistics-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingFourier-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingContext2D-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersGeometry-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersSources-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingFreeType-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkfreetype-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkzlib-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkDICOMParser-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkDomainsChemistry-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOXML-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOGeometry-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOXMLParser-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkexpat-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkexoIIc-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkNetCDF-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkNetCDF_cxx-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkhdf5_hl-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkhdf5-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersAMR-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkParallelCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOLegacy-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersFlowPaths-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersGeneric-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersHybrid-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingSources-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersHyperTree-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersImaging-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingGeneral-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersModeling-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersParallel-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersParallelImaging-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersProgrammable-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersSelection-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersSMP-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersTexture-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkFiltersVerdict-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkverdict-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkGeovisCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkInfovisLayout-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingHybrid-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOImage-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkmetaio-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkjpeg-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkpng-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtktiff-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkInteractionStyle-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkInteractionWidgets-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingAnnotation-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingColor-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingVolume-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkViewsCore-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkproj4-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkgl2ps-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingMath-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingMorphological-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingStatistics-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkImagingStencil-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkInteractionImage-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOAMR-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOEnSight-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOExodus-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOExport-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingGL2PS-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingContextOpenGL-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingOpenGL-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingLabel-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOImport-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOInfovis-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtklibxml2-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOLSDyna-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOMINC-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOMovie-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkoggtheora-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIONetCDF-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOParallel-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkjsoncpp-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOParallelXML-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOPLY-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOSQL-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtksqlite-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkIOVideo-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingImage-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingLIC-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingLOD-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkRenderingVolumeOpenGL-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkViewsContext2D-7.0.lib;C:\Program Files\PCL 1.8.0\3rdParty\VTK\lib\vtkViewsInfovis-7.0.lib;C:\Program Files\PCL 1.8.0\lib\pcl_io_release.lib;C:\Program Files\PCL 1.8.0\3rdParty\FLANN\lib\flann_cpp_s.lib;C:\Program Files\PCL 1.8.0\lib\pcl_kdtree_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_search_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_sample_consensus_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_filters_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_features_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_ml_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_segmentation_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_visualization_release.lib;C:\Program Files\PCL 1.8.0\3rdParty\Qhull\lib\qhullstatic.lib;C:\Program Files\PCL 1.8.0\lib\pcl_surface_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_registration_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_keypoints_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_tracking_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_recognition_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_stereo_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_outofcore_release.lib;C:\Program Files\PCL 1.8.0\lib\pcl_people_release.lib;cv2.lib;opencv_imgcodecs300.lib;opencv_superres300.lib;opencv_calib3d300.lib;opencv_imgproc300.lib;opencv_ts300.lib;opencv_core300.lib;opencv_ml300.lib;opencv_video300.lib;opencv_features2d300.lib;opencv_objdetect300.lib;opencv_videoio300.lib;opencv_flann300.lib;opencv_photo300.lib;opencv_videostab300.lib;opencv_hal300.lib;opencv_shape300.lib;opencv_highgui300.lib;opencv_stitching300.lib;vfw32.lib;glu32.lib;opengl32.lib;comctl32.lib;wsock32.lib;ws2_32.lib;Psapi.lib;pmdaccess2.lib;%(AdditionalDependencies)</AdditionalDependencies>
- + </Link>
- + </ItemDefinitionGroup>
- + <ItemGroup>
- + <ClCompile Include="..\Calibration.cpp" />
- + <ClCompile Include="..\DepthCamera.cpp" />
- + <ClCompile Include="..\Hand.cpp" />
- + <ClCompile Include="..\main.cpp" />
- + <ClCompile Include="..\Object3D.cpp" />
- + <ClCompile Include="..\Plane.cpp" />
- + <ClCompile Include="..\PMDCamera.cpp" />
- + <ClCompile Include="..\RGBCamera.cpp" />
- + <ClCompile Include="..\StreamingAverager.cpp" />
- + <ClCompile Include="..\UDPSender.cpp" />
- + <ClCompile Include="..\Util.cpp" />
- + <ClCompile Include="..\Visualizer.cpp" />
- + <ClCompile Include="..\Webcam.cpp" />
- + </ItemGroup>
- + <ItemGroup>
- + <ClInclude Include="..\Calibration.h" />
- + <ClInclude Include="..\DepthCamera.h" />
- + <ClInclude Include="..\Hand.h" />
- + <ClInclude Include="..\Object3D.h" />
- + <ClInclude Include="..\Plane.h" />
- + <ClInclude Include="..\PMDCamera.h" />
- + <ClInclude Include="..\RGBCamera.h" />
- + <ClInclude Include="..\StreamingAverager.h" />
- + <ClInclude Include="..\UDPSender.h" />
- + <ClInclude Include="..\Util.h" />
- + <ClInclude Include="..\Visualizer.h" />
- + <ClInclude Include="..\Webcam.h" />
- + </ItemGroup>
- + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
- + <ImportGroup Label="ExtensionTargets">
- + </ImportGroup>
- </Project>
- \ No newline at end of file
- diff --git a/OpenARK-SDK/OpenARK-SDK.vcxproj.filters b/OpenARK-SDK/OpenARK-SDK.vcxproj.filters
- index 71e2bf3..b3ef614 100644
- --- a/OpenARK-SDK/OpenARK-SDK.vcxproj.filters
- +++ b/OpenARK-SDK/OpenARK-SDK.vcxproj.filters
- @@ -1,114 +1,96 @@
- -<?xml version="1.0" encoding="utf-8"?>
- -<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- - <ItemGroup>
- - <Filter Include="Source Files">
- - <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
- - <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
- - </Filter>
- - <Filter Include="Header Files">
- - <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
- - <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
- - </Filter>
- - <Filter Include="Resource Files">
- - <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
- - <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
- - </Filter>
- - </ItemGroup>
- - <ItemGroup>
- - <ClCompile Include="..\main.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\Visualizer.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\Webcam.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\Hand.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\Util.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\DepthCamera.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\PMDCamera.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\RGBCamera.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\Plane.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\Calibration.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\UDPSender.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\Object3D.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\StreamingAverager.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\Converter.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\SR300Camera.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - <ClCompile Include="..\global.cpp">
- - <Filter>Source Files</Filter>
- - </ClCompile>
- - </ItemGroup>
- - <ItemGroup>
- - <ClInclude Include="..\Visualizer.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - <ClInclude Include="..\Webcam.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - <ClInclude Include="..\Hand.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - <ClInclude Include="..\Util.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - <ClInclude Include="..\DepthCamera.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - <ClInclude Include="..\PMDCamera.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - <ClInclude Include="..\RGBCamera.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - <ClInclude Include="..\Plane.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - <ClInclude Include="..\Calibration.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - <ClInclude Include="..\UDPSender.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - <ClInclude Include="..\Object3D.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - <ClInclude Include="..\StreamingAverager.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - <ClInclude Include="..\Converter.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - <ClInclude Include="..\SR300Camera.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - <ClInclude Include="..\global.h">
- - <Filter>Header Files</Filter>
- - </ClInclude>
- - </ItemGroup>
- +<?xml version="1.0" encoding="utf-8"?>
- +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- + <ItemGroup>
- + <Filter Include="Source Files">
- + <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
- + <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
- + </Filter>
- + <Filter Include="Header Files">
- + <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
- + <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
- + </Filter>
- + <Filter Include="Resource Files">
- + <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
- + <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
- + </Filter>
- + </ItemGroup>
- + <ItemGroup>
- + <ClCompile Include="..\main.cpp">
- + <Filter>Source Files</Filter>
- + </ClCompile>
- + <ClCompile Include="..\Visualizer.cpp">
- + <Filter>Source Files</Filter>
- + </ClCompile>
- + <ClCompile Include="..\Webcam.cpp">
- + <Filter>Source Files</Filter>
- + </ClCompile>
- + <ClCompile Include="..\Hand.cpp">
- + <Filter>Source Files</Filter>
- + </ClCompile>
- + <ClCompile Include="..\Util.cpp">
- + <Filter>Source Files</Filter>
- + </ClCompile>
- + <ClCompile Include="..\DepthCamera.cpp">
- + <Filter>Source Files</Filter>
- + </ClCompile>
- + <ClCompile Include="..\PMDCamera.cpp">
- + <Filter>Source Files</Filter>
- + </ClCompile>
- + <ClCompile Include="..\RGBCamera.cpp">
- + <Filter>Source Files</Filter>
- + </ClCompile>
- + <ClCompile Include="..\Plane.cpp">
- + <Filter>Source Files</Filter>
- + </ClCompile>
- + <ClCompile Include="..\Calibration.cpp">
- + <Filter>Source Files</Filter>
- + </ClCompile>
- + <ClCompile Include="..\UDPSender.cpp">
- + <Filter>Source Files</Filter>
- + </ClCompile>
- + <ClCompile Include="..\Object3D.cpp">
- + <Filter>Source Files</Filter>
- + </ClCompile>
- + <ClCompile Include="..\StreamingAverager.cpp">
- + <Filter>Source Files</Filter>
- + </ClCompile>
- + </ItemGroup>
- + <ItemGroup>
- + <ClInclude Include="..\Visualizer.h">
- + <Filter>Header Files</Filter>
- + </ClInclude>
- + <ClInclude Include="..\Webcam.h">
- + <Filter>Header Files</Filter>
- + </ClInclude>
- + <ClInclude Include="..\Hand.h">
- + <Filter>Header Files</Filter>
- + </ClInclude>
- + <ClInclude Include="..\Util.h">
- + <Filter>Header Files</Filter>
- + </ClInclude>
- + <ClInclude Include="..\DepthCamera.h">
- + <Filter>Header Files</Filter>
- + </ClInclude>
- + <ClInclude Include="..\PMDCamera.h">
- + <Filter>Header Files</Filter>
- + </ClInclude>
- + <ClInclude Include="..\RGBCamera.h">
- + <Filter>Header Files</Filter>
- + </ClInclude>
- + <ClInclude Include="..\Plane.h">
- + <Filter>Header Files</Filter>
- + </ClInclude>
- + <ClInclude Include="..\Calibration.h">
- + <Filter>Header Files</Filter>
- + </ClInclude>
- + <ClInclude Include="..\UDPSender.h">
- + <Filter>Header Files</Filter>
- + </ClInclude>
- + <ClInclude Include="..\Object3D.h">
- + <Filter>Header Files</Filter>
- + </ClInclude>
- + <ClInclude Include="..\StreamingAverager.h">
- + <Filter>Header Files</Filter>
- + </ClInclude>
- + </ItemGroup>
- </Project>
- \ No newline at end of file
- diff --git a/OpenARK-SDK/README.md b/OpenARK-SDK/README.md
- index e11aceb..e57a3a8 100644
- --- a/OpenARK-SDK/README.md
- +++ b/OpenARK-SDK/README.md
- @@ -1,11 +1,11 @@
- -## Required modules:
- -* Try::Tiny;
- -* XML::TreePP;
- -* XML::TreePP::XMLPath;
- -* Text::Xslate;
- -* Readonly
- -* autobox::Core
- -
- -## Usage
- -
- - perl vcxproj2cmake.pl <vcxproj path> <target configuration>
- +## Required modules:
- +* Try::Tiny;
- +* XML::TreePP;
- +* XML::TreePP::XMLPath;
- +* Text::Xslate;
- +* Readonly
- +* autobox::Core
- +
- +## Usage
- +
- + perl vcxproj2cmake.pl <vcxproj path> <target configuration>
- diff --git a/OpenARK-SDK/vcxproj2cmake.pl b/OpenARK-SDK/vcxproj2cmake.pl
- index 35129a7..9e6e9b8 100644
- --- a/OpenARK-SDK/vcxproj2cmake.pl
- +++ b/OpenARK-SDK/vcxproj2cmake.pl
- @@ -1,426 +1,426 @@
- -#!/usr/bin/env perl
- -
- -use strict;
- -use warnings;
- -use utf8;
- -use feature 'say';
- -use Readonly;
- -
- -use autobox::Core;
- -use Try::Tiny;
- -use XML::TreePP;
- -use XML::TreePP::XMLPath;
- -use Text::Xslate;
- -use Data::Dumper;
- -use FindBin;
- -
- -my $filepath = $ARGV[0]
- - || die "Usage: $FindBin::Script <vcxproj path> <target configuration>";
- -my $target_conf = $ARGV[1]
- - || die "Usage: $FindBin::Script <vcxproj path> <target configuration>";
- -
- -my $filters_path = $filepath . '.filters';
- -
- -
- -my $vcxproj_xml = XML::TreePP->new()->parsefile($filepath);
- -my $vcxproj_filters_xml = XML::TreePP->new()->parsefile($filters_path);
- -my $target = $vcxproj_xml->{Project}->{PropertyGroup}->[0]->{RootNamespace};
- -my $target_prop = get_target_property($target_conf,
- - get_propertys($vcxproj_xml));
- -my $filenode_ref = get_file_node($vcxproj_xml);
- -my $item_def_ref = get_item_def_group($vcxproj_xml,
- - $target_prop->{-Condition});
- -my %filters = get_filters($vcxproj_filters_xml);
- -
- -make($filenode_ref, $item_def_ref, %filters);
- -
- -sub get_filters {
- - my ($vcxproj_filters_xml) = @_;
- - my %filters = ();
- -
- - my @itemgroups = @{$vcxproj_filters_xml->{Project}->{ItemGroup}};
- -
- - # first itemgroup is list of filters
- - for my $filter (@{$itemgroups[0]->{Filter}}) {
- - my $filtername = $filter->{-Include};
- - my @files = ();
- - @{$filters{$filtername}} = @files;
- - }
- -
- - # second itemgroup contains sorce files filter information
- - for my $clcompile (@{$itemgroups[1]->{ClCompile}}) {
- - my $filename = $clcompile->{-Include};
- - my $filter = $clcompile->{Filter};
- - push @{$filters{$filter}}, $filename;
- - }
- -
- - # third itemgroup contains header files filter information
- - for my $clinclude (@{$itemgroups[2]->{ClInclude}}) {
- - my $filename = $clinclude->{-Include};
- - my $filter = $clinclude->{Filter};
- - push @{$filters{$filter}}, $filename;
- - }
- -
- - # fourth itemgroup contains filter information for files that should not compiled (like readme)
- -
- - # fifth itemgroup contains recources filter
- -
- - # remove empty arrays
- - my @toDelete;
- - for my $filter (keys %filters) {
- - my @filterfiles = @{$filters{$filter}};
- - if (scalar @filterfiles == 0) {
- - push @toDelete, $filter;
- - }
- - }
- - #delete @filters{@toDelete};
- -
- - return %filters;
- -}
- -
- -sub get_target_property {
- - my ($target_conf, @property_groups) = @_;
- - my $target_prop;
- - for my $property (@property_groups) {
- - if ($property->{-Condition} =~ m{$target_conf}) {
- - $target_prop = $property;
- - last;
- - }
- - }
- -
- - return $target_prop;
- -}
- -
- -sub get_item_def_group {
- - my ($vcxproj_xml, $cond) = @_;
- - my $tppx = new XML::TreePP::XMLPath;
- -
- - # my $xpath = '/Project/ItemDefinitionGroup[@Condition="'.$cond.'"]';
- - # warn $xpath;
- - # my $item_def_ref = $tppx->filterXMLDoc($vcxproj_xml, $xpath);
- - my $item_def_ref;
- - for my $item_def ($tppx->filterXMLDoc($vcxproj_xml,
- - '/Project/ItemDefinitionGroup')) {
- - if ($item_def->{-Condition} eq $cond) {
- - $item_def_ref = $item_def;
- - last;
- - }
- - }
- -
- - return $item_def_ref;
- -}
- -
- -sub get_propertys {
- - my ($vcxproj_xml) = @_;
- - my $property_node_ref;
- -
- - my $tppx = new XML::TreePP::XMLPath;
- - my @property_groups
- - = $tppx->filterXMLDoc($vcxproj_xml,
- - '/Project/PropertyGroup[@Label="Configuration"]');
- -
- - return @property_groups;
- -}
- -
- -sub get_file_node {
- - my ($vcxproj_xml) = @_;
- - my @itemgroups = @{$vcxproj_xml->{Project}->{ItemGroup}};
- - my $filenode_ref;
- - for my $itemgroup (@itemgroups) {
- - next if (defined $itemgroup->{-Label}
- - && $itemgroup->{-Label} eq 'ProjectConfigurations');
- -
- - for my $nodename (keys %{$itemgroup}) {
- - my @nodes;
- -
- - if (ref($itemgroup->{$nodename}) eq 'HASH') {
- - push @nodes, $itemgroup->{$nodename};
- - } else {
- - @nodes = @{$itemgroup->{$nodename}};
- - }
- -
- - for my $node (@nodes) {
- - unless (defined $node->{ExcludedFromBuild}
- - && $node->{ExcludedFromBuild}->{-Condition} eq $target_prop->{-Condition}) {
- - push @{$filenode_ref->{$nodename}}, $node->{-Include};
- - }
- - }
- - }
- - }
- -
- - return $filenode_ref;
- -}
- -
- -sub render_find_packages {
- - my ($tx, @srcs) = @_;
- - my %find_packages_supported_by_cmake = (
- - # include_pattern => package_name
- -
- - #'' => 'ALSA',
- - #'' => 'Armadillo',
- - #'' => 'ASPELL',
- - #'' => 'AVIFile',
- - #'' => 'BISON',
- - #'' => 'BLAS',
- - 'boost/' => 'Boost',
- - #'' => 'Bullet',
- - #'' => 'BZip2',
- - #'' => 'CABLE',
- - #'' => 'Coin3D',
- - #'' => 'CUDA',
- - #'' => 'Cups',
- - #'' => 'CURL',
- - #'' => 'Curses',
- - #'' => 'CVS',
- - #'' => 'CxxTest',
- - #'' => 'Cygwin',
- - #'' => 'Dart',
- - #'' => 'DCMTK',
- - #'' => 'DevIL',
- - #'' => 'Doxygen',
- - #'' => 'EXPAT',
- - #'' => 'FLEX',
- - #'' => 'FLTK',
- - #'' => 'FLTK2',
- - #'' => 'Freetype',
- - #'' => 'GCCXML',
- - #'' => 'GDAL',
- - #'' => 'Gettext',
- - #'' => 'GIF',
- - #'' => 'Git',
- - #'' => 'GLU',
- - #'' => 'GLUT',
- - #'' => 'Gnuplot',
- - #'' => 'GnuTLS',
- - #'' => 'GTest',
- - #'' => 'GTK',
- - #'' => 'GTK2',
- - #'' => 'HDF5',
- - #'' => 'HSPELL',
- - #'' => 'HTMLHelp',
- - #'' => 'ImageMagick',
- - #'' => 'ITK',
- - #'' => 'Jasper',
- - #'' => 'Java',
- - #'' => 'JNI',
- - #'' => 'JPEG',
- - #'' => 'KDE3',
- - #'' => 'KDE4',
- - #'' => 'LAPACK',
- - #'' => 'LATEX',
- - #'' => 'LibArchive',
- - #'' => 'LibLZMA',
- - #'' => 'LibXml2',
- - #'' => 'LibXslt',
- - #'' => 'Lua50',
- - #'' => 'Lua51',
- - #'' => 'Matlab',
- - #'' => 'MFC',
- - #'' => 'Motif',
- - #'' => 'MPEG',
- - #'' => 'MPEG2',
- - #'' => 'MPI',
- - #'' => 'OpenAL',
- - #'' => 'OpenGL',
- - #'' => 'OpenMP',
- - #'' => 'OpenSceneGraph',
- - 'openssl/' => 'OpenSSL',
- - #'' => 'OpenThreads',
- - #'' => 'osg',
- - #'' => 'osgAnimation',
- - #'' => 'osgDB',
- - #'' => 'osgFX',
- - #'' => 'osgGA',
- - #'' => 'osgIntrospection',
- - #'' => 'osgManipulator',
- - #'' => 'osgParticle',
- - #'' => 'osgPresentation',
- - #'' => 'osgProducer',
- - #'' => 'osgQt',
- - #'' => 'osgShadow',
- - #'' => 'osgSim',
- - #'' => 'osgTerrain',
- - #'' => 'osgText',
- - #'' => 'osgUtil',
- - #'' => 'osgViewer',
- - #'' => 'osgVolume',
- - #'' => 'osgWidget',
- - #'' => 'osg_functions',
- - #'' => 'PackageHandleStandardArgs',
- - #'' => 'PackageMessage',
- - #'' => 'Perl',
- - #'' => 'PerlLibs',
- - #'' => 'PHP4',
- - #'' => 'PhysFS',
- - #'' => 'Pike',
- - #'' => 'PkgConfig',
- - #'' => 'PNG',
- - #'' => 'PostgreSQL',
- - #'' => 'Producer',
- - #'' => 'Protobuf',
- - #'' => 'PythonInterp',
- - #'' => 'PythonLibs',
- - #'' => 'Qt',
- - #'' => 'Qt3',
- - #'' => 'Qt4',
- - #'' => 'QuickTime',
- - #'' => 'RTI',
- - #'' => 'Ruby',
- - 'SDL/' => 'SDL',
- - #'' => 'SDL_image',
- - #'' => 'SDL_mixer',
- - #'' => 'SDL_net',
- - #'' => 'SDL_sound',
- - #'' => 'SDL_ttf',
- - #'' => 'SelfPackers',
- - #'' => 'Squish',
- - #'' => 'Subversion',
- - #'' => 'SWIG',
- - #'' => 'TCL',
- - #'' => 'Tclsh',
- - #'' => 'TclStub',
- - #'' => 'Threads',
- - #'' => 'TIFF',
- - #'' => 'UnixCommands',
- - #'' => 'VTK',
- - #'' => 'Wget',
- - #'' => 'Wish',
- - #'' => 'wxWidgets',
- - #'' => 'wxWindows',
- - #'' => 'X11',
- - 'xercesc' => 'XercesC',
- - #'' => 'XMLRPC',
- - 'zlib.h' => 'ZLIB',
- - );
- - my $rendered_find_packages = '';
- -
- - # find all libs that used
- - my @libs_to_find_patterns = keys(%find_packages_supported_by_cmake);
- - my @libs;
- - for my $file (@srcs) {
- - # find libs that the file uses
- - open my $info, $file or die "Could not open $file: $!";
- - while( my $line = <$info>) {
- - if ($line =~ /#\s*include/) {
- - my @lib_pattern_indexes_to_delete;
- -
- - for my $lib_match (@libs_to_find_patterns) {
- - if ($line =~ m/^\s*#\s*include\s*<$lib_match/) {
- - my $lib = $find_packages_supported_by_cmake{$lib_match};
- - push @libs, $lib;
- -
- - my $lib_index = 0;
- - $lib_index++ until $libs_to_find_patterns[$lib_index] eq $lib_match;
- - push @lib_pattern_indexes_to_delete, $lib_index;
- - }
- - }
- -
- - for my $index (@lib_pattern_indexes_to_delete) {
- - splice(@libs_to_find_patterns, $index, 1);
- - }
- - }
- - }
- - close $info;
- - }
- -
- - for my $lib (@libs) {
- - my %vars = (
- - package => $lib,
- - package_upcase => uc $lib,
- - );
- - warn Dumper(%vars);
- -
- - try {
- - my $render = $tx->render( 'CMakeFindPackage.tx', \%vars );
- - $rendered_find_packages = $rendered_find_packages . $render;
- - } catch {
- - print "caught error: $_\n";
- - };
- - }
- -
- - return Text::Xslate::Util::mark_raw($rendered_find_packages);
- -}
- -
- -sub render_source_groups {
- - my ($tx, %filters) = @_;
- -
- - my $rendered_source_groups = '';
- - for my $filter (keys %filters) {
- - my @files = @{$filters{$filter}};
- - $filter =~ s/\\/\\\\/g;
- - my %vars = (
- - flter => $filter,
- - files => +(join "\n\t", @files),
- - );
- - warn Dumper(%vars);
- -
- - try {
- - my $render = $tx->render( 'CMakeSourceGroup.tx', \%vars );
- - $rendered_source_groups = $rendered_source_groups . $render;
- - } catch {
- - print "caught error: $_\n";
- - };
- - }
- -
- - return Text::Xslate::Util::mark_raw($rendered_source_groups);
- -}
- -
- -sub make {
- - my ($filenode_ref, $item_def_ref, %filters) = @_;
- -
- - my @srcs = @{$filenode_ref->{ClCompile}};
- - my @headers = @{$filenode_ref->{ClInclude}};
- - my $add_dir = $item_def_ref->{ClCompile}->{AdditionalIncludeDirectories};
- - $add_dir =~ s{\\}{/}g;
- - my @includes =
- - grep { $_ ne '%(AdditionalIncludeDirectories)' }
- - split ';', $add_dir;
- -
- - my $def = $item_def_ref->{ClCompile}->{PreprocessorDefinitions};
- - # add prefix -D. example> -DSHP
- - my @defs =
- - map { "-D$_"; }
- - grep { $_ ne '%(PreprocessorDefinitions)' }
- - split ';', $def;
- -
- - my $add_dep = $item_def_ref->{Link}->{AdditionalDependencies};
- - $add_dep =~ s{\\}{/}g;
- - my @deps =
- - grep { $_ ne '%(AdditionalDependencies)' }
- - split ';', $add_dep;
- -
- - warn Dumper(@includes);
- -
- - my $tx = Text::Xslate->new(
- - syntax => 'TTerse',
- - path => [ '.', '.' ],
- - );
- -
- - my $rendered_find_packages = render_find_packages($tx, @headers, @srcs);
- - my $rendered_source_groups = render_source_groups($tx, %filters);
- -
- - my %vars = (
- - type => $target_prop->{ConfigurationType},
- - charset => $target_prop->{CharacterSet},
- - target => $target,
- - def => +(join "\n\t", @defs),
- - lib => +(join "\n\t", @deps),
- - include => +(join "\n\t", @includes),
- - src => +(join "\n\t", @srcs),
- - header => +(join "\n\t", @headers),
- - source_groups => $rendered_source_groups,
- - find_packages => $rendered_find_packages,
- - );
- -
- - warn Dumper(%vars);
- -
- - my $render_text;
- - try {
- - $render_text = $tx->render( 'CMakeLists.tx', \%vars );
- - } catch {
- - print "caught error: $_\n";
- - };
- -
- - open my $cmakelists_file, '>', 'CMakeLists.txt';
- - print {$cmakelists_file} $render_text;
- -}
- +#!/usr/bin/env perl
- +
- +use strict;
- +use warnings;
- +use utf8;
- +use feature 'say';
- +use Readonly;
- +
- +use autobox::Core;
- +use Try::Tiny;
- +use XML::TreePP;
- +use XML::TreePP::XMLPath;
- +use Text::Xslate;
- +use Data::Dumper;
- +use FindBin;
- +
- +my $filepath = $ARGV[0]
- + || die "Usage: $FindBin::Script <vcxproj path> <target configuration>";
- +my $target_conf = $ARGV[1]
- + || die "Usage: $FindBin::Script <vcxproj path> <target configuration>";
- +
- +my $filters_path = $filepath . '.filters';
- +
- +
- +my $vcxproj_xml = XML::TreePP->new()->parsefile($filepath);
- +my $vcxproj_filters_xml = XML::TreePP->new()->parsefile($filters_path);
- +my $target = $vcxproj_xml->{Project}->{PropertyGroup}->[0]->{RootNamespace};
- +my $target_prop = get_target_property($target_conf,
- + get_propertys($vcxproj_xml));
- +my $filenode_ref = get_file_node($vcxproj_xml);
- +my $item_def_ref = get_item_def_group($vcxproj_xml,
- + $target_prop->{-Condition});
- +my %filters = get_filters($vcxproj_filters_xml);
- +
- +make($filenode_ref, $item_def_ref, %filters);
- +
- +sub get_filters {
- + my ($vcxproj_filters_xml) = @_;
- + my %filters = ();
- +
- + my @itemgroups = @{$vcxproj_filters_xml->{Project}->{ItemGroup}};
- +
- + # first itemgroup is list of filters
- + for my $filter (@{$itemgroups[0]->{Filter}}) {
- + my $filtername = $filter->{-Include};
- + my @files = ();
- + @{$filters{$filtername}} = @files;
- + }
- +
- + # second itemgroup contains sorce files filter information
- + for my $clcompile (@{$itemgroups[1]->{ClCompile}}) {
- + my $filename = $clcompile->{-Include};
- + my $filter = $clcompile->{Filter};
- + push @{$filters{$filter}}, $filename;
- + }
- +
- + # third itemgroup contains header files filter information
- + for my $clinclude (@{$itemgroups[2]->{ClInclude}}) {
- + my $filename = $clinclude->{-Include};
- + my $filter = $clinclude->{Filter};
- + push @{$filters{$filter}}, $filename;
- + }
- +
- + # fourth itemgroup contains filter information for files that should not compiled (like readme)
- +
- + # fifth itemgroup contains recources filter
- +
- + # remove empty arrays
- + my @toDelete;
- + for my $filter (keys %filters) {
- + my @filterfiles = @{$filters{$filter}};
- + if (scalar @filterfiles == 0) {
- + push @toDelete, $filter;
- + }
- + }
- + #delete @filters{@toDelete};
- +
- + return %filters;
- +}
- +
- +sub get_target_property {
- + my ($target_conf, @property_groups) = @_;
- + my $target_prop;
- + for my $property (@property_groups) {
- + if ($property->{-Condition} =~ m{$target_conf}) {
- + $target_prop = $property;
- + last;
- + }
- + }
- +
- + return $target_prop;
- +}
- +
- +sub get_item_def_group {
- + my ($vcxproj_xml, $cond) = @_;
- + my $tppx = new XML::TreePP::XMLPath;
- +
- + # my $xpath = '/Project/ItemDefinitionGroup[@Condition="'.$cond.'"]';
- + # warn $xpath;
- + # my $item_def_ref = $tppx->filterXMLDoc($vcxproj_xml, $xpath);
- + my $item_def_ref;
- + for my $item_def ($tppx->filterXMLDoc($vcxproj_xml,
- + '/Project/ItemDefinitionGroup')) {
- + if ($item_def->{-Condition} eq $cond) {
- + $item_def_ref = $item_def;
- + last;
- + }
- + }
- +
- + return $item_def_ref;
- +}
- +
- +sub get_propertys {
- + my ($vcxproj_xml) = @_;
- + my $property_node_ref;
- +
- + my $tppx = new XML::TreePP::XMLPath;
- + my @property_groups
- + = $tppx->filterXMLDoc($vcxproj_xml,
- + '/Project/PropertyGroup[@Label="Configuration"]');
- +
- + return @property_groups;
- +}
- +
- +sub get_file_node {
- + my ($vcxproj_xml) = @_;
- + my @itemgroups = @{$vcxproj_xml->{Project}->{ItemGroup}};
- + my $filenode_ref;
- + for my $itemgroup (@itemgroups) {
- + next if (defined $itemgroup->{-Label}
- + && $itemgroup->{-Label} eq 'ProjectConfigurations');
- +
- + for my $nodename (keys %{$itemgroup}) {
- + my @nodes;
- +
- + if (ref($itemgroup->{$nodename}) eq 'HASH') {
- + push @nodes, $itemgroup->{$nodename};
- + } else {
- + @nodes = @{$itemgroup->{$nodename}};
- + }
- +
- + for my $node (@nodes) {
- + unless (defined $node->{ExcludedFromBuild}
- + && $node->{ExcludedFromBuild}->{-Condition} eq $target_prop->{-Condition}) {
- + push @{$filenode_ref->{$nodename}}, $node->{-Include};
- + }
- + }
- + }
- + }
- +
- + return $filenode_ref;
- +}
- +
- +sub render_find_packages {
- + my ($tx, @srcs) = @_;
- + my %find_packages_supported_by_cmake = (
- + # include_pattern => package_name
- +
- + #'' => 'ALSA',
- + #'' => 'Armadillo',
- + #'' => 'ASPELL',
- + #'' => 'AVIFile',
- + #'' => 'BISON',
- + #'' => 'BLAS',
- + 'boost/' => 'Boost',
- + #'' => 'Bullet',
- + #'' => 'BZip2',
- + #'' => 'CABLE',
- + #'' => 'Coin3D',
- + #'' => 'CUDA',
- + #'' => 'Cups',
- + #'' => 'CURL',
- + #'' => 'Curses',
- + #'' => 'CVS',
- + #'' => 'CxxTest',
- + #'' => 'Cygwin',
- + #'' => 'Dart',
- + #'' => 'DCMTK',
- + #'' => 'DevIL',
- + #'' => 'Doxygen',
- + #'' => 'EXPAT',
- + #'' => 'FLEX',
- + #'' => 'FLTK',
- + #'' => 'FLTK2',
- + #'' => 'Freetype',
- + #'' => 'GCCXML',
- + #'' => 'GDAL',
- + #'' => 'Gettext',
- + #'' => 'GIF',
- + #'' => 'Git',
- + #'' => 'GLU',
- + #'' => 'GLUT',
- + #'' => 'Gnuplot',
- + #'' => 'GnuTLS',
- + #'' => 'GTest',
- + #'' => 'GTK',
- + #'' => 'GTK2',
- + #'' => 'HDF5',
- + #'' => 'HSPELL',
- + #'' => 'HTMLHelp',
- + #'' => 'ImageMagick',
- + #'' => 'ITK',
- + #'' => 'Jasper',
- + #'' => 'Java',
- + #'' => 'JNI',
- + #'' => 'JPEG',
- + #'' => 'KDE3',
- + #'' => 'KDE4',
- + #'' => 'LAPACK',
- + #'' => 'LATEX',
- + #'' => 'LibArchive',
- + #'' => 'LibLZMA',
- + #'' => 'LibXml2',
- + #'' => 'LibXslt',
- + #'' => 'Lua50',
- + #'' => 'Lua51',
- + #'' => 'Matlab',
- + #'' => 'MFC',
- + #'' => 'Motif',
- + #'' => 'MPEG',
- + #'' => 'MPEG2',
- + #'' => 'MPI',
- + #'' => 'OpenAL',
- + #'' => 'OpenGL',
- + #'' => 'OpenMP',
- + #'' => 'OpenSceneGraph',
- + 'openssl/' => 'OpenSSL',
- + #'' => 'OpenThreads',
- + #'' => 'osg',
- + #'' => 'osgAnimation',
- + #'' => 'osgDB',
- + #'' => 'osgFX',
- + #'' => 'osgGA',
- + #'' => 'osgIntrospection',
- + #'' => 'osgManipulator',
- + #'' => 'osgParticle',
- + #'' => 'osgPresentation',
- + #'' => 'osgProducer',
- + #'' => 'osgQt',
- + #'' => 'osgShadow',
- + #'' => 'osgSim',
- + #'' => 'osgTerrain',
- + #'' => 'osgText',
- + #'' => 'osgUtil',
- + #'' => 'osgViewer',
- + #'' => 'osgVolume',
- + #'' => 'osgWidget',
- + #'' => 'osg_functions',
- + #'' => 'PackageHandleStandardArgs',
- + #'' => 'PackageMessage',
- + #'' => 'Perl',
- + #'' => 'PerlLibs',
- + #'' => 'PHP4',
- + #'' => 'PhysFS',
- + #'' => 'Pike',
- + #'' => 'PkgConfig',
- + #'' => 'PNG',
- + #'' => 'PostgreSQL',
- + #'' => 'Producer',
- + #'' => 'Protobuf',
- + #'' => 'PythonInterp',
- + #'' => 'PythonLibs',
- + #'' => 'Qt',
- + #'' => 'Qt3',
- + #'' => 'Qt4',
- + #'' => 'QuickTime',
- + #'' => 'RTI',
- + #'' => 'Ruby',
- + 'SDL/' => 'SDL',
- + #'' => 'SDL_image',
- + #'' => 'SDL_mixer',
- + #'' => 'SDL_net',
- + #'' => 'SDL_sound',
- + #'' => 'SDL_ttf',
- + #'' => 'SelfPackers',
- + #'' => 'Squish',
- + #'' => 'Subversion',
- + #'' => 'SWIG',
- + #'' => 'TCL',
- + #'' => 'Tclsh',
- + #'' => 'TclStub',
- + #'' => 'Threads',
- + #'' => 'TIFF',
- + #'' => 'UnixCommands',
- + #'' => 'VTK',
- + #'' => 'Wget',
- + #'' => 'Wish',
- + #'' => 'wxWidgets',
- + #'' => 'wxWindows',
- + #'' => 'X11',
- + 'xercesc' => 'XercesC',
- + #'' => 'XMLRPC',
- + 'zlib.h' => 'ZLIB',
- + );
- + my $rendered_find_packages = '';
- +
- + # find all libs that used
- + my @libs_to_find_patterns = keys(%find_packages_supported_by_cmake);
- + my @libs;
- + for my $file (@srcs) {
- + # find libs that the file uses
- + open my $info, $file or die "Could not open $file: $!";
- + while( my $line = <$info>) {
- + if ($line =~ /#\s*include/) {
- + my @lib_pattern_indexes_to_delete;
- +
- + for my $lib_match (@libs_to_find_patterns) {
- + if ($line =~ m/^\s*#\s*include\s*<$lib_match/) {
- + my $lib = $find_packages_supported_by_cmake{$lib_match};
- + push @libs, $lib;
- +
- + my $lib_index = 0;
- + $lib_index++ until $libs_to_find_patterns[$lib_index] eq $lib_match;
- + push @lib_pattern_indexes_to_delete, $lib_index;
- + }
- + }
- +
- + for my $index (@lib_pattern_indexes_to_delete) {
- + splice(@libs_to_find_patterns, $index, 1);
- + }
- + }
- + }
- + close $info;
- + }
- +
- + for my $lib (@libs) {
- + my %vars = (
- + package => $lib,
- + package_upcase => uc $lib,
- + );
- + warn Dumper(%vars);
- +
- + try {
- + my $render = $tx->render( 'CMakeFindPackage.tx', \%vars );
- + $rendered_find_packages = $rendered_find_packages . $render;
- + } catch {
- + print "caught error: $_\n";
- + };
- + }
- +
- + return Text::Xslate::Util::mark_raw($rendered_find_packages);
- +}
- +
- +sub render_source_groups {
- + my ($tx, %filters) = @_;
- +
- + my $rendered_source_groups = '';
- + for my $filter (keys %filters) {
- + my @files = @{$filters{$filter}};
- + $filter =~ s/\\/\\\\/g;
- + my %vars = (
- + flter => $filter,
- + files => +(join "\n\t", @files),
- + );
- + warn Dumper(%vars);
- +
- + try {
- + my $render = $tx->render( 'CMakeSourceGroup.tx', \%vars );
- + $rendered_source_groups = $rendered_source_groups . $render;
- + } catch {
- + print "caught error: $_\n";
- + };
- + }
- +
- + return Text::Xslate::Util::mark_raw($rendered_source_groups);
- +}
- +
- +sub make {
- + my ($filenode_ref, $item_def_ref, %filters) = @_;
- +
- + my @srcs = @{$filenode_ref->{ClCompile}};
- + my @headers = @{$filenode_ref->{ClInclude}};
- + my $add_dir = $item_def_ref->{ClCompile}->{AdditionalIncludeDirectories};
- + $add_dir =~ s{\\}{/}g;
- + my @includes =
- + grep { $_ ne '%(AdditionalIncludeDirectories)' }
- + split ';', $add_dir;
- +
- + my $def = $item_def_ref->{ClCompile}->{PreprocessorDefinitions};
- + # add prefix -D. example> -DSHP
- + my @defs =
- + map { "-D$_"; }
- + grep { $_ ne '%(PreprocessorDefinitions)' }
- + split ';', $def;
- +
- + my $add_dep = $item_def_ref->{Link}->{AdditionalDependencies};
- + $add_dep =~ s{\\}{/}g;
- + my @deps =
- + grep { $_ ne '%(AdditionalDependencies)' }
- + split ';', $add_dep;
- +
- + warn Dumper(@includes);
- +
- + my $tx = Text::Xslate->new(
- + syntax => 'TTerse',
- + path => [ '.', '.' ],
- + );
- +
- + my $rendered_find_packages = render_find_packages($tx, @headers, @srcs);
- + my $rendered_source_groups = render_source_groups($tx, %filters);
- +
- + my %vars = (
- + type => $target_prop->{ConfigurationType},
- + charset => $target_prop->{CharacterSet},
- + target => $target,
- + def => +(join "\n\t", @defs),
- + lib => +(join "\n\t", @deps),
- + include => +(join "\n\t", @includes),
- + src => +(join "\n\t", @srcs),
- + header => +(join "\n\t", @headers),
- + source_groups => $rendered_source_groups,
- + find_packages => $rendered_find_packages,
- + );
- +
- + warn Dumper(%vars);
- +
- + my $render_text;
- + try {
- + $render_text = $tx->render( 'CMakeLists.tx', \%vars );
- + } catch {
- + print "caught error: $_\n";
- + };
- +
- + open my $cmakelists_file, '>', 'CMakeLists.txt';
- + print {$cmakelists_file} $render_text;
- +}
- diff --git a/PMDCamera.cpp b/PMDCamera.cpp
- index 97d3929..ef8b32c 100644
- --- a/PMDCamera.cpp
- +++ b/PMDCamera.cpp
- @@ -1,186 +1,159 @@
- -#include "PMDCamera.h"
- -
- -/***
- -Private constructor for the PMD depth sensor
- -***/
- -PMDCamera::PMDCamera(bool use_live_sensor)
- -{
- - CONFIDENCE_THRESHHOLD = (60.0f / 255.0f*500.0f);
- - INVALID_FLAG_VALUE = PMD_FLAG_INVALID;
- - X_DIMENSION = 176;
- - Y_DIMENSION = 120;
- -
- - if (!use_live_sensor) {
- - return;
- - }
- -
- - int res;
- - std::cout << "Trying to open pmd\n";
- - res = pmdOpen(&hnd, SOURCE_PLUGIN, SOURCE_PARAM, PROC_PLUGIN, PROC_PARAM); //Open the PMD sensor
- - if (res != PMD_OK)
- - {
- - pmdGetLastError(0, err, 128);
- - fprintf(stderr, "Could not connect: %s\n", err);
- - return;
- - }
- - printf("opened sensor\n");
- -
- - // Updating the sensor is necessary before any data can be retrieved
- - res = pmdUpdate(hnd);
- - if (res != PMD_OK)
- - {
- - pmdGetLastError(hnd, err, 128);
- - fprintf(stderr, "Couldn't transfer data: %s\n", err);
- - pmdClose(hnd);
- - return;
- - }
- - printf("acquired image\n");
- -
- - // res: Structure which contains various meta-information about the data delivered by your Nano.
- - // It is advisabe to always use the data delivered by this struct (for example the width and height of the imager
- - // and the image format). Please refer to the PMSDSK documentation for more information
- - res = pmdGetSourceDataDescription(hnd, &dd);
- - if (res != PMD_OK)
- - {
- - pmdGetLastError(hnd, err, 128);
- - fprintf(stderr, "Couldn't get data description: %s\n", err);
- - pmdClose(hnd);
- - return;
- - }
- -
- - printf("retrieved source data description\n");
- - if (dd.subHeaderType != PMD_IMAGE_DATA)
- - {
- - fprintf(stderr, "Source data is not an image!\n");
- - pmdClose(hnd);
- - return;
- - }
- -
- - numPixels = dd.img.numRows * dd.img.numColumns; // Number of pixels in camera
- - dists = new float[3 * numPixels]; // Dists contains XYZ values. needs to be 3x the size of numPixels
- - amps = new float[numPixels];
- - frame.create(dd.img.numRows, dd.img.numColumns, CV_8UC3);
- -
- - KF.init(6, 3, 0);
- - KF.transitionMatrix = (cv::Mat_<float>(6, 6) << 1, 0, 0, 1, 0, 0,
- - 0, 1, 0, 0, 1, 0,
- - 0, 0, 1, 0, 0, 1,
- - 0, 0, 0, 1, 0, 0,
- - 0, 0, 0, 0, 1, 0,
- - 0, 0, 0, 0, 0, 1);
- - measurement = cv::Mat_<float>::zeros(3, 1);
- -
- - //Initaite Kalman
- - KF.statePre.setTo(0);
- - setIdentity(KF.measurementMatrix);
- - setIdentity(KF.processNoiseCov, cv::Scalar::all(.001)); // Adjust this for faster convergence - but higher noise
- - setIdentity(KF.measurementNoiseCov, cv::Scalar::all(1e-1));
- - setIdentity(KF.errorCovPost, cv::Scalar::all(.1));
- -
- -}
- -
- -/***
- -Public deconstructor for he PMD depth sensor
- -***/
- -PMDCamera::~PMDCamera() {}
- -
- -void PMDCamera::destroyInstance()
- -{
- - printf("closing sensor\n");
- - pmdClose(hnd);
- - printf("sensor closed\n");
- -}
- -
- -/***
- -Create xyzMap, zMap, ampMap, and flagMap from sensor input
- -***/
- -void PMDCamera::update()
- -{
- - initilizeImages();
- -
- - fillInAmps();
- - fillInZCoords();
- - // Flags. Helps with denoising.
- -
- - unsigned *flags = new unsigned[ampMap.cols*ampMap.rows];
- - int res = pmdGetFlags(hnd, flags, numPixels * sizeof(unsigned));
- - if (res != PMD_OK) {
- - pmdGetLastError(hnd, err, 128);
- - fprintf(stderr, "Couldn't get the flags: %s\n", err);
- - pmdClose(hnd);
- - return;
- - }
- - flagMap.data = (uchar *)flags;
- -
- - res = pmdUpdate(hnd);
- - if (res != PMD_OK) {
- - pmdGetLastError(hnd, err, 128);
- - fprintf(stderr, "Couldn't update the PMD camera: %s\n", err);
- - pmdClose(hnd);
- - return;
- - }
- - delete(flags);
- -
- -}
- -
- -
- -/***
- -Reads the depth data from the sensor and fills in the matrix
- -***/
- -void PMDCamera::fillInZCoords()
- -{
- - int res = pmdGet3DCoordinates(hnd, dists, 3 * numPixels * sizeof(float)); //store x,y,z coordinates dists (type: float*)
- - //float * zCoords = new float[1]; //store z-Coordinates of dists in zCoords
- - if (res != PMD_OK) {
- - pmdGetLastError(hnd, err, 128);
- - fprintf(stderr, "Couldn't get 3D coordinates: %s\n", err);
- - pmdClose(hnd);
- - return;
- - }
- - xyzMap = cv::Mat(xyzMap.size(), xyzMap.type(), dists);
- - //std::cout << "nrows: " << xyzMap.rows << std::endl;
- - //std::cout << "ncols: " << xyzMap.cols << std::endl;
- -}
- -
- -/***
- -Reads the amplitude data from the sensor and fills in the matrix
- -***/
- -void PMDCamera::fillInAmps()
- -{
- - int res = pmdGetAmplitudes(hnd, amps, numPixels * sizeof(float));
- - //float * dataPtr = amps;
- - if (res != PMD_OK) {
- - pmdGetLastError(hnd, err, 128);
- - fprintf(stderr, "Couldn't get amplitudes: %s\n", err);
- - pmdClose(hnd);
- - return;
- - }
- - ampMap.data = (uchar *)amps;
- -}
- -
- -/***
- -Returns the X value at (i, j)
- -***/
- -float PMDCamera::getX(int i, int j) const
- -{
- - int flat = j * dd.img.numColumns * 3 + i * 3;
- - return dists[flat];
- -}
- -
- -/***
- -Returns the Y value at (i, j)
- -***/
- -float PMDCamera::getY(int i, int j) const
- -{
- - int flat = j * dd.img.numColumns * 3 + i * 3;
- - return dists[flat + 1];
- -}
- -
- -/***
- -Returns the Z value at (i, j)
- -***/
- -float PMDCamera::getZ(int i, int j) const
- -{
- - int flat = j * dd.img.numColumns * 3 + i * 3;
- - return dists[flat + 2];
- +#include "PMDCamera.h"
- +
- +/***
- +Private constructor for the PMD depth sensor
- +***/
- +PMDCamera::PMDCamera(bool use_live_sensor)
- +{
- + CONFIDENCE_THRESHHOLD = (60.0f / 255.0f*500.0f);
- + INVALID_FLAG_VALUE = PMD_FLAG_INVALID;
- + X_DIMENSION = 176;
- + Y_DIMENSION = 120;
- +
- + if (!use_live_sensor) {
- + return;
- + }
- +
- + int res;
- + std::cout << "Trying to open pmd\n";
- + res = pmdOpen(&hnd, SOURCE_PLUGIN, SOURCE_PARAM, PROC_PLUGIN, PROC_PARAM); //Open the PMD sensor
- + if (res != PMD_OK)
- + {
- + pmdGetLastError(0, err, 128);
- + fprintf(stderr, "Could not connect: %s\n", err);
- + return;
- + }
- + printf("opened sensor\n");
- +
- + // Updating the sensor is necessary before any data can be retrieved
- + res = pmdUpdate(hnd);
- + if (res != PMD_OK)
- + {
- + pmdGetLastError(hnd, err, 128);
- + fprintf(stderr, "Couldn't transfer data: %s\n", err);
- + pmdClose(hnd);
- + return;
- + }
- + printf("acquired image\n");
- +
- + // res: Structure which contains various meta-information about the data delivered by your Nano.
- + // It is advisabe to always use the data delivered by this struct (for example the width and height of the imager
- + // and the image format). Please refer to the PMSDSK documentation for more information
- + res = pmdGetSourceDataDescription(hnd, &dd);
- + if (res != PMD_OK)
- + {
- + pmdGetLastError(hnd, err, 128);
- + fprintf(stderr, "Couldn't get data description: %s\n", err);
- + pmdClose(hnd);
- + return;
- + }
- +
- + printf("retrieved source data description\n");
- + if (dd.subHeaderType != PMD_IMAGE_DATA)
- + {
- + fprintf(stderr, "Source data is not an image!\n");
- + pmdClose(hnd);
- + return;
- + }
- +
- + numPixels = dd.img.numRows * dd.img.numColumns; // Number of pixels in camera
- + dists = new float[3 * numPixels]; // Dists contains XYZ values. needs to be 3x the size of numPixels
- + amps = new float[numPixels];
- + frame = cvCreateImage(cvSize(dd.img.numColumns, dd.img.numRows), 8, 3); // Create the frame
- +
- + KF.init(6, 3, 0);
- + KF.transitionMatrix = (cv::Mat_<float>(6, 6) << 1, 0, 0, 1, 0, 0,
- + 0, 1, 0, 0, 1, 0,
- + 0, 0, 1, 0, 0, 1,
- + 0, 0, 0, 1, 0, 0,
- + 0, 0, 0, 0, 1, 0,
- + 0, 0, 0, 0, 0, 1);
- + measurement = cv::Mat_<float>::zeros(3, 1);
- +
- + //Initaite Kalman
- + KF.statePre.setTo(0);
- + setIdentity(KF.measurementMatrix);
- + setIdentity(KF.processNoiseCov, cv::Scalar::all(.001)); // Adjust this for faster convergence - but higher noise
- + setIdentity(KF.measurementNoiseCov, cv::Scalar::all(1e-1));
- + setIdentity(KF.errorCovPost, cv::Scalar::all(.1));
- +}
- +
- +/***
- +Public deconstructor for he PMD depth sensor
- +***/
- +PMDCamera::~PMDCamera() {}
- +
- +void PMDCamera::destroyInstance()
- +{
- + printf("closing sensor\n");
- + pmdClose(hnd);
- + printf("sensor closed\n");
- +}
- +
- +/***
- +Create xyzMap, zMap, ampMap, and flagMap from sensor input
- +***/
- +void PMDCamera::update()
- +{
- + initilizeImages();
- +
- + fillInAmps();
- + fillInZCoords();
- + // Flags. Helps with denoising.
- +
- + unsigned *flags = new unsigned[ampMap.cols*ampMap.rows];
- + int res = pmdGetFlags(hnd, flags, numPixels * sizeof(unsigned));
- + flagMap.data = (uchar *)flags;
- +
- + pmdUpdate(hnd);
- + delete(flags);
- +
- +}
- +
- +
- +/***
- +Reads the depth data from the sensor and fills in the matrix
- +***/
- +void PMDCamera::fillInZCoords()
- +{
- + int res = pmdGet3DCoordinates(hnd, dists, 3 * numPixels * sizeof(float)); //store x,y,z coordinates dists (type: float*)
- + //float * zCoords = new float[1]; //store z-Coordinates of dists in zCoords
- + xyzMap = cv::Mat(xyzMap.size(), xyzMap.type(), dists);
- +}
- +
- +/***
- +Reads the amplitude data from the sensor and fills in the matrix
- +***/
- +void PMDCamera::fillInAmps()
- +{
- + int res = pmdGetAmplitudes(hnd, amps, numPixels * sizeof(float));
- + //float * dataPtr = amps;
- + ampMap.data = (uchar *)amps;
- +}
- +
- +/***
- +Returns the X value at (i, j)
- +***/
- +float PMDCamera::getX(int i, int j) const
- +{
- + int flat = j * dd.img.numColumns * 3 + i * 3;
- + return dists[flat];
- +}
- +
- +/***
- +Returns the Y value at (i, j)
- +***/
- +float PMDCamera::getY(int i, int j) const
- +{
- + int flat = j * dd.img.numColumns * 3 + i * 3;
- + return dists[flat + 1];
- +}
- +
- +/***
- +Returns the Z value at (i, j)
- +***/
- +float PMDCamera::getZ(int i, int j) const
- +{
- + int flat = j * dd.img.numColumns * 3 + i * 3;
- + return dists[flat + 2];
- }
- \ No newline at end of file
- diff --git a/PMDCamera.h b/PMDCamera.h
- index d4930fc..373c1f3 100644
- --- a/PMDCamera.h
- +++ b/PMDCamera.h
- @@ -1,107 +1,107 @@
- -#pragma once
- -// C++ Libraries
- -#include<string.h>
- -
- -// PMD Libraries
- -#include <pmdsdk2.h>
- -
- -// OpenCV Libraries
- -#include <opencv/cxcore.h>
- -#include <opencv/highgui.h>
- -#include "opencv2/highgui/highgui.hpp"
- -#include <opencv2/video/tracking.hpp>
- -#include "opencv2/imgproc/imgproc.hpp"
- -#include <opencv2/objdetect/objdetect.hpp>
- -#include <opencv2/features2d/features2d.hpp>
- -
- -// OpenARK Libraries
- -#include "DepthCamera.h"
- -
- -/**
- -* Class defining the behavior of a PMD Camera.
- -* Example on how to read from sensor and visualize its output
- -* @include SensorIO.cpp
- -*/
- -class PMDCamera : public DepthCamera
- -{
- -public:
- - /**
- - * Public constructor initializing the PMD Camera.
- - * @param use_live_sensor uses input from real sensor if TRUE. Otherwise reads from input file. Default is set to TRUE.
- - */
- - PMDCamera(bool use_live_sensor = true);
- -
- - /**
- - * Deconstructor for the PMD Camera.
- - */
- - ~PMDCamera();
- -
- - /**
- - * Gets new frame from sensor.
- - * Updates xyzMap, ampMap, and flagMap. Resets clusters.
- - */
- - void update();
- -
- - /**
- - * Gracefully closes the PMD camera.
- - */
- - void destroyInstance();
- -
- -private:
- - /**
- - * Getter method for the x-coordinate at (i,j).
- - * @param i ith row
- - * @param j jth column
- - * @return x-coodinate at (i,j)
- - */
- - float getX(int i, int j) const;
- -
- - /**
- - * Getter method for the x-coordinate at (i,j).
- - * @param i ith row
- - * @param j jth column
- - * @return x-coodinate at (i,j)
- - */
- - float getY(int i, int j) const;
- -
- - /**
- - * Getter method for the x-coordinate at (i,j).
- - * @param i ith row
- - * @param j jth column
- - * @return x-coodinate at (i,j)
- - */
- - float getZ(int i, int j) const;
- -
- - /**
- - * Update the z-coordinates of the xyzMap.
- - */
- - void fillInZCoords();
- -
- - /**
- - * Update the values in the ampMap.
- - */
- - void fillInAmps();
- -
- - //Private Variable
- - const char* SOURCE_PLUGIN = "camboardpico";
- - const char* SOURCE_PARAM = "";
- - const char* PROC_PLUGIN = "camboardpicoproc";
- - const char* PROC_PARAM = "";
- -
- - PMDHandle hnd;
- - PMDDataDescription dd;
- - char err[128]; // Char array for storing PMD's error log
- -
- - int numPixels;
- - float* dists;
- - float* amps;
- -
- - cv::Mat frame;
- - cv::KalmanFilter KF;
- - cv::Mat_<float> measurement;
- -};
- -
- -/*
- -* \include SensorIO.cpp
- -* Example of how to read from sensor
- +#pragma once
- +// C++ Libraries
- +#include<string.h>
- +
- +// PMD Libraries
- +#include <pmdsdk2.h>
- +
- +// OpenCV Libraries
- +#include <opencv/cxcore.h>
- +#include <opencv/highgui.h>
- +#include "opencv2/highgui/highgui.hpp"
- +#include <opencv2/video/tracking.hpp>
- +#include "opencv2/imgproc/imgproc.hpp"
- +#include <opencv2/objdetect/objdetect.hpp>
- +#include <opencv2/features2d/features2d.hpp>
- +
- +// OpenARK Libraries
- +#include "DepthCamera.h"
- +
- +/**
- +* Class defining the behavior of a PMD Camera.
- +* Example on how to read from sensor and visualize its output
- +* @include SensorIO.cpp
- +*/
- +class PMDCamera : public DepthCamera
- +{
- +public:
- + /**
- + * Public constructor initializing the PMD Camera.
- + * @param use_live_sensor uses input from real sensor if TRUE. Otherwise reads from input file. Default is set to TRUE.
- + */
- + PMDCamera(bool use_live_sensor = true);
- +
- + /**
- + * Deconstructor for the PMD Camera.
- + */
- + ~PMDCamera();
- +
- + /**
- + * Gets new frame from sensor.
- + * Updates xyzMap, ampMap, and flagMap. Resets clusters.
- + */
- + void update();
- +
- + /**
- + * Gracefully closes the PMD camera.
- + */
- + void destroyInstance();
- +
- +private:
- + /**
- + * Getter method for the x-coordinate at (i,j).
- + * @param i ith row
- + * @param j jth column
- + * @return x-coodinate at (i,j)
- + */
- + float getX(int i, int j) const;
- +
- + /**
- + * Getter method for the x-coordinate at (i,j).
- + * @param i ith row
- + * @param j jth column
- + * @return x-coodinate at (i,j)
- + */
- + float getY(int i, int j) const;
- +
- + /**
- + * Getter method for the x-coordinate at (i,j).
- + * @param i ith row
- + * @param j jth column
- + * @return x-coodinate at (i,j)
- + */
- + float getZ(int i, int j) const;
- +
- + /**
- + * Update the z-coordinates of the xyzMap.
- + */
- + void fillInZCoords();
- +
- + /**
- + * Update the values in the ampMap.
- + */
- + void fillInAmps();
- +
- + //Private Variable
- + const char* SOURCE_PLUGIN = "camboardpico";
- + const char* SOURCE_PARAM = "";
- + const char* PROC_PLUGIN = "camboardpicoproc";
- + const char* PROC_PARAM = "";
- +
- + PMDHandle hnd;
- + PMDDataDescription dd;
- + char err[128]; // Char array for storing PMD's error log
- +
- + int numPixels;
- + float* dists;
- + float* amps;
- +
- + IplImage * frame;
- + cv::KalmanFilter KF;
- + cv::Mat_<float> measurement;
- +};
- +
- +/*
- +* \include SensorIO.cpp
- +* Example of how to read from sensor
- */
- \ No newline at end of file
- diff --git a/Plane.cpp b/Plane.cpp
- index e21a5fb..370135d 100644
- --- a/Plane.cpp
- +++ b/Plane.cpp
- @@ -1,276 +1,276 @@
- -#include "Plane.h"
- -
- -Plane::Plane()
- -{
- -
- -}
- -
- -Plane::Plane(cv::Mat &src)
- -{
- - // Initialize Variables
- - cloud = new pcl::PointCloud<pcl::PointXYZ>::Ptr(new pcl::PointCloud <pcl::PointXYZ>);
- - normals = new pcl::PointCloud <pcl::Normal>::Ptr(new pcl::PointCloud <pcl::Normal>);
- - down_cloud = new pcl::PointCloud<pcl::PointXYZ>::Ptr(new pcl::PointCloud<pcl::PointXYZ>);
- - down_normals = new pcl::PointCloud<pcl::Normal>::Ptr(new pcl::PointCloud<pcl::Normal>);
- - upsampled_colored_cloud = new pcl::PointCloud<pcl::PointXYZRGB>::Ptr(new pcl::PointCloud<pcl::PointXYZRGB>);
- -
- - initializeCloud(src);
- -
- - if (cloud->get()->width < CLOUD_SIZE_THRESHOLD) {
- - return;
- - }
- -
- - compute();
- -}
- -
- -Plane::~Plane() {
- -}
- -
- -int Plane::compute()
- -{
- - voxelDownsample();
- -
- - // calculate normals
- - pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> normal_estimator;
- - pcl::search::Search<pcl::PointXYZ>::Ptr tree
- - = boost::shared_ptr<pcl::search::Search<pcl::PointXYZ> >(new pcl::search::KdTree<pcl::PointXYZ>);
- - calculateNormals(normal_estimator, tree);
- -
- - // region grow with normals
- - pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg;
- - regionGrow(reg, tree);
- -
- - // find index of dominant plane
- - int index_max = -1;
- - for (int i = 0; i < clusters.size(); i++) {
- - if (index_max == -1 || clusters[i].indices.size() > clusters[index_max].indices.size()) {
- - index_max = i;
- - }
- - }
- - if (index_max == -1) {
- - return -1;
- - }
- -
- - computePlaneLSE(clusters[index_max]);
- - computeSphereLSE(clusters[index_max]);
- -
- - num_plane_points = computePlaneIndices();
- - num_sphere_points = computeSphereIndices();
- -
- - return 0;
- -}
- -
- -void Plane::computePlaneLSE(pcl::PointIndices &ind)
- -{
- - Eigen::MatrixXd A(ind.indices.size(), 3);
- - Eigen::MatrixXd b(ind.indices.size(), 1);
- -
- - for (int i = 0; i < ind.indices.size(); i++) {
- - int index = ind.indices[i];
- - A(i, 0) = down_cloud->get()->points[index].x;
- - A(i, 1) = down_cloud->get()->points[index].y;
- - A(i, 2) = 1;
- - b(i, 0) = down_cloud->get()->points[index].z;
- - }
- -
- - Eigen::MatrixXd mul = A.transpose() * A;
- - Eigen::MatrixXd inv = mul.inverse();
- - Eigen::MatrixXd b_hat = A.transpose() * b;
- - Eigen::MatrixXd vals = inv * b_hat;
- -
- - plane_equation.clear();
- - plane_equation.resize(3);
- - plane_equation[0] = vals(0, 0);
- - plane_equation[1] = vals(1, 0);
- - plane_equation[2] = vals(2, 0);
- -}
- -
- -void Plane::computeSphereLSE( pcl::PointIndices &ind)
- -{
- - Eigen::MatrixXd A(ind.indices.size(), 4);
- - Eigen::MatrixXd b(ind.indices.size(), 1);
- -
- - for (int i = 0; i < ind.indices.size(); i++) {
- - int index = ind.indices[i];
- - A(i, 0) = 1;
- - A(i, 1) = down_cloud->get()->points[index].x;
- - A(i, 2) = down_cloud->get()->points[index].y;
- - A(i, 3) = down_cloud->get()->points[index].z;
- - b(i, 0) = down_cloud->get()->points[index].x * down_cloud->get()->points[index].x +
- - down_cloud->get()->points[index].y * down_cloud->get()->points[index].y +
- - down_cloud->get()->points[index].z * down_cloud->get()->points[index].z;
- - }
- -
- - Eigen::MatrixXd mul = A.transpose() * A;
- - Eigen::MatrixXd inv = mul.inverse();
- - Eigen::MatrixXd b_hat = A.transpose() * b;
- - Eigen::MatrixXd vals = inv * b_hat;
- -
- - double a0 = vals(0, 0);
- - double coef_a = vals(1, 0) / 2;
- - double coef_b = vals(2, 0) / 2;
- - double coef_c = vals(3, 0) / 2;
- - double radius = sqrt(a0 + coef_a * coef_a + coef_b * coef_b + coef_c * coef_c);
- -
- - sphere_equation.clear();
- - sphere_equation.resize(4);
- - sphere_equation[0] = coef_a;
- - sphere_equation[1] = coef_b;
- - sphere_equation[2] = coef_c;
- - sphere_equation[3] = radius;
- -}
- -
- -int Plane::computePlaneIndices()
- -{
- - int rowSize = depth_img.rows;
- - int colSize = depth_img.cols;
- - plane_indices.clear();
- - int num_points_detected = 0;
- - for (int r = 0; r < rowSize; r++) {
- - for (int c = 0; c < colSize; c++) {
- - double x = depth_img.at<cv::Vec3f>(r, c)[0];
- - double y = depth_img.at<cv::Vec3f>(r, c)[1];
- - double z = depth_img.at<cv::Vec3f>(r, c)[2];
- -
- - if (z > 0) {
- - double z_hat = plane_equation[0] * x + plane_equation[1] * y + plane_equation[2];
- - double r_squared = (z - z_hat) * (z - z_hat);
- -
- - if (r_squared < R_SQUARED_DISTANCE_THRESHOLD) {
- - plane_indices.push_back(cv::Point2i(c, r));
- - num_points_detected++;
- - }
- - }
- - }
- - }
- - return num_points_detected;
- -}
- -
- -int Plane::computeSphereIndices()
- -{
- - int rowSize = depth_img.rows;
- - int colSize = depth_img.cols;
- - sphere_indices.clear();
- - int pointsDetected = 0;
- - for (int r = 0; r < rowSize; r++) {
- - for (int c = 0; c < colSize; c++) {
- - double x = depth_img.at<cv::Vec3f>(r, c)[0];
- - double y = depth_img.at<cv::Vec3f>(r, c)[1];
- - double z = depth_img.at<cv::Vec3f>(r, c)[2];
- -
- - if (z > 0) {
- - double radius = sqrt((x - sphere_equation[0]) * (x - sphere_equation[0])
- - + (y - sphere_equation[1]) * (y - sphere_equation[1])
- - + (z - sphere_equation[2]) * (z - sphere_equation[2]));
- - double radial_r_squared = (radius - sphere_equation[3]) * (radius - sphere_equation[3]);
- -
- - if (radial_r_squared < R_SQUARED_DISTANCE_THRESHOLD) {
- - sphere_indices.push_back(cv::Point2i(c, r));
- - pointsDetected++;
- - }
- - }
- - }
- - }
- - return pointsDetected;
- -}
- -
- -void Plane::regionGrow(pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> ®, pcl::search::Search<pcl::PointXYZ>::Ptr tree)
- -{
- - if (down_cloud->get()->width < 100 && down_normals->get()->width < 100) {
- - return;
- - }
- -
- - reg.setMinClusterSize(20);
- - reg.setMaxClusterSize(1000000);
- - reg.setSearchMethod(tree);
- - reg.setNumberOfNeighbours(30);
- - reg.setInputCloud(*down_cloud);
- - reg.setInputNormals(*down_normals);
- - reg.setSmoothnessThreshold(3.0 / 180.0 * M_PI);
- - reg.setCurvatureThreshold(2.5);
- - reg.extract(clusters);
- -}
- -
- -void Plane::voxelDownsample()
- -{
- - pcl::PCLPointCloud2::Ptr temp_cloud(new pcl::PCLPointCloud2());
- - pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2());
- - pcl::toPCLPointCloud2(*cloud->get(), *temp_cloud);
- -
- - pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
- - sor.setInputCloud(temp_cloud);
- - sor.setLeafSize(0.01f, 0.01f, 0.01f);
- - sor.filter(*cloud_filtered);
- - pcl::fromPCLPointCloud2(*cloud_filtered, *down_cloud->get());
- -}
- -
- -void Plane::calculateNormals(pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> normal_estimator,
- - pcl::search::Search<pcl::PointXYZ>::Ptr tree)
- -{
- - normal_estimator.setNumberOfThreads(NUM_CORES);
- - normal_estimator.setSearchMethod(tree);
- - normal_estimator.setInputCloud(*down_cloud);
- - normal_estimator.setKSearch(50);
- - normal_estimator.compute(*down_normals->get());
- -}
- -
- -void Plane::initializeCloud(cv::Mat &src)
- -{
- - depth_img = src.clone();
- - int rowSize = src.rows;
- - int colSize = src.cols;
- - int cloudSize = 0;
- - for (size_t r = 0; r < rowSize; r++) {
- - for (size_t c = 0; c < colSize; c++) {
- - if (src.at<cv::Vec3f>(r, c)[2] != 0) {
- - cloudSize++;
- - }
- - }
- - }
- - cloud->get()->width = cloudSize;
- - cloud->get()->height = 1;
- - cloud->get()->points.resize(cloud->get()->width * cloud->get()->height);
- -
- - int index = 0;
- - for (size_t r = 0; r < rowSize; r++) {
- - for (size_t c = 0; c < colSize; c++) {
- - if (src.at<cv::Vec3f>(r, c)[2] != 0) {
- - cloud->get()->points[index].x = src.at<cv::Vec3f>(r, c)[0];
- - cloud->get()->points[index].y = src.at<cv::Vec3f>(r, c)[1];
- - cloud->get()->points[index].z = src.at<cv::Vec3f>(r, c)[2];
- - index++;
- - }
- - }
- - }
- -
- -}
- -
- -pcl::PointCloud<pcl::PointXYZ>::Ptr Plane::getCloud()
- -{
- - return *cloud;
- -}
- -
- -pcl::PointCloud<pcl::PointXYZ>::Ptr Plane::getDownCloud()
- -{
- - return *down_cloud;
- -}
- -
- -std::vector<double> Plane::getPlaneEquation()
- -{
- - return plane_equation;
- -}
- -
- -std::vector<double> Plane::getSphereEquation()
- -{
- - return sphere_equation;
- -}
- -
- -std::vector<cv::Point2i> Plane::getPlaneIndicies()
- -{
- - return plane_indices;
- -}
- -
- -std::vector<cv::Point2i> Plane::getSphereIndices()
- -{
- - return sphere_indices;
- +#include "Plane.h"
- +
- +Plane::Plane()
- +{
- +
- +}
- +
- +Plane::Plane(cv::Mat &src)
- +{
- + // Initialize Variables
- + cloud = new pcl::PointCloud<pcl::PointXYZ>::Ptr(new pcl::PointCloud <pcl::PointXYZ>);
- + normals = new pcl::PointCloud <pcl::Normal>::Ptr(new pcl::PointCloud <pcl::Normal>);
- + down_cloud = new pcl::PointCloud<pcl::PointXYZ>::Ptr(new pcl::PointCloud<pcl::PointXYZ>);
- + down_normals = new pcl::PointCloud<pcl::Normal>::Ptr(new pcl::PointCloud<pcl::Normal>);
- + upsampled_colored_cloud = new pcl::PointCloud<pcl::PointXYZRGB>::Ptr(new pcl::PointCloud<pcl::PointXYZRGB>);
- +
- + initializeCloud(src);
- +
- + if (cloud->get()->width < CLOUD_SIZE_THRESHOLD) {
- + return;
- + }
- +
- + compute();
- +}
- +
- +Plane::~Plane() {
- +}
- +
- +int Plane::compute()
- +{
- + voxelDownsample();
- +
- + // calculate normals
- + pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> normal_estimator;
- + pcl::search::Search<pcl::PointXYZ>::Ptr tree
- + = boost::shared_ptr<pcl::search::Search<pcl::PointXYZ> >(new pcl::search::KdTree<pcl::PointXYZ>);
- + calculateNormals(normal_estimator, tree);
- +
- + // region grow with normals
- + pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg;
- + regionGrow(reg, tree);
- +
- + // find index of dominant plane
- + int index_max = -1;
- + for (int i = 0; i < clusters.size(); i++) {
- + if (index_max == -1 || clusters[i].indices.size() > clusters[index_max].indices.size()) {
- + index_max = i;
- + }
- + }
- + if (index_max == -1) {
- + return -1;
- + }
- +
- + computePlaneLSE(clusters[index_max]);
- + computeSphereLSE(clusters[index_max]);
- +
- + num_plane_points = computePlaneIndices();
- + num_sphere_points = computeSphereIndices();
- +
- + return 0;
- +}
- +
- +void Plane::computePlaneLSE(pcl::PointIndices &ind)
- +{
- + Eigen::MatrixXd A(ind.indices.size(), 3);
- + Eigen::MatrixXd b(ind.indices.size(), 1);
- +
- + for (int i = 0; i < ind.indices.size(); i++) {
- + int index = ind.indices[i];
- + A(i, 0) = down_cloud->get()->points[index].x;
- + A(i, 1) = down_cloud->get()->points[index].y;
- + A(i, 2) = 1;
- + b(i, 0) = down_cloud->get()->points[index].z;
- + }
- +
- + Eigen::MatrixXd mul = A.transpose() * A;
- + Eigen::MatrixXd inv = mul.inverse();
- + Eigen::MatrixXd b_hat = A.transpose() * b;
- + Eigen::MatrixXd vals = inv * b_hat;
- +
- + plane_equation.clear();
- + plane_equation.resize(3);
- + plane_equation[0] = vals(0, 0);
- + plane_equation[1] = vals(1, 0);
- + plane_equation[2] = vals(2, 0);
- +}
- +
- +void Plane::computeSphereLSE( pcl::PointIndices &ind)
- +{
- + Eigen::MatrixXd A(ind.indices.size(), 4);
- + Eigen::MatrixXd b(ind.indices.size(), 1);
- +
- + for (int i = 0; i < ind.indices.size(); i++) {
- + int index = ind.indices[i];
- + A(i, 0) = 1;
- + A(i, 1) = down_cloud->get()->points[index].x;
- + A(i, 2) = down_cloud->get()->points[index].y;
- + A(i, 3) = down_cloud->get()->points[index].z;
- + b(i, 0) = down_cloud->get()->points[index].x * down_cloud->get()->points[index].x +
- + down_cloud->get()->points[index].y * down_cloud->get()->points[index].y +
- + down_cloud->get()->points[index].z * down_cloud->get()->points[index].z;
- + }
- +
- + Eigen::MatrixXd mul = A.transpose() * A;
- + Eigen::MatrixXd inv = mul.inverse();
- + Eigen::MatrixXd b_hat = A.transpose() * b;
- + Eigen::MatrixXd vals = inv * b_hat;
- +
- + double a0 = vals(0, 0);
- + double coef_a = vals(1, 0) / 2;
- + double coef_b = vals(2, 0) / 2;
- + double coef_c = vals(3, 0) / 2;
- + double radius = sqrt(a0 + coef_a * coef_a + coef_b * coef_b + coef_c * coef_c);
- +
- + sphere_equation.clear();
- + sphere_equation.resize(4);
- + sphere_equation[0] = coef_a;
- + sphere_equation[1] = coef_b;
- + sphere_equation[2] = coef_c;
- + sphere_equation[3] = radius;
- +}
- +
- +int Plane::computePlaneIndices()
- +{
- + int rowSize = depth_img.rows;
- + int colSize = depth_img.cols;
- + plane_indices.clear();
- + int num_points_detected = 0;
- + for (int r = 0; r < rowSize; r++) {
- + for (int c = 0; c < colSize; c++) {
- + double x = depth_img.at<cv::Vec3f>(r, c)[0];
- + double y = depth_img.at<cv::Vec3f>(r, c)[1];
- + double z = depth_img.at<cv::Vec3f>(r, c)[2];
- +
- + if (z > 0) {
- + double z_hat = plane_equation[0] * x + plane_equation[1] * y + plane_equation[2];
- + double r_squared = (z - z_hat) * (z - z_hat);
- +
- + if (r_squared < R_SQUARED_DISTANCE_THRESHOLD) {
- + plane_indices.push_back(cv::Point2i(c, r));
- + num_points_detected++;
- + }
- + }
- + }
- + }
- + return num_points_detected;
- +}
- +
- +int Plane::computeSphereIndices()
- +{
- + int rowSize = depth_img.rows;
- + int colSize = depth_img.cols;
- + sphere_indices.clear();
- + int pointsDetected = 0;
- + for (int r = 0; r < rowSize; r++) {
- + for (int c = 0; c < colSize; c++) {
- + double x = depth_img.at<cv::Vec3f>(r, c)[0];
- + double y = depth_img.at<cv::Vec3f>(r, c)[1];
- + double z = depth_img.at<cv::Vec3f>(r, c)[2];
- +
- + if (z > 0) {
- + double radius = sqrt((x - sphere_equation[0]) * (x - sphere_equation[0])
- + + (y - sphere_equation[1]) * (y - sphere_equation[1])
- + + (z - sphere_equation[2]) * (z - sphere_equation[2]));
- + double radial_r_squared = (radius - sphere_equation[3]) * (radius - sphere_equation[3]);
- +
- + if (radial_r_squared < R_SQUARED_DISTANCE_THRESHOLD) {
- + sphere_indices.push_back(cv::Point2i(c, r));
- + pointsDetected++;
- + }
- + }
- + }
- + }
- + return pointsDetected;
- +}
- +
- +void Plane::regionGrow(pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> ®, pcl::search::Search<pcl::PointXYZ>::Ptr tree)
- +{
- + if (down_cloud->get()->width < 100 && down_normals->get()->width < 100) {
- + return;
- + }
- +
- + reg.setMinClusterSize(20);
- + reg.setMaxClusterSize(1000000);
- + reg.setSearchMethod(tree);
- + reg.setNumberOfNeighbours(30);
- + reg.setInputCloud(*down_cloud);
- + reg.setInputNormals(*down_normals);
- + reg.setSmoothnessThreshold(3.0 / 180.0 * M_PI);
- + reg.setCurvatureThreshold(2.5);
- + reg.extract(clusters);
- +}
- +
- +void Plane::voxelDownsample()
- +{
- + pcl::PCLPointCloud2::Ptr temp_cloud(new pcl::PCLPointCloud2());
- + pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2());
- + pcl::toPCLPointCloud2(*cloud->get(), *temp_cloud);
- +
- + pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
- + sor.setInputCloud(temp_cloud);
- + sor.setLeafSize(0.01f, 0.01f, 0.01f);
- + sor.filter(*cloud_filtered);
- + pcl::fromPCLPointCloud2(*cloud_filtered, *down_cloud->get());
- +}
- +
- +void Plane::calculateNormals(pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> normal_estimator,
- + pcl::search::Search<pcl::PointXYZ>::Ptr tree)
- +{
- + normal_estimator.setNumberOfThreads(NUM_CORES);
- + normal_estimator.setSearchMethod(tree);
- + normal_estimator.setInputCloud(*down_cloud);
- + normal_estimator.setKSearch(50);
- + normal_estimator.compute(*down_normals->get());
- +}
- +
- +void Plane::initializeCloud(cv::Mat &src)
- +{
- + depth_img = src.clone();
- + int rowSize = src.rows;
- + int colSize = src.cols;
- + int cloudSize = 0;
- + for (size_t r = 0; r < rowSize; r++) {
- + for (size_t c = 0; c < colSize; c++) {
- + if (src.at<cv::Vec3f>(r, c)[2] != 0) {
- + cloudSize++;
- + }
- + }
- + }
- + cloud->get()->width = cloudSize;
- + cloud->get()->height = 1;
- + cloud->get()->points.resize(cloud->get()->width * cloud->get()->height);
- +
- + int index = 0;
- + for (size_t r = 0; r < rowSize; r++) {
- + for (size_t c = 0; c < colSize; c++) {
- + if (src.at<cv::Vec3f>(r, c)[2] != 0) {
- + cloud->get()->points[index].x = src.at<cv::Vec3f>(r, c)[0];
- + cloud->get()->points[index].y = src.at<cv::Vec3f>(r, c)[1];
- + cloud->get()->points[index].z = src.at<cv::Vec3f>(r, c)[2];
- + index++;
- + }
- + }
- + }
- +
- +}
- +
- +pcl::PointCloud<pcl::PointXYZ>::Ptr Plane::getCloud()
- +{
- + return *cloud;
- +}
- +
- +pcl::PointCloud<pcl::PointXYZ>::Ptr Plane::getDownCloud()
- +{
- + return *down_cloud;
- +}
- +
- +std::vector<double> Plane::getPlaneEquation()
- +{
- + return plane_equation;
- +}
- +
- +std::vector<double> Plane::getSphereEquation()
- +{
- + return sphere_equation;
- +}
- +
- +std::vector<cv::Point2i> Plane::getPlaneIndicies()
- +{
- + return plane_indices;
- +}
- +
- +std::vector<cv::Point2i> Plane::getSphereIndices()
- +{
- + return sphere_indices;
- }
- \ No newline at end of file
- diff --git a/Plane.h b/Plane.h
- index a455f05..ac09874 100644
- --- a/Plane.h
- +++ b/Plane.h
- @@ -1,171 +1,171 @@
- -#pragma once
- -// C++ Libraries
- -#include <iostream>
- -#include <cstdio>
- -#include <ctime>
- -
- -// OpenCV Libaries
- -#include <opencv2/highgui/highgui.hpp>
- -#include <opencv2/core/core.hpp>
- -#include <opencv2/imgproc/imgproc.hpp>
- -
- -// PCL Libaries
- -#include <pcl/filters/voxel_grid.h>
- -#include <pcl/point_types.h>
- -#include <pcl/features/normal_3d.h>
- -#include <pcl/io/pcd_io.h>
- -#include <pcl/io/ply_io.h>
- -#include <pcl/point_cloud.h>
- -#include <pcl/console/parse.h>
- -#include <pcl/common/transforms.h>
- -#include <pcl/visualization/pcl_visualizer.h>
- -#include <pcl/filters/passthrough.h>
- -#include <pcl/features/integral_image_normal.h>
- -#include <pcl/visualization/cloud_viewer.h>
- -#include <pcl/segmentation/region_growing.h>
- -#include <pcl/features/normal_3d_omp.h>
- -
- -/**
- -* Class defining a plane object.
- -* The plane object will be defined by its regression equation
- -* Example on tracking hand and background plane object simulateously
- -* @include HandandPlane.cpp
- -*/
- -class Plane {
- -public:
- - Plane();
- -
- - /**
- - * Constructs a plane object from a unsegemented xyzMap.
- - * @param [in] src the raw xyzMap.
- - */
- - Plane(cv::Mat &src);
- -
- - /**
- - * Deconstructs the plane object.
- - */
- - ~Plane();
- -
- - /**
- - * Initializes all the required point clouds.
- - * @param [in] src the raw xyzMap
- - */
- - void initializeCloud(cv::Mat &src);
- -
- - /**
- - * Returns the PCL representation of the xyzMap.
- - * @return PCL point cloud
- - */
- - pcl::PointCloud<pcl::PointXYZ>::Ptr getCloud();
- -
- - /**
- - * Returns the PCL representatino of a down sampled xyzMap.
- - * @return down sampled PCL point cloud
- - */
- - pcl::PointCloud<pcl::PointXYZ>::Ptr getDownCloud();
- -
- - /**
- - * Returns the planar regression equation of the identified plane.
- - * @return coefficients for the planar regression equation
- - */
- - std::vector<double> getPlaneEquation();
- -
- - /**
- - * Returns the sphereical regression equation of the identified plane.
- - * @return coefficients for the sphereical regression equation
- - */
- - std::vector<double> getSphereEquation();
- -
- - /**
- - * Returns the (i,j) indices for which the plane appears on the xyzMap.
- - * @return vector of (i,j) coordinates defining the points that make up the plane on the xyzMap
- - */
- - std::vector<cv::Point2i> getPlaneIndicies();
- -
- - /**
- - * Returns the (i,j) indices for which the plane appears on the xyzMap.
- - * @return vector of (i,j) coordinates defining the points that make up the plane on the xyzMap
- - */
- - std::vector<cv::Point2i> getSphereIndices();
- -
- - /**
- - * Maximum cloud size (pixel) allowed.
- - */
- - const int CLOUD_SIZE_THRESHOLD = 1000;
- -
- - /**
- - * Maximum distance (mm) allowed between real point and regression equation.
- - */
- - const double R_SQUARED_DISTANCE_THRESHOLD = 0.0005;
- -
- -private:
- - /**
- - * Performs a series of computations to find the plane.
- - */
- - int compute();
- -
- - /**
- - * Computes the normals at every point.
- - * @param [in] normal_estimator a OMP instance of the normal estimator
- - * @param [in] tree a KD-tree used by the normal estimator to preform neareest neighbor searches
- - */
- - void calculateNormals(pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> normal_estimator, pcl::search::Search<pcl::PointXYZ>::Ptr tree);
- -
- - /**
- - * Down samples the cloud via a median filter.
- - */
- - void voxelDownsample();
- -
- - /**
- - * Aggregates points with like normals.
- - * @param [out] reg equation of the final plane
- - * @param [in] tree KD-tree used for nearest neighbor search
- - */
- - void regionGrow(pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> ®, pcl::search::Search<pcl::PointXYZ>::Ptr tree);
- -
- - /**
- - * Compute a planar regression equation.
- - * @param [in] ind all the points on the plane
- - */
- - void computePlaneLSE(pcl::PointIndices &ind);
- -
- - /**
- - * Compute a sphereical regression equation.
- - * @param [in] ind all the points on the plane
- - */
- - void computeSphereLSE(pcl::PointIndices &ind);
- -
- - /**
- - * Compute all the (i,j) index of the plane points from the planar regression.
- - */
- - int computePlaneIndices();
- -
- - /**
- - * Compute all the (i,j) index of the plane points from the sphereical regression.
- - */
- - int computeSphereIndices();
- -
- - int drawSphereRegressionPoints(cv::Mat &output_mat, cv::Mat &input_mat, std::vector<double> &equation,
- - const int rowSize, const int colSize, const double threshold, bool clicked);
- -
- - // Private Variables
- - pcl::PointCloud<pcl::PointXYZ>::Ptr *cloud;
- - pcl::PointCloud <pcl::Normal>::Ptr *normals;
- - pcl::PointCloud<pcl::PointXYZ>::Ptr *down_cloud;
- - pcl::PointCloud<pcl::Normal>::Ptr *down_normals;
- - pcl::PointCloud <pcl::PointXYZRGB>::Ptr *colored_cloud;
- - pcl::PointCloud <pcl::PointXYZRGB>::Ptr *upsampled_colored_cloud;
- - std::vector<pcl::PointIndices> clusters;
- - std::vector<double> plane_equation;
- - std::vector<double> sphere_equation;
- - std::vector<cv::Point2i> plane_indices;
- - std::vector<cv::Point2i> sphere_indices;
- - cv::Mat sphere_mat;
- - cv::Mat plane_mat;
- - cv::Mat display_img;
- - cv::Mat depth_img;
- - int num_sphere_points;
- - int num_plane_points;
- -
- - const int NUM_CORES = boost::thread::hardware_concurrency();
- +#pragma once
- +// C++ Libraries
- +#include <iostream>
- +#include <cstdio>
- +#include <ctime>
- +
- +// OpenCV Libaries
- +#include <opencv2/highgui/highgui.hpp>
- +#include <opencv2/core/core.hpp>
- +#include <opencv2/imgproc/imgproc.hpp>
- +
- +// PCL Libaries
- +#include <pcl/filters/voxel_grid.h>
- +#include <pcl/point_types.h>
- +#include <pcl/features/normal_3d.h>
- +#include <pcl/io/pcd_io.h>
- +#include <pcl/io/ply_io.h>
- +#include <pcl/point_cloud.h>
- +#include <pcl/console/parse.h>
- +#include <pcl/common/transforms.h>
- +#include <pcl/visualization/pcl_visualizer.h>
- +#include <pcl/filters/passthrough.h>
- +#include <pcl/features/integral_image_normal.h>
- +#include <pcl/visualization/cloud_viewer.h>
- +#include <pcl/segmentation/region_growing.h>
- +#include <pcl/features/normal_3d_omp.h>
- +
- +/**
- +* Class defining a plane object.
- +* The plane object will be defined by its regression equation
- +* Example on tracking hand and background plane object simulateously
- +* @include HandandPlane.cpp
- +*/
- +class Plane {
- +public:
- + Plane();
- +
- + /**
- + * Constructs a plane object from a unsegemented xyzMap.
- + * @param [in] src the raw xyzMap.
- + */
- + Plane(cv::Mat &src);
- +
- + /**
- + * Deconstructs the plane object.
- + */
- + ~Plane();
- +
- + /**
- + * Initializes all the required point clouds.
- + * @param [in] src the raw xyzMap
- + */
- + void initializeCloud(cv::Mat &src);
- +
- + /**
- + * Returns the PCL representation of the xyzMap.
- + * @return PCL point cloud
- + */
- + pcl::PointCloud<pcl::PointXYZ>::Ptr getCloud();
- +
- + /**
- + * Returns the PCL representatino of a down sampled xyzMap.
- + * @return down sampled PCL point cloud
- + */
- + pcl::PointCloud<pcl::PointXYZ>::Ptr getDownCloud();
- +
- + /**
- + * Returns the planar regression equation of the identified plane.
- + * @return coefficients for the planar regression equation
- + */
- + std::vector<double> getPlaneEquation();
- +
- + /**
- + * Returns the sphereical regression equation of the identified plane.
- + * @return coefficients for the sphereical regression equation
- + */
- + std::vector<double> getSphereEquation();
- +
- + /**
- + * Returns the (i,j) indices for which the plane appears on the xyzMap.
- + * @return vector of (i,j) coordinates defining the points that make up the plane on the xyzMap
- + */
- + std::vector<cv::Point2i> getPlaneIndicies();
- +
- + /**
- + * Returns the (i,j) indices for which the plane appears on the xyzMap.
- + * @return vector of (i,j) coordinates defining the points that make up the plane on the xyzMap
- + */
- + std::vector<cv::Point2i> getSphereIndices();
- +
- + /**
- + * Maximum cloud size (pixel) allowed.
- + */
- + const int CLOUD_SIZE_THRESHOLD = 1000;
- +
- + /**
- + * Maximum distance (mm) allowed between real point and regression equation.
- + */
- + const double R_SQUARED_DISTANCE_THRESHOLD = 0.0005;
- +
- +private:
- + /**
- + * Performs a series of computations to find the plane.
- + */
- + int compute();
- +
- + /**
- + * Computes the normals at every point.
- + * @param [in] normal_estimator a OMP instance of the normal estimator
- + * @param [in] tree a KD-tree used by the normal estimator to preform neareest neighbor searches
- + */
- + void calculateNormals(pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> normal_estimator, pcl::search::Search<pcl::PointXYZ>::Ptr tree);
- +
- + /**
- + * Down samples the cloud via a median filter.
- + */
- + void voxelDownsample();
- +
- + /**
- + * Aggregates points with like normals.
- + * @param [out] reg equation of the final plane
- + * @param [in] tree KD-tree used for nearest neighbor search
- + */
- + void regionGrow(pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> ®, pcl::search::Search<pcl::PointXYZ>::Ptr tree);
- +
- + /**
- + * Compute a planar regression equation.
- + * @param [in] ind all the points on the plane
- + */
- + void computePlaneLSE(pcl::PointIndices &ind);
- +
- + /**
- + * Compute a sphereical regression equation.
- + * @param [in] ind all the points on the plane
- + */
- + void computeSphereLSE(pcl::PointIndices &ind);
- +
- + /**
- + * Compute all the (i,j) index of the plane points from the planar regression.
- + */
- + int computePlaneIndices();
- +
- + /**
- + * Compute all the (i,j) index of the plane points from the sphereical regression.
- + */
- + int computeSphereIndices();
- +
- + int drawSphereRegressionPoints(cv::Mat &output_mat, cv::Mat &input_mat, std::vector<double> &equation,
- + const int rowSize, const int colSize, const double threshold, bool clicked);
- +
- + // Private Variables
- + pcl::PointCloud<pcl::PointXYZ>::Ptr *cloud;
- + pcl::PointCloud <pcl::Normal>::Ptr *normals;
- + pcl::PointCloud<pcl::PointXYZ>::Ptr *down_cloud;
- + pcl::PointCloud<pcl::Normal>::Ptr *down_normals;
- + pcl::PointCloud <pcl::PointXYZRGB>::Ptr *colored_cloud;
- + pcl::PointCloud <pcl::PointXYZRGB>::Ptr *upsampled_colored_cloud;
- + std::vector<pcl::PointIndices> clusters;
- + std::vector<double> plane_equation;
- + std::vector<double> sphere_equation;
- + std::vector<cv::Point2i> plane_indices;
- + std::vector<cv::Point2i> sphere_indices;
- + cv::Mat sphere_mat;
- + cv::Mat plane_mat;
- + cv::Mat display_img;
- + cv::Mat depth_img;
- + int num_sphere_points;
- + int num_plane_points;
- +
- + const int NUM_CORES = boost::thread::hardware_concurrency();
- };
- \ No newline at end of file
- diff --git a/README.md b/README.md
- index 2ab905b..68b9fd3 100644
- --- a/README.md
- +++ b/README.md
- @@ -1,58 +1,58 @@
- -# OpenARK
- -
- -OpenARK is an open-source wearable augmented reality (AR) system founded at UC Berkeley in 2016. The C++ based software offers innovative core functionalities to power a wide range of off-the-shelf AR components, including see-through glasses, depth cameras, and IMUs. The open-source platform includes fundamental tools such as AR-based camera calibration and SLAM, and it also includes higher-level functions to aid human-computer interaction, such as 3D gesture recognition and multi-user collaboration.
- -
- -At a Glance
- -
- - - **Technology stack**: C++, OpenCV, PCL, Boost, OpenNI
- - - **Status**: Beta 0.8
- - - **Application Demo**: vimeo.com/205084929
- -
- -
- -## Dependencies
- -Hardware
- -- Depth Camera
- -- RGB Camera
- -- Transparent AR Glasses (optional)
- -
- -Software
- -- OpenCV 3.0
- -- PCL 1.8
- -- OpenNI 1.5.8
- -- Boost 1.6.4
- -
- -## Installation
- -
- -1. Download and install all software depedencies (OpenCV, PCL, OpenNI, Boost)
- -2. Clone repo to local machine
- -3. Open the Visual Studios solution (OpenARK.sln)
- -
- -## Configuration
- -
- -Configure project properties (see /documentation/OpenARK_Setup.pdf)
- -
- -## Usage
- -
- -OpenARK is made for easy customization. Please feel free to build on top of this platform to fit your needs.
- -
- -## How to test the software
- -
- -Code used to run the demo video is included in main.cpp. Additional sample code can be found in /samplecode/.
- -
- -## Known issues
- -
- -OpenCV currently do not offer prebuilt VC14+ binaries. Running VC12 OpenCV binaries with VC14 will result in memories errors in findCountours(). If you are using VC12+ to compile OpenARK, you will need to use CMake to rebuilt OpenCV from source.
- -
- -## Getting help
- -
- -If you have questions, concerns, bug reports, etc, please file an issue in this repository's Issue Tracker.
- -
- -## Getting involved
- -
- -The Center for Augmented Cognition welcome interested industry partners to join our alliance to support the Open ARK platform. More information can be found on cac.berkeley.edu
- -
- -----
- -
- -## Credits and references
- -
- -Bill Zhou, Allen Yang, S.Shankar, Will Huang, Larry Yang, Eric Nyugen, Michelli Ni, Peter Li, Jessica Jiang
- +# OpenARK
- +
- +OpenARK is an open-source wearable augmented reality (AR) system founded at UC Berkeley in 2016. The C++ based software offers innovative core functionalities to power a wide range of off-the-shelf AR components, including see-through glasses, depth cameras, and IMUs. The open-source platform includes fundamental tools such as AR-based camera calibration and SLAM, and it also includes higher-level functions to aid human-computer interaction, such as 3D gesture recognition and multi-user collaboration.
- +
- +At a Glance
- +
- + - **Technology stack**: C++, OpenCV, PCL, Boost, OpenNI
- + - **Status**: Beta 0.8
- + - **Application Demo**: vimeo.com/205084929
- +
- +
- +## Dependencies
- +Hardware
- +- Depth Camera
- +- RGB Camera
- +- Transparent AR Glasses (optional)
- +
- +Software
- +- OpenCV 3.0
- +- PCL 1.8
- +- OpenNI 1.5.8
- +- Boost 1.6.4
- +
- +## Installation
- +
- +1. Download and install all software depedencies (OpenCV, PCL, OpenNI, Boost)
- +2. Clone repo to local machine
- +3. Open the Visual Studios solution (OpenARK.sln)
- +
- +## Configuration
- +
- +Configure project properties (see /documentation/OpenARK_Setup.pdf)
- +
- +## Usage
- +
- +OpenARK is made for easy customization. Please feel free to build on top of this platform to fit your needs.
- +
- +## How to test the software
- +
- +Code used to run the demo video is included in main.cpp. Additional sample code can be found in /samplecode/.
- +
- +## Known issues
- +
- +OpenCV currently do not offer prebuilt VC14+ binaries. Running VC12 OpenCV binaries with VC14 will result in memories errors in findCountours(). If you are using VC12+ to compile OpenARK, you will need to use CMake to rebuilt OpenCV from source.
- +
- +## Getting help
- +
- +If you have questions, concerns, bug reports, etc, please file an issue in this repository's Issue Tracker.
- +
- +## Getting involved
- +
- +The Center for Augmented Cognition welcome interested industry partners to join our alliance to support the Open ARK platform. More information can be found on cac.berkeley.edu
- +
- +----
- +
- +## Credits and references
- +
- +Bill Zhou, Allen Yang, S.Shankar, Will Huang, Larry Yang, Eric Nyugen, Michelli Ni, Peter Li, Jessica Jiang
- diff --git a/RGBCamera.cpp b/RGBCamera.cpp
- index 4a0f292..b7703ed 100644
- --- a/RGBCamera.cpp
- +++ b/RGBCamera.cpp
- @@ -1,10 +1,10 @@
- -#include "RGBCamera.h"
- -
- -/***
- -Returns the next frame if next frame is recorded
- -Returns the previous frame if next frame is not recorded
- -***/
- -cv::Mat RGBCamera::getFrame()
- -{
- - return frame;
- +#include "RGBCamera.h"
- +
- +/***
- +Returns the next frame if next frame is recorded
- +Returns the previous frame if next frame is not recorded
- +***/
- +cv::Mat RGBCamera::getFrame()
- +{
- + return frame;
- }
- \ No newline at end of file
- diff --git a/RGBCamera.h b/RGBCamera.h
- index c671c95..7c883e8 100644
- --- a/RGBCamera.h
- +++ b/RGBCamera.h
- @@ -1,33 +1,33 @@
- -#pragma once
- -//OpenCV libraries
- -#include "opencv2/highgui/highgui.hpp"
- -
- -/**
- -* Abstract class that defines the behavior of a RGB camera.
- -*/
- -class RGBCamera
- -{
- -public:
- - /**
- - * Updates the current frame on the RGB camera.
- - * Should be overriden by a concerte implementation specific to the RGB camera
- - */
- - virtual void update() = 0;
- -
- - /**
- - * Returns the current frame.
- - * @return the current frame
- - */
- - cv::Mat getFrame();
- -
- -protected:
- - /**
- - * Camera handle.
- - */
- - cv::VideoCapture cap;
- -
- - /**
- - * Current frame.
- - */
- - cv::Mat frame;
- +#pragma once
- +#include <opencv/cxcore.h>
- +#include "opencv2/highgui/highgui.hpp"
- +
- +/**
- +* Abstract class that defines the behavior of a RGB camera.
- +*/
- +class RGBCamera
- +{
- +public:
- + /**
- + * Updates the current frame on the RGB camera.
- + * Should be overriden by a concerte implementation specific to the RGB camera
- + */
- + virtual void update() = 0;
- +
- + /**
- + * Returns the current frame.
- + * @return the current frame
- + */
- + cv::Mat getFrame();
- +
- +protected:
- + /**
- + * Camera handle.
- + */
- + cv::VideoCapture cap;
- +
- + /**
- + * Current frame.
- + */
- + cv::Mat frame;
- };
- \ No newline at end of file
- diff --git a/RT_Transform.txt b/RT_Transform.txt
- index f708c02..d1f20fc 100644
- --- a/RT_Transform.txt
- +++ b/RT_Transform.txt
- @@ -1,13 +1,13 @@
- -%YAML:1.0
- -R: !!opencv-matrix
- - rows: 3
- - cols: 3
- - dt: f
- - data: [ 9.99971926e-001, -7.48438481e-003, -4.79703158e-006,
- - -7.47213839e-003, -9.98298407e-001, -5.78310676e-002,
- - -4.28037398e-004, -5.78294173e-002, 9.98326361e-001 ]
- -T: !!opencv-matrix
- - rows: 3
- - cols: 1
- - dt: f
- - data: [ 1.13893911e-001, 8.25873576e-003, -1.35086179e-002 ]
- +%YAML:1.0
- +R: !!opencv-matrix
- + rows: 3
- + cols: 3
- + dt: f
- + data: [ 9.99971926e-001, -7.48438481e-003, -4.79703158e-006,
- + -7.47213839e-003, -9.98298407e-001, -5.78310676e-002,
- + -4.28037398e-004, -5.78294173e-002, 9.98326361e-001 ]
- +T: !!opencv-matrix
- + rows: 3
- + cols: 1
- + dt: f
- + data: [ 1.13893911e-001, 8.25873576e-003, -1.35086179e-002 ]
- diff --git a/SR300Camera.cpp b/SR300Camera.cpp
- deleted file mode 100644
- index 589a10e..0000000
- --- a/SR300Camera.cpp
- +++ /dev/null
- @@ -1,157 +0,0 @@
- -#include "SR300Camera.h"
- -#include "Visualizer.h"
- -#include <iostream>
- -
- -
- -
- -/***
- -Private constructor for the SR300 Camera depth sensor
- -***/
- -using namespace std;
- -
- -
- -
- -/***
- -Private constructor for the Intel RealSense SR300 camera depth sensor
- -***/
- -SR300Camera::SR300Camera(bool use_live_sensor)
- -{
- -
- - session->SetCoordinateSystem(Intel::RealSense::CoordinateSystem::COORDINATE_SYSTEM_FRONT_DEFAULT);
- - X_DIMENSION = 640;
- - Y_DIMENSION = 480;
- - if (!sm)
- - {
- - wprintf_s(L"Unable to create the SenseManager\n");
- - }
- - cm = sm->QueryCaptureManager();
- - Intel::RealSense::Status sts = Intel::RealSense::Status::STATUS_DATA_UNAVAILABLE;
- -
- - sm->EnableStream(Intel::RealSense::Capture::StreamType::STREAM_TYPE_DEPTH, X_DIMENSION, Y_DIMENSION, depth_fps);
- - sts = sm->Init();
- - if (sts < Intel::RealSense::Status::STATUS_NO_ERROR)
- - {
- - sm->Close();
- - sm->EnableStream(Intel::RealSense::Capture::STREAM_TYPE_DEPTH);
- - sts = sm->Init();
- - if (sts < Intel::RealSense::Status::STATUS_NO_ERROR)
- - {
- - sm->Close();
- - sts = sm->Init();
- - }
- - }
- - device = cm->QueryDevice();
- -}
- -
- -
- -/***
- -Public deconstructor for the SR300 Camera depth sensor
- -***/
- -SR300Camera::~SR300Camera() {};
- -
- -void SR300Camera::destroyInstance()
- -{
- - printf("closing sensor\n");
- - sm->Release();
- - sm->Close();
- - printf("sensor closed\n");
- -}
- -
- -
- -/***
- -Create xyzMap, zMap, ampMap, and flagMap from sensor input
- -***/
- -void SR300Camera::update()
- -{
- - initilizeImages();
- - fillInAmps();
- - fillInZCoords();
- - sm->ReleaseFrame();
- -}
- -
- -
- -/***
- -Reads the depth data from the sensor and fills in the matrix
- -***/
- -void SR300Camera::fillInZCoords()
- -{
- -
- - int num_pixels;
- - vector<cv::Point3f> xyzBuffer;
- -
- - int res;
- - Intel::RealSense::Status sts = sm ->AcquireFrame(true);
- - if (sts < Intel::RealSense::STATUS_NO_ERROR) {
- - if (sts == Intel::RealSense::Status::STATUS_STREAM_CONFIG_CHANGED)
- - {
- - wprintf_s(L"Stream configuration was changed, re-initilizing\n");
- - sm ->Close();
- - }
- - }
- - sample = sm->QuerySample();
- - Intel::RealSense::Image *depthMap = sample->depth;
- - Intel::RealSense::Image::ImageData depthImage;
- - depthMap->AcquireAccess(Intel::RealSense::Image::ACCESS_READ, &depthImage);
- - cv::Mat img;
- - Converter::ConvertPXCImageToOpenCVMat(depthMap, depthImage, &img);
- - cv::imshow("Depth Image by OpenARK", Visualizer::visualizeDepthMap(img));
- - Intel::RealSense::Image::ImageInfo imgInfo = depthMap->QueryInfo();
- - depth_width = imgInfo.width;
- - depth_height = imgInfo.height;
- - num_pixels = depth_width * depth_height;
- - Intel::RealSense::Projection * projection = device->CreateProjection();
- - Intel::RealSense::Point3DF32 *pos3D = new Intel::RealSense::Point3DF32[num_pixels];
- - sts = projection->QueryVertices(depthMap, &pos3D[0]);
- - if (sts < Intel::RealSense::Status::STATUS_NO_ERROR)
- - {
- - wprintf_s(L"Projection was unsuccessful! \n");
- - sm->Close();
- - }
- - xyzBuffer.clear();
- - for (int k = 0; k < num_pixels; k++)
- - {
- - xyzBuffer.emplace_back(cv::Point3f(pos3D[k].x / 1000.0f, pos3D[k].y / 1000.0f, pos3D[k].z / 1000.0f));
- - }
- - xyzMap = cv::Mat(xyzBuffer, true).reshape(3, 480);
- - cv::namedWindow("XYZ Image by OpenARK", CV_WINDOW_AUTOSIZE);
- - cv::imshow("XYZ Image by OpenARK", Visualizer::visualizeXYZMap(xyzMap));
- -}
- -
- -
- -/***
- -Reads the amplitude data from the sensor and fills in the matrix
- -***/
- -void SR300Camera::fillInAmps()
- -{
- - ampMap.data = NULL;
- -}
- -
- -
- -/***
- -Returns the X value at (i, j)
- -***/
- -float SR300Camera::getX(int i, int j) const
- -{
- - int flat = j * depth_width * 3 + i * 3;
- - return dists[flat];
- -}
- -
- -
- -/***
- -Returns the Y value at (i, j)
- -***/
- -float SR300Camera::getY(int i, int j) const
- -{
- - int flat = j * depth_width * 3 + i * 3;
- - return dists[flat + 1];
- -}
- -
- -
- -/***
- -Returns the Z value at (i, j)
- -***/
- -float SR300Camera::getZ(int i, int j) const
- -{
- - int flat = j * depth_width * 3 + i * 3;
- - return dists[flat + 2];
- -}
- \ No newline at end of file
- diff --git a/SR300Camera.h b/SR300Camera.h
- deleted file mode 100644
- index 1e901f3..0000000
- --- a/SR300Camera.h
- +++ /dev/null
- @@ -1,104 +0,0 @@
- -#pragma once
- -// C++ Libraries
- -#include<string.h>
- -
- -
- -// OpenCV Libraries
- -#include <opencv2/opencv.hpp>
- -#include "opencv2/highgui/highgui.hpp"
- -#include <opencv2/video/tracking.hpp>
- -#include "opencv2/imgproc/imgproc.hpp"
- -#include <opencv2/objdetect/objdetect.hpp>
- -#include <opencv2/features2d/features2d.hpp>
- -
- -
- -// OpenARK Libraries
- -#include "DepthCamera.h"
- -#include "Converter.h"
- -
- -//using namespace Intel::RealSense;
- -
- -/**
- -* Class defining the behavior of an SR300 Camera.
- -* Example on how to read from sensor and visualize its output
- -* @include SensorIO.cpp
- -*/
- -class SR300Camera : public DepthCamera
- -{
- -public:
- -
- -
- - /**
- - * Public constructor initializing the SR300 Camera.
- - * @param use_live_sensor uses input from real sensor if TRUE. Otherwise reads from input file. Default is set to TRUE.
- - */
- - SR300Camera(bool use_live_sensor = true);
- -
- - /**
- - * Deconstructor for the SR300 Camera.
- - */
- - ~SR300Camera();
- -
- - /**
- - * Gets new frame from sensor.
- - * Updates xyzMap, ampMap, and flagMap. Resets clusters.
- - */
- - void update();
- -
- - /**
- - * Gracefully closes the SR300 camera.
- - */
- - void destroyInstance();
- -
- -private:
- - /**
- - * Getter method for the x-coordinate at (i,j).
- - * @param i ith row
- - * @param j jth column
- - * @return x-coodinate at (i,j)
- - */
- - float getX(int i, int j) const;
- -
- -
- - /**
- - * Getter method for the x-coordinate at (i,j).
- - * @param i ith row
- - * @param j jth column
- - * @return x-coodinate at (i,j)
- - */
- - float getY(int i, int j) const;
- -
- - /**
- - * Getter method for the x-coordinate at (i,j).
- - * @param i ith row
- - * @param j jth column
- - * @return x-coodinate at (i,j)
- - */
- - float getZ(int i, int j) const;
- -
- - /**
- - * Update the z-coordinates of the xyzMap.
- - */
- - void fillInZCoords();
- -
- - /**
- - * Update the values in the ampMap.
- - */
- - void fillInAmps();
- -
- -
- - //Private Variables
- - float* dists;
- - float* amps;
- - cv::Mat frame;
- - const int depth_fps = 30;
- - int depth_width;
- - int depth_height;
- - cv::Size bufferSize;
- - const Intel::RealSense::Sample *sample;
- - Intel::RealSense::SenseManager *sm = Intel::RealSense::SenseManager::CreateInstance();
- - Intel::RealSense::Session *session = sm->QuerySession();
- - Intel::RealSense::Device *device;
- - Intel::RealSense::CaptureManager *cm;
- -
- -};
- \ No newline at end of file
- diff --git a/SensorIO.cpp b/SensorIO.cpp
- index 6abf574..d569ff8 100644
- --- a/SensorIO.cpp
- +++ b/SensorIO.cpp
- @@ -1,41 +1,41 @@
- -// C++ Libraries
- -#include <stdio.h>
- -#include <iostream>
- -#include <string>
- -
- -// OpenCV Libraries
- -#include <opencv/cxcore.h>
- -#include "opencv2/highgui/highgui.hpp"
- -
- -// OpenARK Libraries
- -#include "PMDCamera.h"
- -#include "Visualizer.h"
- -#include "Util.h"
- -
- -int main() {
- - DepthCamera* pmd = new PMDCamera();
- - int frame = 0;
- -
- - while (true)
- - {
- - // Update the current frame
- - pmd->update();
- -
- - // REmove the current frame
- - pmd->removeNoise();
- -
- - // Visualize the XYZ Map
- - cv::imshow("XYZ Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- -
- - /**** Start: Loop Break Condition ****/
- - int c = cvWaitKey(1);
- - if (c == 'q' || c == 'Q' || c == 27) {
- - break;
- - }
- - /**** End: Loop Break Condition ****/
- - frame++;
- - }
- -
- - pmd->destroyInstance();
- - return 0;
- +// C++ Libraries
- +#include <stdio.h>
- +#include <iostream>
- +#include <string>
- +
- +// OpenCV Libraries
- +#include <opencv/cxcore.h>
- +#include "opencv2/highgui/highgui.hpp"
- +
- +// OpenARK Libraries
- +#include "PMDCamera.h"
- +#include "Visualizer.h"
- +#include "Util.h"
- +
- +int main() {
- + DepthCamera* pmd = new PMDCamera();
- + int frame = 0;
- +
- + while (true)
- + {
- + // Update the current frame
- + pmd->update();
- +
- + // REmove the current frame
- + pmd->removeNoise();
- +
- + // Visualize the XYZ Map
- + cv::imshow("XYZ Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- +
- + /**** Start: Loop Break Condition ****/
- + int c = cvWaitKey(1);
- + if (c == 'q' || c == 'Q' || c == 27) {
- + break;
- + }
- + /**** End: Loop Break Condition ****/
- + frame++;
- + }
- +
- + pmd->destroyInstance();
- + return 0;
- }
- \ No newline at end of file
- diff --git a/StreamingAverager.cpp b/StreamingAverager.cpp
- index 99d2d76..4aff320 100644
- --- a/StreamingAverager.cpp
- +++ b/StreamingAverager.cpp
- @@ -1,51 +1,51 @@
- -#include "StreamingAverager.h"
- -
- -StreamingAverager::StreamingAverager(int frequency, double rejectionDistance)
- -{
- - sampleFrequency = frequency;
- - rejectionThreshold = rejectionDistance;
- - dataPoints = std::deque<cv::Vec3f>();
- -}
- -
- -cv::Vec3f StreamingAverager::addDataPoint(cv::Vec3f pt)
- -{
- - if (dataPoints.size() > 0 && Util::euclidianDistance3D(pt, getCurrentAverage()) > rejectionThreshold) {
- - addEmptyPoint();
- - return getCurrentAverage();
- - }
- -
- - if (dataPoints.size() >= sampleFrequency) {
- - cv::Vec3f extra = dataPoints.front();
- - dataPoints.pop_front();
- - currentValue -= extra;
- - }
- - dataPoints.push_back(pt);
- - currentValue += pt;
- -
- - return getCurrentAverage();
- -}
- -
- -void StreamingAverager::addEmptyPoint()
- -{
- - if (dataPoints.size() > 0) {
- - cv::Vec3f extra = dataPoints.front();
- - dataPoints.pop_front();
- - currentValue = currentValue - extra;
- - }
- -}
- -
- -cv::Vec3f StreamingAverager::getCurrentAverage()
- -{
- - cv::Vec3f average;
- - if (dataPoints.size() != 0) {
- - average[0] = currentValue[0] / dataPoints.size();
- - average[1] = currentValue[1] / dataPoints.size();
- - average[2] = currentValue[2] / dataPoints.size();
- - }
- - return average;
- -}
- -
- -StreamingAverager::~StreamingAverager()
- -{
- -
- +#include "StreamingAverager.h"
- +
- +StreamingAverager::StreamingAverager(int frequency, double rejectionDistance)
- +{
- + sampleFrequency = frequency;
- + rejectionThreshold = rejectionDistance;
- + dataPoints = std::deque<cv::Vec3f>();
- +}
- +
- +cv::Vec3f StreamingAverager::addDataPoint(cv::Vec3f pt)
- +{
- + if (dataPoints.size() > 0 && Util::euclidianDistance3D(pt, getCurrentAverage()) > rejectionThreshold) {
- + addEmptyPoint();
- + return getCurrentAverage();
- + }
- +
- + if (dataPoints.size() >= sampleFrequency) {
- + cv::Vec3f extra = dataPoints.front();
- + dataPoints.pop_front();
- + currentValue -= extra;
- + }
- + dataPoints.push_back(pt);
- + currentValue += pt;
- +
- + return getCurrentAverage();
- +}
- +
- +void StreamingAverager::addEmptyPoint()
- +{
- + if (dataPoints.size() > 0) {
- + cv::Vec3f extra = dataPoints.front();
- + dataPoints.pop_front();
- + currentValue = currentValue - extra;
- + }
- +}
- +
- +cv::Vec3f StreamingAverager::getCurrentAverage()
- +{
- + cv::Vec3f average;
- + if (dataPoints.size() != 0) {
- + average[0] = currentValue[0] / dataPoints.size();
- + average[1] = currentValue[1] / dataPoints.size();
- + average[2] = currentValue[2] / dataPoints.size();
- + }
- + return average;
- +}
- +
- +StreamingAverager::~StreamingAverager()
- +{
- +
- }
- \ No newline at end of file
- diff --git a/StreamingAverager.h b/StreamingAverager.h
- index a763836..74387c0 100644
- --- a/StreamingAverager.h
- +++ b/StreamingAverager.h
- @@ -1,66 +1,69 @@
- -#pragma once
- -// C++ Libraries
- -#include <deque>
- -
- -// OpenARK Libraries
- -#include "Util.h"
- -
- -/*
- -* Averages streaming data to combate outliers. A sample frequency and rejection threshold is used to determined the best fit point at the current time frame.
- -*/
- -class StreamingAverager
- -{
- -public:
- - /*
- - * Constructs a new instance of the streaming averager.
- - * @param frequency how many previous points to use in the averaging computation
- - * @param rejectionDistance maximum jump distance allowed between current point and previous point
- - */
- - StreamingAverager(int frequency, double rejectionDistance);
- -
- - /*
- - * Deconstructs an instance of the streaming averager.
- - */
- - ~StreamingAverager();
- -
- - /*
- - * Adds new data point to the streaming averager.
- - * @param pt point at the current frame
- - * @return the average a the current frame
- - */
- - cv::Vec3f addDataPoint(cv::Vec3f pt);
- -
- - /*
- - * Adds a empty data point to the stream of points.
- - * If there are no points to add at the current frame, an empty point should be added to push out the old points
- - */
- - void addEmptyPoint();
- -
- -private:
- - /*
- - * Number of previous points to be used in the average.
- - */
- - int sampleFrequency;
- -
- - /*
- - * Maximum jump distance allowed between current point and previous point
- - */
- - double rejectionThreshold;
- -
- - /*
- - * The current average value
- - */
- - cv::Vec3f currentValue;
- -
- - /*
- - * Recently seen data points
- - * @see sampleFrequency
- - */
- - std::deque<cv::Vec3f> dataPoints;
- -
- - /*
- - * Compute the current average.
- - * @return (x,y,z) average at current frame
- - */
- - cv::Vec3f getCurrentAverage();
- +#pragma once
- +// C++ Libraries
- +#include <deque>
- +
- +// OpenCV Libraries
- +#include <opencv/cxcore.h>
- +
- +// OpenARK Libraries
- +#include "Util.h"
- +
- +/*
- +* Averages streaming data to combate outliers. A sample frequency and rejection threshold is used to determined the best fit point at the current time frame.
- +*/
- +class StreamingAverager
- +{
- +public:
- + /*
- + * Constructs a new instance of the streaming averager.
- + * @param frequency how many previous points to use in the averaging computation
- + * @param rejectionDistance maximum jump distance allowed between current point and previous point
- + */
- + StreamingAverager(int frequency, double rejectionDistance);
- +
- + /*
- + * Deconstructs an instance of the streaming averager.
- + */
- + ~StreamingAverager();
- +
- + /*
- + * Adds new data point to the streaming averager.
- + * @param pt point at the current frame
- + * @return the average a the current frame
- + */
- + cv::Vec3f addDataPoint(cv::Vec3f pt);
- +
- + /*
- + * Adds a empty data point to the stream of points.
- + * If there are no points to add at the current frame, an empty point should be added to push out the old points
- + */
- + void addEmptyPoint();
- +
- +private:
- + /*
- + * Number of previous points to be used in the average.
- + */
- + int sampleFrequency;
- +
- + /*
- + * Maximum jump distance allowed between current point and previous point
- + */
- + double rejectionThreshold;
- +
- + /*
- + * The current average value
- + */
- + cv::Vec3f currentValue;
- +
- + /*
- + * Recently seen data points
- + * @see sampleFrequency
- + */
- + std::deque<cv::Vec3f> dataPoints;
- +
- + /*
- + * Compute the current average.
- + * @return (x,y,z) average at current frame
- + */
- + cv::Vec3f getCurrentAverage();
- };
- \ No newline at end of file
- diff --git a/UDPSender.cpp b/UDPSender.cpp
- index 23586c7..d26c8d7 100644
- --- a/UDPSender.cpp
- +++ b/UDPSender.cpp
- @@ -1,45 +1,45 @@
- -#include "UDPSender.h"
- -#define _WINSOCK_DEPRECATED_NO_WARNINGS
- -
- -UDPSender::UDPSender()
- -{
- - //Initialise winsock
- - printf("\nInitialising Winsock...");
- - if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
- - {
- - printf("Failed. Error Code : %d", WSAGetLastError());
- - exit(EXIT_FAILURE);
- - }
- - printf("Initialised.\n");
- -
- - //create socket
- - if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
- - {
- - printf("socket() failed with error code : %d", WSAGetLastError());
- - exit(EXIT_FAILURE);
- - }
- -
- - //setup address structure
- - memset((char *)&si_other, 0, sizeof(si_other));
- - si_other.sin_family = AF_INET;
- - si_other.sin_port = htons(PORT);
- - si_other.sin_addr.S_un.S_addr = inet_addr(SERVER);
- -
- -}
- -
- -int UDPSender::send(std::string message)
- -{
- - if (sendto(s, message.c_str(), strlen(message.c_str()), 0, (struct sockaddr *) &si_other, slen) == SOCKET_ERROR)
- - {
- - printf("sendto() failed with error code : %d", WSAGetLastError());
- - exit(EXIT_FAILURE);
- - }
- - return 0;
- -}
- -
- -int UDPSender::close()
- -{
- - closesocket(s);
- - WSACleanup();
- - return 0;
- +#include "UDPSender.h"
- +#define _WINSOCK_DEPRECATED_NO_WARNINGS
- +
- +UDPSender::UDPSender()
- +{
- + //Initialise winsock
- + printf("\nInitialising Winsock...");
- + if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
- + {
- + printf("Failed. Error Code : %d", WSAGetLastError());
- + exit(EXIT_FAILURE);
- + }
- + printf("Initialised.\n");
- +
- + //create socket
- + if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
- + {
- + printf("socket() failed with error code : %d", WSAGetLastError());
- + exit(EXIT_FAILURE);
- + }
- +
- + //setup address structure
- + memset((char *)&si_other, 0, sizeof(si_other));
- + si_other.sin_family = AF_INET;
- + si_other.sin_port = htons(PORT);
- + si_other.sin_addr.S_un.S_addr = inet_addr(SERVER);
- +
- +}
- +
- +int UDPSender::send(std::string message)
- +{
- + if (sendto(s, message.c_str(), strlen(message.c_str()), 0, (struct sockaddr *) &si_other, slen) == SOCKET_ERROR)
- + {
- + printf("sendto() failed with error code : %d", WSAGetLastError());
- + exit(EXIT_FAILURE);
- + }
- + return 0;
- +}
- +
- +int UDPSender::close()
- +{
- + closesocket(s);
- + WSACleanup();
- + return 0;
- }
- \ No newline at end of file
- diff --git a/UDPSender.h b/UDPSender.h
- index e3bf8f3..0a3fe7c 100644
- --- a/UDPSender.h
- +++ b/UDPSender.h
- @@ -1,40 +1,40 @@
- -#pragma once
- -#define _WINSOCK_DEPRECATED_NO_WARNINGS
- -#include <winsock2.h>
- -#include <stdio.h>
- -#include <iostream>
- -
- -#pragma comment(lib,"ws2_32.lib") //Winsock Library
- -
- -#define SERVER "127.0.0.1" //ip address of udp server
- -#define BUFLEN 512 //Max length of buffer
- -#define PORT 8051 //The port on which to listen for incoming data
- -
- -/**
- -* UDP client.
- -* Used to communicate information with game engines such as Unity
- -*/
- -class UDPSender {
- -public:
- - /**
- - * Constructs a new UPD sender.
- - */
- - UDPSender();
- -
- - /**
- - * Sends a message.
- - * @param message the data to be sent
- - */
- - int send(std::string message);
- -
- - /**
- - * Close the current connection.
- - */
- - int close();
- -
- - struct sockaddr_in si_other;
- - int s, slen = sizeof(si_other);
- - char buf[BUFLEN];
- - char message[BUFLEN];
- - WSADATA wsa;
- +#pragma once
- +#define _WINSOCK_DEPRECATED_NO_WARNINGS
- +#include <winsock2.h>
- +#include <stdio.h>
- +#include <iostream>
- +
- +#pragma comment(lib,"ws2_32.lib") //Winsock Library
- +
- +#define SERVER "127.0.0.1" //ip address of udp server
- +#define BUFLEN 512 //Max length of buffer
- +#define PORT 8051 //The port on which to listen for incoming data
- +
- +/**
- +* UDP client.
- +* Used to communicate information with game engines such as Unity
- +*/
- +class UDPSender {
- +public:
- + /**
- + * Constructs a new UPD sender.
- + */
- + UDPSender();
- +
- + /**
- + * Sends a message.
- + * @param message the data to be sent
- + */
- + int send(std::string message);
- +
- + /**
- + * Close the current connection.
- + */
- + int close();
- +
- + struct sockaddr_in si_other;
- + int s, slen = sizeof(si_other);
- + char buf[BUFLEN];
- + char message[BUFLEN];
- + WSADATA wsa;
- };
- \ No newline at end of file
- diff --git a/Util.cpp b/Util.cpp
- index ec12c76..44a62f2 100644
- --- a/Util.cpp
- +++ b/Util.cpp
- @@ -1,273 +1,273 @@
- -#include "Util.h"
- -
- -cv::Vec3b Util::colorGenerator2()
- -{
- - return cv::Vec3b(rand() % 256, rand() % 256, rand() % 256);
- -}
- -
- -float Util::normalize(float a, float b)
- -{
- - return sqrt(a*a + b*b);
- -}
- -
- -bool Util::isMember(cv::Mat image, int x, int y)
- -{
- - if (x < 0 || y < 0 || x >= image.cols || y >= image.rows) {
- - return false;
- - }
- -
- - if (image.at<uchar>(y, x) != 0) {
- - return true;
- - }
- -
- - return false;
- -}
- -int Util::getDistanceT(int x1, int y1, int x2, int y2)
- -{
- - return abs(y1 - y2) + abs(x2 - x1);
- -}
- -
- -double Util::euclidianDistance3D(cv::Vec3f pt1, cv::Vec3f pt2)
- -{
- - double dx = pt1[0] - pt2[0];
- - double dy = pt1[1] - pt2[1];
- - double dz = pt1[2] - pt2[2];
- -
- - return sqrtf(dx*dx + dy*dy + dz*dz);
- -}
- -
- -double Util::euclideanDistance2D(cv::Point pt1, cv::Point pt2)
- -{
- - double dx = pt1.x - pt2.x;
- - double dy = pt1.y - pt2.y;
- - return sqrtf(dx*dx + dy*dy);
- -}
- -
- -double Util::euclideanDistancePerPixel(cv::Mat xyzMap, cv::Point pt, int radius)
- -{
- - int x = pt.x;
- - int y = pt.y;
- -
- - int r_lower = (y - radius < 0) ? 0 : y - radius;
- - int c_lower = (x - radius < 0) ? 0 : x - radius;
- - int r_upper = (y + radius > xyzMap.rows) ? xyzMap.rows : y + radius;
- - int c_upper = (x + radius > xyzMap.cols) ? xyzMap.cols : x + radius;
- -
- - int count = 0;
- - double average = 0;
- - for (int r = r_lower; r < r_upper; r++) {
- - for (int c = c_lower; c < c_upper; c++) {
- - if (xyzMap.at<cv::Vec3f>(r, c)[2] != 0) {
- - double distance = euclideanDistance2D(pt, cv::Point(c, r));
- - if (distance != 0) {
- - average += euclidianDistance3D(xyzMap.at<cv::Vec3f>(pt.y, pt.x), xyzMap.at<cv::Vec3f>(r, c)) / distance;
- - count++;
- - }
- - }
- - }
- - }
- -
- - if (average == 0) {
- - return average;
- - }
- - return average / count;
- -}
- -
- -cv::Mat Util::removePoints(cv::Mat img, std::vector<cv::Point2i> points)
- -{
- - cv::Mat result = img.clone();
- - for (int i = 0; i < points.size(); i++) {
- - int x = points[i].x;
- - int y = points[i].y;
- - result.at<cv::Vec3f>(y, x)[0] = 0;
- - result.at<cv::Vec3f>(y, x)[1] = 0;
- - result.at<cv::Vec3f>(y, x)[2] = 0;
- - }
- - return result;
- -}
- -
- -cv::Vec3f Util::averageAroundPoint(cv::Mat xyzMap, cv::Point2i pt, int radius)
- -{
- - int x = pt.x;
- - int y = pt.y;
- -
- - int r_lower = (y - radius < 0) ? 0 : y - radius;
- - int c_lower = (x - radius < 0) ? 0 : x - radius;
- - int r_upper = (y + radius > xyzMap.rows) ? xyzMap.rows : y + radius;
- - int c_upper = (x + radius > xyzMap.cols) ? xyzMap.cols : x + radius;
- -
- - int count = 0;
- - cv::Vec3f average;
- - for (int r = r_lower; r < r_upper; r++) {
- - for (int c = c_lower; c < c_upper; c++) {
- - if (xyzMap.at<cv::Vec3f>(r, c)[2] != 0) {
- - average[0] += xyzMap.at<cv::Vec3f>(r, c)[0];
- - average[1] += xyzMap.at<cv::Vec3f>(r, c)[1];
- - average[2] += xyzMap.at<cv::Vec3f>(r, c)[2];
- - count++;
- - }
- - }
- - }
- -
- - if (count == 0) {
- - return 0;
- - }
- -
- - average[0] /= count;
- - average[1] /= count;
- - average[2] /= count;
- -
- - return average;
- -}
- -
- -cv::Point Util::findCentroid(cv::Mat xyzMap)
- -{
- - cv::Mat channels[3];
- - cv::split(xyzMap, channels);
- - cv::Moments m = cv::moments(channels[2], false);
- - cv::Point center(m.m10 / m.m00, m.m01 / m.m00);
- - return center;
- -}
- -
- -//Function to find Lenght of sides of triangle
- -double Util::DistanceTwoPoints(double x1, double y1, double x2, double y2)
- -{
- - double x, y, distance;
- - x = x2 - x1;
- - y = y2 - y1;
- - distance = pow(x, 2) + pow(y, 2);
- - distance = sqrt(distance);
- - return distance;
- -}
- -
- -//Function to find angle with Sine rule
- -double Util::otherAngleFind(double biggerAngle, double largestDistance, double smallDistance)
- -{
- - double otherAngle;
- - otherAngle = smallDistance *sin(biggerAngle*3.14159265 / 180);
- - otherAngle = otherAngle / largestDistance;
- - otherAngle = asin(otherAngle)*180.0 / PI;
- - return otherAngle;
- -}
- -
- -//Function to find angle opposite to largest side of triangle
- -double Util::BiggerAngleFind(double largestDistance, double smallDistanceOne, double smallDistanceTwo)
- -{
- - double biggerAngle;
- - biggerAngle = pow(smallDistanceOne, 2) + pow(smallDistanceTwo, 2) - pow(largestDistance, 2);
- - biggerAngle = fabs(biggerAngle / (2 * smallDistanceOne*smallDistanceTwo));
- - biggerAngle = acos(biggerAngle)* 180.0 / PI;
- - return biggerAngle;
- -}
- -
- -//Calculate angle of triangle given three coordinates c++ code
- -double Util::TriangleAngleCalculation(double x1, double y1, double x2, double y2, double x3, double y3)
- -{
- - double dist1, dist2, dist3;
- - double angle1, angle2, angle3;
- - double total;
- -
- - int largestLength = 0;
- - dist1 = DistanceTwoPoints(x1, y1, x2, y2);
- - dist2 = DistanceTwoPoints(x2, y2, x3, y3);
- - dist3 = DistanceTwoPoints(x1, y1, x3, y3);
- -
- - if (dist1>dist2 && dist1 > dist3)
- - {
- - //cout<<"dist1 is greater";
- - angle1 = BiggerAngleFind(dist1, dist2, dist3);
- - angle2 = otherAngleFind(angle1, dist1, dist2);
- - angle3 = otherAngleFind(angle1, dist1, dist3);
- -
- - //angle2 = OtherAngleFind(angle1, dist1, dist2);
- -
- - total = angle1 + angle2 + angle3;
- -
- - if (total <180)
- - {
- - angle1 = 180 - angle1;
- - }
- - }
- - else if (dist2 > dist3 && dist2 > dist1)
- - {
- - // cout<<"dist2 is greater";
- - angle2 = BiggerAngleFind(dist2, dist1, dist3);
- - angle1 = otherAngleFind(angle2, dist2, dist1);
- - angle3 = otherAngleFind(angle2, dist2, dist3);
- -
- - total = angle1 + angle2 + angle3;
- -
- - if (total <180)
- - {
- - angle2 = 180 - angle2;
- - }
- - }
- - else
- - {
- - // cout<<"dist3 is greater";
- - angle3 = BiggerAngleFind(dist3, dist1, dist2);
- - angle1 = otherAngleFind(angle3, dist3, dist2);
- - angle2 = otherAngleFind(angle3, dist3, dist2);
- -
- - total = angle1 + angle2 + angle3;
- -
- - if (total <180)
- - {
- - angle3 = 180 - angle3;
- - }
- - }
- -
- - //cout << endl << "Angle Between First Point and Second Point = " << angle3 << endl;
- - //cout << "Angle Between First Point and Third Point = " << angle2 << endl;
- - //cout << "Angle Between Second Point and Third Point = " << angle1 << endl;
- - return angle2;
- -}
- -
- -/***
- -Recursively performs floodfill on depthMap
- -***/
- -void Util::floodFill(int x, int y, cv::Mat& depthMap, cv::Mat& mask, double max_distance)
- -{
- - if (x < 0 || x >= depthMap.cols || y < 0 || y >= depthMap.rows || depthMap.at<cv::Vec3f>(y, x)[2] == 0.0)
- - return;
- - if (closeEnough(x, y, depthMap, 4, max_distance)) {
- - mask.at<cv::Vec3f>(y, x) = depthMap.at<cv::Vec3f>(y, x);
- - depthMap.at<cv::Vec3f>(y, x)[0] = 0;
- - depthMap.at<cv::Vec3f>(y, x)[1] = 0;
- - depthMap.at<cv::Vec3f>(y, x)[2] = 0;
- - }
- - else {
- - return;
- - }
- -
- - floodFill(x + 1, y, depthMap, mask, max_distance);
- - floodFill(x - 1, y, depthMap, mask, max_distance);
- - floodFill(x, y + 1, depthMap, mask, max_distance);
- - floodFill(x, y - 1, depthMap, mask, max_distance);
- -}
- -
- -/***
- -Check whether candidate point is close enough to neighboring points
- -***/
- -bool Util::closeEnough(int x, int y, cv::Mat& depthMap, int num_neighbors, double max_distance)
- -{
- - int num_close = 0;
- - if (x - 1 < 0 || depthMap.at<cv::Vec3f>(y, x - 1)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y, x - 1)) < max_distance) {
- - num_close++;
- - }
- - if (x + 1 >= depthMap.cols || depthMap.at<cv::Vec3f>(y, x + 1)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y, x + 1)) < max_distance) {
- - num_close++;
- - }
- - if (y - 1 < 0 || depthMap.at<cv::Vec3f>(y - 1, x)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y - 1, x)) < max_distance) {
- - num_close++;
- - }
- - if (y + 1 >= depthMap.rows || depthMap.at<cv::Vec3f>(y + 1, x)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y + 1, x)) < max_distance) {
- - num_close++;
- - }
- -
- - if (num_close >= num_neighbors) {
- - return true;
- - }
- -
- - return false;
- +#include "Util.h"
- +
- +cv::Vec3b Util::colorGenerator2()
- +{
- + return cv::Vec3b(rand() % 256, rand() % 256, rand() % 256);
- +}
- +
- +float Util::normalize(float a, float b)
- +{
- + return sqrt(a*a + b*b);
- +}
- +
- +bool Util::isMember(cv::Mat image, int x, int y)
- +{
- + if (x < 0 || y < 0 || x >= image.cols || y >= image.rows) {
- + return false;
- + }
- +
- + if (image.at<uchar>(y, x) != 0) {
- + return true;
- + }
- +
- + return false;
- +}
- +int Util::getDistanceT(int x1, int y1, int x2, int y2)
- +{
- + return abs(y1 - y2) + abs(x2 - x1);
- +}
- +
- +double Util::euclidianDistance3D(cv::Vec3f pt1, cv::Vec3f pt2)
- +{
- + double dx = pt1[0] - pt2[0];
- + double dy = pt1[1] - pt2[1];
- + double dz = pt1[2] - pt2[2];
- +
- + return sqrtf(dx*dx + dy*dy + dz*dz);
- +}
- +
- +double Util::euclideanDistance2D(cv::Point pt1, cv::Point pt2)
- +{
- + double dx = pt1.x - pt2.x;
- + double dy = pt1.y - pt2.y;
- + return sqrtf(dx*dx + dy*dy);
- +}
- +
- +double Util::euclideanDistancePerPixel(cv::Mat xyzMap, cv::Point pt, int radius)
- +{
- + int x = pt.x;
- + int y = pt.y;
- +
- + int r_lower = (y - radius < 0) ? 0 : y - radius;
- + int c_lower = (x - radius < 0) ? 0 : x - radius;
- + int r_upper = (y + radius > xyzMap.rows) ? xyzMap.rows : y + radius;
- + int c_upper = (x + radius > xyzMap.cols) ? xyzMap.cols : x + radius;
- +
- + int count = 0;
- + double average = 0;
- + for (int r = r_lower; r < r_upper; r++) {
- + for (int c = c_lower; c < c_upper; c++) {
- + if (xyzMap.at<cv::Vec3f>(r, c)[2] != 0) {
- + double distance = euclideanDistance2D(pt, cv::Point(c, r));
- + if (distance != 0) {
- + average += euclidianDistance3D(xyzMap.at<cv::Vec3f>(pt.y, pt.x), xyzMap.at<cv::Vec3f>(r, c)) / distance;
- + count++;
- + }
- + }
- + }
- + }
- +
- + if (average == 0) {
- + return average;
- + }
- + return average / count;
- +}
- +
- +cv::Mat Util::removePoints(cv::Mat img, std::vector<cv::Point2i> points)
- +{
- + cv::Mat result = img.clone();
- + for (int i = 0; i < points.size(); i++) {
- + int x = points[i].x;
- + int y = points[i].y;
- + result.at<cv::Vec3f>(y, x)[0] = 0;
- + result.at<cv::Vec3f>(y, x)[1] = 0;
- + result.at<cv::Vec3f>(y, x)[2] = 0;
- + }
- + return result;
- +}
- +
- +cv::Vec3f Util::averageAroundPoint(cv::Mat xyzMap, cv::Point2i pt, int radius)
- +{
- + int x = pt.x;
- + int y = pt.y;
- +
- + int r_lower = (y - radius < 0) ? 0 : y - radius;
- + int c_lower = (x - radius < 0) ? 0 : x - radius;
- + int r_upper = (y + radius > xyzMap.rows) ? xyzMap.rows : y + radius;
- + int c_upper = (x + radius > xyzMap.cols) ? xyzMap.cols : x + radius;
- +
- + int count = 0;
- + cv::Vec3f average;
- + for (int r = r_lower; r < r_upper; r++) {
- + for (int c = c_lower; c < c_upper; c++) {
- + if (xyzMap.at<cv::Vec3f>(r, c)[2] != 0) {
- + average[0] += xyzMap.at<cv::Vec3f>(r, c)[0];
- + average[1] += xyzMap.at<cv::Vec3f>(r, c)[1];
- + average[2] += xyzMap.at<cv::Vec3f>(r, c)[2];
- + count++;
- + }
- + }
- + }
- +
- + if (count == 0) {
- + return 0;
- + }
- +
- + average[0] /= count;
- + average[1] /= count;
- + average[2] /= count;
- +
- + return average;
- +}
- +
- +cv::Point Util::findCentroid(cv::Mat xyzMap)
- +{
- + cv::Mat channels[3];
- + cv::split(xyzMap, channels);
- + cv::Moments m = cv::moments(channels[2], false);
- + cv::Point center(m.m10 / m.m00, m.m01 / m.m00);
- + return center;
- +}
- +
- +//Function to find Lenght of sides of triangle
- +double Util::DistanceTwoPoints(double x1, double y1, double x2, double y2)
- +{
- + double x, y, distance;
- + x = x2 - x1;
- + y = y2 - y1;
- + distance = pow(x, 2) + pow(y, 2);
- + distance = sqrt(distance);
- + return distance;
- +}
- +
- +//Function to find angle with Sine rule
- +double Util::otherAngleFind(double biggerAngle, double largestDistance, double smallDistance)
- +{
- + double otherAngle;
- + otherAngle = smallDistance *sin(biggerAngle*3.14159265 / 180);
- + otherAngle = otherAngle / largestDistance;
- + otherAngle = asin(otherAngle)*180.0 / PI;
- + return otherAngle;
- +}
- +
- +//Function to find angle opposite to largest side of triangle
- +double Util::BiggerAngleFind(double largestDistance, double smallDistanceOne, double smallDistanceTwo)
- +{
- + double biggerAngle;
- + biggerAngle = pow(smallDistanceOne, 2) + pow(smallDistanceTwo, 2) - pow(largestDistance, 2);
- + biggerAngle = fabs(biggerAngle / (2 * smallDistanceOne*smallDistanceTwo));
- + biggerAngle = acos(biggerAngle)* 180.0 / PI;
- + return biggerAngle;
- +}
- +
- +//Calculate angle of triangle given three coordinates c++ code
- +double Util::TriangleAngleCalculation(double x1, double y1, double x2, double y2, double x3, double y3)
- +{
- + double dist1, dist2, dist3;
- + double angle1, angle2, angle3;
- + double total;
- +
- + int largestLength = 0;
- + dist1 = DistanceTwoPoints(x1, y1, x2, y2);
- + dist2 = DistanceTwoPoints(x2, y2, x3, y3);
- + dist3 = DistanceTwoPoints(x1, y1, x3, y3);
- +
- + if (dist1>dist2 && dist1 > dist3)
- + {
- + //cout<<"dist1 is greater";
- + angle1 = BiggerAngleFind(dist1, dist2, dist3);
- + angle2 = otherAngleFind(angle1, dist1, dist2);
- + angle3 = otherAngleFind(angle1, dist1, dist3);
- +
- + //angle2 = OtherAngleFind(angle1, dist1, dist2);
- +
- + total = angle1 + angle2 + angle3;
- +
- + if (total <180)
- + {
- + angle1 = 180 - angle1;
- + }
- + }
- + else if (dist2 > dist3 && dist2 > dist1)
- + {
- + // cout<<"dist2 is greater";
- + angle2 = BiggerAngleFind(dist2, dist1, dist3);
- + angle1 = otherAngleFind(angle2, dist2, dist1);
- + angle3 = otherAngleFind(angle2, dist2, dist3);
- +
- + total = angle1 + angle2 + angle3;
- +
- + if (total <180)
- + {
- + angle2 = 180 - angle2;
- + }
- + }
- + else
- + {
- + // cout<<"dist3 is greater";
- + angle3 = BiggerAngleFind(dist3, dist1, dist2);
- + angle1 = otherAngleFind(angle3, dist3, dist2);
- + angle2 = otherAngleFind(angle3, dist3, dist2);
- +
- + total = angle1 + angle2 + angle3;
- +
- + if (total <180)
- + {
- + angle3 = 180 - angle3;
- + }
- + }
- +
- + //cout << endl << "Angle Between First Point and Second Point = " << angle3 << endl;
- + //cout << "Angle Between First Point and Third Point = " << angle2 << endl;
- + //cout << "Angle Between Second Point and Third Point = " << angle1 << endl;
- + return angle2;
- +}
- +
- +/***
- +Recursively performs floodfill on depthMap
- +***/
- +void Util::floodFill(int x, int y, cv::Mat& depthMap, cv::Mat& mask, double max_distance)
- +{
- + if (x < 0 || x >= depthMap.cols || y < 0 || y >= depthMap.rows || depthMap.at<cv::Vec3f>(y, x)[2] == 0.0)
- + return;
- + if (closeEnough(x, y, depthMap, 4, max_distance)) {
- + mask.at<cv::Vec3f>(y, x) = depthMap.at<cv::Vec3f>(y, x);
- + depthMap.at<cv::Vec3f>(y, x)[0] = 0;
- + depthMap.at<cv::Vec3f>(y, x)[1] = 0;
- + depthMap.at<cv::Vec3f>(y, x)[2] = 0;
- + }
- + else {
- + return;
- + }
- +
- + floodFill(x + 1, y, depthMap, mask, max_distance);
- + floodFill(x - 1, y, depthMap, mask, max_distance);
- + floodFill(x, y + 1, depthMap, mask, max_distance);
- + floodFill(x, y - 1, depthMap, mask, max_distance);
- +}
- +
- +/***
- +Check whether candidate point is close enough to neighboring points
- +***/
- +bool Util::closeEnough(int x, int y, cv::Mat& depthMap, int num_neighbors, double max_distance)
- +{
- + int num_close = 0;
- + if (x - 1 < 0 || depthMap.at<cv::Vec3f>(y, x - 1)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y, x - 1)) < max_distance) {
- + num_close++;
- + }
- + if (x + 1 >= depthMap.cols || depthMap.at<cv::Vec3f>(y, x + 1)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y, x + 1)) < max_distance) {
- + num_close++;
- + }
- + if (y - 1 < 0 || depthMap.at<cv::Vec3f>(y - 1, x)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y - 1, x)) < max_distance) {
- + num_close++;
- + }
- + if (y + 1 >= depthMap.rows || depthMap.at<cv::Vec3f>(y + 1, x)[2] == 0 || Util::euclidianDistance3D(depthMap.at<cv::Vec3f>(y, x), depthMap.at<cv::Vec3f>(y + 1, x)) < max_distance) {
- + num_close++;
- + }
- +
- + if (num_close >= num_neighbors) {
- + return true;
- + }
- +
- + return false;
- }
- \ No newline at end of file
- diff --git a/Util.h b/Util.h
- index 0bbe24a..b33b9a4 100644
- --- a/Util.h
- +++ b/Util.h
- @@ -1,108 +1,108 @@
- -#pragma once
- -// OpenCV Libraries
- -#include "opencv2/imgproc/imgproc.hpp"
- -
- -// Constants Redefined
- -#ifndef M_PI
- - #define M_PI 3.14159265358979323846
- - #define PI 3.14159265;
- -#endif
- -
- -/**
- -* Class containing generic helper functions.
- -*/
- -class Util
- -{
- -public:
- -
- - /**
- - * Generates a random RGB color.
- - * @return random RGB color in Vec3b format
- - */
- - static cv::Vec3b colorGenerator2();
- -
- - /**
- - * Get euclidean distance between two 2D points.
- - * @param x1 x-coordinate of point 1
- - * @param y1 y-coordinate of point 1
- - * @param x2 x-coordinate of point 2
- - * @param y2 y-coordinate of point 2
- - * @return the euclidean distance
- - */
- - static int getDistanceT(int x1, int y1, int x2, int y2);
- -
- - /**
- - * Return the hypotenuse length.
- - * @param a leg length
- - * @param b leg length
- - * return hypotenuse length
- - */
- - static float normalize(float a, float b);
- -
- - /*
- - * Compute the euclidean distance between (x1,y1) and (x2,y2)
- - * @param p1 (x1, y1)
- - * @param p2 (x2, y2)
- - * @return the euclidean distance between the two points
- - */
- - static double euclideanDistance2D(cv::Point p1, cv::Point pt2);
- -
- - /**
- - * Get euclidean distance between two 3D points.
- - * @param pt1 point 1
- - * @param pt2 point 2
- - * @return euclidean distance
- - */
- - static double euclidianDistance3D(cv::Vec3f pt1, cv::Vec3f pt2);
- -
- - static double euclideanDistancePerPixel(cv::Mat xyzMap, cv::Point pt, int radius);
- -
- - /**
- - * Removes points on img with indicies defined in points.
- - * @param img the input image
- - * @param points list of indicies (i,j) to be set to 0
- - * @return processed image
- - */
- - static cv::Mat removePoints(cv::Mat img, std::vector<cv::Point2i> points);
- -
- - /**
- - * Average all non-zero values around a point.
- - * @param img base image to use
- - * @param pt the point of interest
- - * @param radius number of neighboring points to be used for computing the average
- - * @return average (x,y,z) value of the point of interest
- - */
- - static cv::Vec3f averageAroundPoint(cv::Mat img, cv::Point2i pt, int radius);
- -
- - /**
- - * Determine whether (x,y) is a non-zero point in the matrix.
- - * @param xyzMap Input image
- - * @param x x-coordinate of the point
- - * @param y y-coordinate of the point
- - * @return true if (x.y) is non-zero
- - */
- - static bool isMember(cv::Mat xyzMap, int x, int y);
- -
- - /*
- - * Find the centroid of the point cloud
- - * @param xyzMap input point cloud
- - * @return (x,y) coordinate of the centroid
- - */
- - static cv::Point findCentroid(cv::Mat xyzMap);
- -
- - /*
- - * Compute the angle formed by 3 points
- - * @return the angle formed
- - */
- - static double TriangleAngleCalculation(double x1, double y1, double x2, double y2, double x3, double y3);
- -
- - static void floodFill(int x, int y, cv::Mat& depthMap, cv::Mat& mask, double max_distance);
- -
- -
- -private:
- - static double DistanceTwoPoints(double x1, double y1, double x2, double y2);
- - static double otherAngleFind(double biggerAngle, double largestDistance, double smallDistance);
- - static double BiggerAngleFind(double largestDistance, double smallDistanceOne, double smallDistanceTwo);
- - static bool Util::closeEnough(int x, int y, cv::Mat& depthMap, int num_neighbors, double max_distance);
- -
- +#pragma once
- +// OpenCV Libraries
- +#include <opencv/cxcore.h>
- +#include "opencv2/imgproc/imgproc.hpp"
- +
- +// Constants Redefined
- +#ifndef M_PI
- + #define M_PI 3.14159265358979323846
- + #define PI 3.14159265;
- +#endif
- +
- +/**
- +* Class containing generic helper functions.
- +*/
- +class Util
- +{
- +public:
- + /**
- + * Generates a random RGB color.
- + * @return random RGB color in Vec3b format
- + */
- + static cv::Vec3b colorGenerator2();
- +
- + /**
- + * Get euclidean distance between two 2D points.
- + * @param x1 x-coordinate of point 1
- + * @param y1 y-coordinate of point 1
- + * @param x2 x-coordinate of point 2
- + * @param y2 y-coordinate of point 2
- + * @return the euclidean distance
- + */
- + static int getDistanceT(int x1, int y1, int x2, int y2);
- +
- + /**
- + * Return the hypotenuse length.
- + * @param a leg length
- + * @param b leg length
- + * return hypotenuse length
- + */
- + static float normalize(float a, float b);
- +
- + /*
- + * Compute the euclidean distance between (x1,y1) and (x2,y2)
- + * @param p1 (x1, y1)
- + * @param p2 (x2, y2)
- + * @return the euclidean distance between the two points
- + */
- + static double euclideanDistance2D(cv::Point p1, cv::Point pt2);
- +
- + /**
- + * Get euclidean distance between two 3D points.
- + * @param pt1 point 1
- + * @param pt2 point 2
- + * @return euclidean distance
- + */
- + static double euclidianDistance3D(cv::Vec3f pt1, cv::Vec3f pt2);
- +
- + static double euclideanDistancePerPixel(cv::Mat xyzMap, cv::Point pt, int radius);
- +
- + /**
- + * Removes points on img with indicies defined in points.
- + * @param img the input image
- + * @param points list of indicies (i,j) to be set to 0
- + * @return processed image
- + */
- + static cv::Mat removePoints(cv::Mat img, std::vector<cv::Point2i> points);
- +
- + /**
- + * Average all non-zero values around a point.
- + * @param img base image to use
- + * @param pt the point of interest
- + * @param radius number of neighboring points to be used for computing the average
- + * @return average (x,y,z) value of the point of interest
- + */
- + static cv::Vec3f averageAroundPoint(cv::Mat img, cv::Point2i pt, int radius);
- +
- + /**
- + * Determine whether (x,y) is a non-zero point in the matrix.
- + * @param xyzMap Input image
- + * @param x x-coordinate of the point
- + * @param y y-coordinate of the point
- + * @return true if (x.y) is non-zero
- + */
- + static bool isMember(cv::Mat xyzMap, int x, int y);
- +
- + /*
- + * Find the centroid of the point cloud
- + * @param xyzMap input point cloud
- + * @return (x,y) coordinate of the centroid
- + */
- + static cv::Point findCentroid(cv::Mat xyzMap);
- +
- + /*
- + * Compute the angle formed by 3 points
- + * @return the angle formed
- + */
- + static double TriangleAngleCalculation(double x1, double y1, double x2, double y2, double x3, double y3);
- +
- + static void floodFill(int x, int y, cv::Mat& depthMap, cv::Mat& mask, double max_distance);
- +
- +
- +private:
- + static double DistanceTwoPoints(double x1, double y1, double x2, double y2);
- + static double otherAngleFind(double biggerAngle, double largestDistance, double smallDistance);
- + static double BiggerAngleFind(double largestDistance, double smallDistanceOne, double smallDistanceTwo);
- + static bool Util::closeEnough(int x, int y, cv::Mat& depthMap, int num_neighbors, double max_distance);
- +
- };
- \ No newline at end of file
- diff --git a/Visualizer.cpp b/Visualizer.cpp
- index 82aaabc..91e534d 100644
- --- a/Visualizer.cpp
- +++ b/Visualizer.cpp
- @@ -1,159 +1,158 @@
- -#include "Visualizer.h"
- -
- -pcl::visualization::PCLVisualizer Visualizer::viewer = pcl::visualization::PCLVisualizer("Point Cloud");
- -
- -/***
- -Maps matrix values to [0, 255] for viewing
- -***/
- -cv::Mat Visualizer::visualizeMatrix(cv::Mat &input)
- -{
- - cv::Mat img;
- - cv::normalize(input, img, 0, 255, cv::NORM_MINMAX, CV_8UC3);
- - return img;
- -}
- -
- -/***
- -RGB depth map visualization
- -***/
- -cv::Mat Visualizer::visualizeDepthMap(cv::Mat &depthMap)
- -{
- - cv::Mat img;
- - cv::normalize(depthMap, img, 0, 255, cv::NORM_MINMAX, CV_8UC1);
- - cv::applyColorMap(img, img, cv::COLORMAP_HOT);
- - return img;
- -}
- -
- -cv::Mat Visualizer::visualizeXYZMap(cv::Mat &xyzMap)
- -{
- - cv::Mat channels[3];
- - cv::split(xyzMap, channels);
- - return visualizeDepthMap(channels[2]);
- -}
- -
- -cv::Mat Visualizer::visualizeHand(cv::Mat xyzMap, cv::Point2i finger, cv::Point2i centroid)
- -{
- - cv::Mat displayImg;
- - if (xyzMap.type() == CV_32FC3) {
- - displayImg = Visualizer::visualizeXYZMap(xyzMap);
- - }
- - else {
- - displayImg = xyzMap;
- - }
- -
- - cv::circle(displayImg, cv::Point(finger.x, finger.y), 2, cv::Scalar(0, 255, 255), 2);
- - cv::circle(displayImg, cv::Point(centroid.x, centroid.y), 2, cv::Scalar(0, 255, 0), 2);
- - return displayImg;
- -}
- -
- -void Visualizer::visualizeCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
- -{
- - viewer.setBackgroundColor(0, 0, 0);
- - if (!viewer.updatePointCloud(cloud))
- - viewer.addPointCloud(cloud);
- - viewer.spinOnce();
- -}
- -
- -cv::Mat Visualizer::visualizePlaneRegression(cv::Mat &input_mat, std::vector<double> &equation, const double threshold, bool clicked)
- -{
- - cv::Mat output_mat;
- - if (input_mat.type() == CV_32FC3) {
- - output_mat = Visualizer::visualizeXYZMap(input_mat);
- - }
- - else {
- - output_mat = input_mat;
- - }
- -
- - if (equation.size() < 3)
- - {
- - return output_mat;
- - }
- - int rowSize = input_mat.rows;
- - int colSize = input_mat.cols;
- - cv::Scalar color;
- - if (clicked) {
- - color = cv::Scalar(255, 255, 0);
- - }
- - else {
- - color = cv::Scalar(0, 255, 0);
- - }
- -
- - int pointsDetected = 0;
- - for (int r = 0; r < rowSize; r++) {
- - for (int c = 0; c < colSize; c++) {
- - double x = input_mat.at<cv::Vec3f>(r, c)[0];
- - double y = input_mat.at<cv::Vec3f>(r, c)[1];
- - double z = input_mat.at<cv::Vec3f>(r, c)[2];
- -
- - if (z == 0) {
- - continue;
- - }
- -
- - double z_hat = equation[0] * x + equation[1] * y + equation[2];
- - double r_squared = (z - z_hat) * (z - z_hat);
- -
- - if (r_squared < threshold) {
- - cv::circle(output_mat, cv::Point(c, r), 1, color, -1);
- - pointsDetected++;
- - }
- - }
- - }
- - return output_mat;
- -}
- -
- -void Visualizer::visualizePlanePoints(cv::Mat &input_mat, std::vector<cv::Point2i> indicies)
- -{
- - for (int i = 0; i < indicies.size(); i++) {
- - input_mat.at<uchar>(indicies[i].y, indicies[i].x) = (uchar)255;
- - }
- -}
- -
- -void Visualizer::visulizePolygonMesh(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
- -{
- - if (cloud.get()->width == 0) {
- - return;
- - }
- - // Normal estimation*
- - pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
- - pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
- - pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
- - tree->setInputCloud(cloud);
- - n.setInputCloud(cloud);
- - n.setSearchMethod(tree);
- - n.setKSearch(20);
- - n.compute(*normals);
- - //* normals should not contain the point normals + surface curvatures
- -
- - // Concatenate the XYZ and normal fields*
- - pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
- - pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);
- - //* cloud_with_normals = cloud + normals
- -
- - // Create search tree*
- - pcl::search::KdTree<pcl::PointNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointNormal>);
- - tree2->setInputCloud(cloud_with_normals);
- -
- - // Initialize objects
- - pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;
- - pcl::PolygonMesh triangles;
- -
- - // Set the maximum distance between connected points (maximum edge length)
- - gp3.setSearchRadius(0.025);
- -
- - // Set typical values for the parameters
- - gp3.setMu(2.5);
- - gp3.setMaximumNearestNeighbors(100);
- - gp3.setMaximumSurfaceAngle(M_PI / 4); // 45 degrees
- - gp3.setMinimumAngle(M_PI / 18); // 10 degrees
- - gp3.setMaximumAngle(2 * M_PI / 3); // 120 degrees
- - gp3.setNormalConsistency(false);
- -
- - // Get result
- - gp3.setInputCloud(cloud_with_normals);
- - gp3.setSearchMethod(tree2);
- - gp3.reconstruct(triangles);
- -
- - viewer.setBackgroundColor(0, 0, 0);
- - if (!viewer.updatePolygonMesh(triangles))
- - viewer.addPolygonMesh(triangles);
- - viewer.spinOnce();
- +#include "Visualizer.h"
- +
- +pcl::visualization::PCLVisualizer Visualizer::viewer = pcl::visualization::PCLVisualizer("Point Cloud");
- +
- +/***
- +Maps matrix values to [0, 255] for viewing
- +***/
- +cv::Mat Visualizer::visualizeMatrix(cv::Mat &input)
- +{
- + cv::Mat img;
- + cv::normalize(input, img, 0, 255, cv::NORM_MINMAX, CV_8UC3);
- + return img;
- +}
- +
- +/***
- +RGB depth map visualization
- +***/
- +cv::Mat Visualizer::visualizeDepthMap(cv::Mat &depthMap)
- +{
- + cv::Mat img;
- + cv::normalize(depthMap, img, 0, 255, cv::NORM_MINMAX, CV_8UC1);
- + cv::applyColorMap(img, img, cv::COLORMAP_HOT);
- + return img;
- +}
- +
- +cv::Mat Visualizer::visualizeXYZMap(cv::Mat &xyzMap)
- +{
- + cv::Mat channels[3];
- + cv::split(xyzMap, channels);
- + return visualizeDepthMap(channels[2]);
- +}
- +
- +cv::Mat Visualizer::visualizeHand(cv::Mat xyzMap, cv::Point2i finger, cv::Point2i centroid)
- +{
- + cv::Mat displayImg;
- + if (xyzMap.type() == CV_32FC3) {
- + displayImg = Visualizer::visualizeXYZMap(xyzMap);
- + }
- + else {
- + displayImg = xyzMap;
- + }
- +
- + cv::circle(displayImg, cv::Point(finger.x, finger.y), 2, cv::Scalar(0, 255, 255), 2);
- + cv::circle(displayImg, cv::Point(centroid.x, centroid.y), 2, cv::Scalar(0, 255, 0), 2);
- + return displayImg;
- +}
- +
- +void Visualizer::visualizeCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
- +{
- + viewer.setBackgroundColor(0, 0, 0);
- + if (!viewer.updatePointCloud(cloud))
- + viewer.addPointCloud(cloud);
- + viewer.spinOnce();
- +}
- +
- +cv::Mat Visualizer::visualizePlaneRegression(cv::Mat &input_mat, std::vector<double> &equation, const double threshold, bool clicked)
- +{
- + cv::Mat output_mat;
- + if (input_mat.type() == CV_32FC3) {
- + output_mat = Visualizer::visualizeXYZMap(input_mat);
- + } else {
- + output_mat = input_mat;
- + }
- +
- + if (equation.size() < 3)
- + {
- + return output_mat;
- + }
- + int rowSize = input_mat.rows;
- + int colSize = input_mat.cols;
- + cv::Scalar color;
- + if (clicked) {
- + color = cv::Scalar(255, 255, 0);
- + }
- + else {
- + color = cv::Scalar(0, 255, 0);
- + }
- +
- + int pointsDetected = 0;
- + for (int r = 0; r < rowSize; r++) {
- + for (int c = 0; c < colSize; c++) {
- + double x = input_mat.at<cv::Vec3f>(r, c)[0];
- + double y = input_mat.at<cv::Vec3f>(r, c)[1];
- + double z = input_mat.at<cv::Vec3f>(r, c)[2];
- +
- + if (z == 0) {
- + continue;
- + }
- +
- + double z_hat = equation[0] * x + equation[1] * y + equation[2];
- + double r_squared = (z - z_hat) * (z - z_hat);
- +
- + if (r_squared < threshold) {
- + cv::circle(output_mat, cv::Point(c, r), 1, color, -1);
- + pointsDetected++;
- + }
- + }
- + }
- + return output_mat;
- +}
- +
- +void Visualizer::visualizePlanePoints(cv::Mat &input_mat, std::vector<cv::Point2i> indicies)
- +{
- + for (int i = 0; i < indicies.size(); i++) {
- + input_mat.at<uchar>(indicies[i].y, indicies[i].x) = (uchar) 255;
- + }
- +}
- +
- +void Visualizer::visulizePolygonMesh(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
- +{
- + if (cloud.get()->width == 0) {
- + return;
- + }
- + // Normal estimation*
- + pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
- + pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
- + pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
- + tree->setInputCloud(cloud);
- + n.setInputCloud(cloud);
- + n.setSearchMethod(tree);
- + n.setKSearch(20);
- + n.compute(*normals);
- + //* normals should not contain the point normals + surface curvatures
- +
- + // Concatenate the XYZ and normal fields*
- + pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
- + pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);
- + //* cloud_with_normals = cloud + normals
- +
- + // Create search tree*
- + pcl::search::KdTree<pcl::PointNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointNormal>);
- + tree2->setInputCloud(cloud_with_normals);
- +
- + // Initialize objects
- + pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;
- + pcl::PolygonMesh triangles;
- +
- + // Set the maximum distance between connected points (maximum edge length)
- + gp3.setSearchRadius(0.025);
- +
- + // Set typical values for the parameters
- + gp3.setMu(2.5);
- + gp3.setMaximumNearestNeighbors(100);
- + gp3.setMaximumSurfaceAngle(M_PI / 4); // 45 degrees
- + gp3.setMinimumAngle(M_PI / 18); // 10 degrees
- + gp3.setMaximumAngle(2 * M_PI / 3); // 120 degrees
- + gp3.setNormalConsistency(false);
- +
- + // Get result
- + gp3.setInputCloud(cloud_with_normals);
- + gp3.setSearchMethod(tree2);
- + gp3.reconstruct(triangles);
- +
- + viewer.setBackgroundColor(0, 0, 0);
- + if (!viewer.updatePolygonMesh(triangles))
- + viewer.addPolygonMesh(triangles);
- + viewer.spinOnce();
- }
- \ No newline at end of file
- diff --git a/Visualizer.h b/Visualizer.h
- index d716c12..8eae51d 100644
- --- a/Visualizer.h
- +++ b/Visualizer.h
- @@ -1,91 +1,90 @@
- -#pragma once
- -//OpenCV Libraries
- -#include <opencv2/core/core.hpp>
- -#include <opencv2/highgui/highgui.hpp>
- -#include <opencv2/core.hpp>
- -#include <opencv2/imgproc.hpp>
- -#include <opencv2/imgcodecs.hpp>
- -#include <opencv2/highgui.hpp>
- -
- -// PCL Libraries
- -#include <pcl/point_types.h>
- -#include <pcl/io/pcd_io.h>
- -#include <pcl/kdtree/kdtree_flann.h>
- -#include <pcl/features/normal_3d.h>
- -#include <pcl/surface/gp3.h>
- -#include <pcl/visualization/cloud_viewer.h>
- -
- -/**
- -* Utility class containing various conversions and visualization techniques.
- -*/
- -class Visualizer
- -{
- -public:
- - /**
- - * Visualization for xyzMap.
- - * @param [in] xyzMap input point cloud matrix
- - * @return a CV_8UC3 representation of the xyzMap
- - */
- - static cv::Mat visualizeXYZMap(cv::Mat &xyzMap);
- -
- - /**
- - * Visualization for hand object.
- - * @param [in] xyzMap the base image to draw on
- - * @param [in] finger (i,j) coordinates of the finger
- - * @param [in] centroid (i,j) coordinates of the centroid
- - * @return a CV_8UC3 matrix with the hand points drawn
- - */
- - static cv::Mat visualizeHand(cv::Mat xyzMap, cv::Point2i finger, cv::Point2i centroid);
- -
- - /**
- - * Visualization for PCL point cloud.
- - * @param [in] cloud PCL point cloud to be visualized
- - */
- - static void visualizeCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud);
- -
- - /**
- - * Visualization for polygon mesh.
- - * Visualize a PCL point cloud as a polygon mesh
- - * @param [in] cloud PCL point cloud to be visualized
- - */
- - static void visulizePolygonMesh(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud);
- -
- - /**
- - * Visualization for plane regression.
- - * @param [in] input_mat the base xyzMap on which to draw the visualization
- - * @param [in] equation equation of the plane
- - * @param threshold maximum error distance (mm) allowed for points to be considered covered by regression equation
- - * @param clicked whether the finger is currently current contacting the regression equation. Default is FALSE
- - * @return a CV_8UC3 representation of the matrix with the regression plane drawn
- - */
- - static cv::Mat visualizePlaneRegression(cv::Mat &input_mat, std::vector<double> &equation, const double threshold, bool clicked = false);
- -
- - /*
- - * Visualize points that lie on the plane.
- - * @param input_mat the input point cloud
- - * @indicies (i,j) coordinates of the points belonging to the plane
- - */
- - static void visualizePlanePoints(cv::Mat &input_mat, std::vector<cv::Point2i> indicies);
- - static cv::Mat visualizeDepthMap(cv::Mat &depthMap);
- -
- -private:
- -
- - /**
- - * Visualization for a generic matrix.
- - * @param [in] input matrix to be visualized
- - * @return a CV_8UC3 representation of the input matrix
- - */
- - static cv::Mat visualizeMatrix(cv::Mat &input);
- -
- - /**
- - * Visualization for a depth map matrix (i,j,z).
- - * @param [in] depthMap matrix to be visualized
- - * @return a CV_8UC3 representation of the input matrix
- - */
- -
- -
- - /**
- - * PCL point cloud viewer
- - */
- - static pcl::visualization::PCLVisualizer viewer;
- +#pragma once
- +//OpenCV Libraries
- +#include <opencv2/core/core.hpp>
- +#include <opencv2/highgui/highgui.hpp>
- +#include <opencv2/core.hpp>
- +#include <opencv2/imgproc.hpp>
- +#include <opencv2/imgcodecs.hpp>
- +#include <opencv2/highgui.hpp>
- +
- +// PCL Libraries
- +#include <pcl/point_types.h>
- +#include <pcl/io/pcd_io.h>
- +#include <pcl/kdtree/kdtree_flann.h>
- +#include <pcl/features/normal_3d.h>
- +#include <pcl/surface/gp3.h>
- +#include <pcl/visualization/cloud_viewer.h>
- +
- +/**
- +* Utility class containing various conversions and visualization techniques.
- +*/
- +class Visualizer
- +{
- +public:
- + /**
- + * Visualization for xyzMap.
- + * @param [in] xyzMap input point cloud matrix
- + * @return a CV_8UC3 representation of the xyzMap
- + */
- + static cv::Mat visualizeXYZMap(cv::Mat &xyzMap);
- +
- + /**
- + * Visualization for hand object.
- + * @param [in] xyzMap the base image to draw on
- + * @param [in] finger (i,j) coordinates of the finger
- + * @param [in] centroid (i,j) coordinates of the centroid
- + * @return a CV_8UC3 matrix with the hand points drawn
- + */
- + static cv::Mat visualizeHand(cv::Mat xyzMap, cv::Point2i finger, cv::Point2i centroid);
- +
- + /**
- + * Visualization for PCL point cloud.
- + * @param [in] cloud PCL point cloud to be visualized
- + */
- + static void visualizeCloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud);
- +
- + /**
- + * Visualization for polygon mesh.
- + * Visualize a PCL point cloud as a polygon mesh
- + * @param [in] cloud PCL point cloud to be visualized
- + */
- + static void visulizePolygonMesh(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud);
- +
- + /**
- + * Visualization for plane regression.
- + * @param [in] input_mat the base xyzMap on which to draw the visualization
- + * @param [in] equation equation of the plane
- + * @param threshold maximum error distance (mm) allowed for points to be considered covered by regression equation
- + * @param clicked whether the finger is currently current contacting the regression equation. Default is FALSE
- + * @return a CV_8UC3 representation of the matrix with the regression plane drawn
- + */
- + static cv::Mat visualizePlaneRegression(cv::Mat &input_mat, std::vector<double> &equation, const double threshold, bool clicked = false);
- +
- + /*
- + * Visualize points that lie on the plane.
- + * @param input_mat the input point cloud
- + * @indicies (i,j) coordinates of the points belonging to the plane
- + */
- + static void visualizePlanePoints(cv::Mat &input_mat, std::vector<cv::Point2i> indicies);
- +
- +private:
- +
- + /**
- + * Visualization for a generic matrix.
- + * @param [in] input matrix to be visualized
- + * @return a CV_8UC3 representation of the input matrix
- + */
- + static cv::Mat visualizeMatrix(cv::Mat &input);
- +
- + /**
- + * Visualization for a depth map matrix (i,j,z).
- + * @param [in] depthMap matrix to be visualized
- + * @return a CV_8UC3 representation of the input matrix
- + */
- + static cv::Mat visualizeDepthMap(cv::Mat &depthMap);
- +
- + /**
- + * PCL point cloud viewer
- + */
- + static pcl::visualization::PCLVisualizer viewer;
- };
- \ No newline at end of file
- diff --git a/Webcam.cpp b/Webcam.cpp
- index eed13c9..734a31d 100644
- --- a/Webcam.cpp
- +++ b/Webcam.cpp
- @@ -1,22 +1,22 @@
- -#include "Webcam.h"
- -
- -/***
- -Opens a webcam and returns the handle
- -***/
- -Webcam::Webcam(int code) {
- - cap.release();
- - cap.open(code);
- -}
- -
- -void Webcam::update()
- -{
- - cap.read(frame);
- -}
- -
- -/***
- -Closes the webcam
- -***/
- -Webcam::~Webcam()
- -{
- - cap.release();
- +#include "Webcam.h"
- +
- +/***
- +Opens a webcam and returns the handle
- +***/
- +Webcam::Webcam(int code) {
- + cap.release();
- + cap.open(code);
- +}
- +
- +void Webcam::update()
- +{
- + cap.read(frame);
- +}
- +
- +/***
- +Closes the webcam
- +***/
- +Webcam::~Webcam()
- +{
- + cap.release();
- }
- \ No newline at end of file
- diff --git a/Webcam.h b/Webcam.h
- index 73d4d84..2d83852 100644
- --- a/Webcam.h
- +++ b/Webcam.h
- @@ -1,30 +1,30 @@
- -#pragma once
- -// OpenCV Libaries
- -
- -// OpenARK Libraries
- -#include "RGBCamera.h"
- -
- -/**
- -* Class defining the behavior of a standard webcam.
- -*/
- -class Webcam : public RGBCamera
- -{
- -public:
- - /**
- - * Constructs a new webcam instance.
- - * @param code the code for the webcam. Default is 0 if there is only one webcam connected
- - */
- - Webcam(int code = 0);
- -
- - /**
- - * Deconstructs a webcam instance.
- - */
- - ~Webcam();
- -
- - /**
- - * Updates the webcam infomration with the current frame.
- - */
- - void update();
- -
- -private:
- +#pragma once
- +// OpenCV Libaries
- +
- +// OpenARK Libraries
- +#include "RGBCamera.h"
- +
- +/**
- +* Class defining the behavior of a standard webcam.
- +*/
- +class Webcam : public RGBCamera
- +{
- +public:
- + /**
- + * Constructs a new webcam instance.
- + * @param code the code for the webcam. Default is 0 if there is only one webcam connected
- + */
- + Webcam(int code = 0);
- +
- + /**
- + * Deconstructs a webcam instance.
- + */
- + ~Webcam();
- +
- + /**
- + * Updates the webcam infomration with the current frame.
- + */
- + void update();
- +
- +private:
- };
- \ No newline at end of file
- diff --git a/global.cpp b/global.cpp
- deleted file mode 100644
- index 908fbc6..0000000
- --- a/global.cpp
- +++ /dev/null
- @@ -1,3 +0,0 @@
- -#include "global.h"
- -
- -char * camera_name = "sr300";
- \ No newline at end of file
- diff --git a/global.h b/global.h
- deleted file mode 100644
- index 21401b8..0000000
- --- a/global.h
- +++ /dev/null
- @@ -1,2 +0,0 @@
- -#pragma once
- -extern char * camera_name;
- \ No newline at end of file
- diff --git a/samplecode/ARTiltBrushDemo.cpp b/samplecode/ARTiltBrushDemo.cpp
- index 7cd97c6..a3afe71 100644
- --- a/samplecode/ARTiltBrushDemo.cpp
- +++ b/samplecode/ARTiltBrushDemo.cpp
- @@ -1,179 +1,179 @@
- -// C++ Libraries
- -#include <stdio.h>
- -#include <iostream>
- -#include <string>
- -#include <time.h>
- -
- -// OpenCV Libraries
- -#include <opencv/cxcore.h>
- -#include "opencv2/highgui/highgui.hpp"
- -
- -// OpenARK Libraries
- -#include "PMDCamera.h"
- -#include "Webcam.h"
- -#include "Visualizer.h"
- -#include "Hand.h"
- -#include "Plane.h"
- -#include "Calibration.h"
- -#include "Util.h"
- -#include "UDPSender.h"
- -#include "Object3D.h"
- -#include "StreamingAverager.h"
- -
- -int main() {
- - clock_t starttime = clock();
- - DepthCamera* pmd = new PMDCamera();
- - //RGBCamera *cam = new Webcam(1);
- - int frame = 0;
- - //Calibration::XYZToUnity(*pmd, 4, 4, 3);
- - cv::FileStorage fs;
- - fs.open("RT_Transform.txt", cv::FileStorage::READ);
- -
- - cv::Mat r, t;
- - fs["R"] >> r;
- - fs["T"] >> t;
- -
- - fs.release();
- -
- - UDPSender u = UDPSender();
- - cv::namedWindow("Results", CV_WINDOW_NORMAL);
- -
- - StreamingAverager handAverager = StreamingAverager(4, 0.1);
- - StreamingAverager paleeteAverager = StreamingAverager(6, 0.05);
- -
- - while (true)
- - {
- - pmd->update();
- -
- - /**
- - std::string filename = "..//OpenARK_Datasets//TwoHandDataSet1//img" + std::to_string(frame) + ".yml";
- - if (!pmd->readImage(filename))
- - break;
- - **/
- -
- - // Loading image from sensor
- -
- - pmd->removeNoise();
- - cv::imshow("XYZ Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- - if (pmd->badInput) {
- - continue;
- - }
- -
- - // Classifying objects in the scene
- -
- - pmd->computeClusters(0.02, 500);
- - std::vector<cv::Mat> clusters = pmd->getClusters();
- - std::vector<Object3D> objects;
- -
- - int handObjectIndex = -1, planeObjectIndex = -1;
- - for (int i = 0; i < clusters.size(); i++) {
- - Object3D obj = Object3D(clusters[i].clone());
- - if (obj.hasHand) {
- - handObjectIndex = i;
- - }
- -
- - if (obj.hasPlane) {
- - planeObjectIndex = i;
- - }
- - objects.push_back(obj);
- -
- - }
- -
- - // Interprate the relationship between the objects
- -
- - bool clicked = false, paletteFound = false;
- - Object3D handObject, planeObject;
- - cv::Point paletteCenter(-1. -1);
- - cv::Mat mask = cv::Mat::zeros(pmd->getXYZMap().rows, pmd->getXYZMap().cols, CV_8UC1);
- - if (planeObjectIndex != -1 && handObjectIndex != -1) {
- - planeObject = objects[planeObjectIndex];
- - handObject = objects[handObjectIndex];
- -
- - clicked = handObject.getHand().touchObject(planeObject.getPlane().getPlaneEquation(), planeObject.getPlane().R_SQUARED_DISTANCE_THRESHOLD * 5);
- - cv::Mat scene = Visualizer::visualizePlaneRegression(pmd->getXYZMap(), planeObject.getPlane().getPlaneEquation(), planeObject.getPlane().R_SQUARED_DISTANCE_THRESHOLD, clicked);
- - //scene = Visualizer::visualizeHand(scene, handObject.getHand().pointer_finger_ij, handObject.getHand().shape_centroid_ij);
- - if (planeObject.leftEdgeConnected) {
- - Visualizer::visualizePlanePoints(mask, planeObject.getPlane().getPlaneIndicies());
- - cv::Moments m = cv::moments(mask, false);
- - paletteCenter = cv::Point (m.m10 / m.m00, m.m01 / m.m00);
- - cv::circle(scene, paletteCenter, 2, cv::Scalar(0, 0, 255), 2);
- - paletteFound = true;
- - }
- - cv::imshow("Results", scene);
- - } else if (handObjectIndex != -1) {
- - handObject = objects[handObjectIndex];
- - //cv::imshow("Results", Visualizer::visualizeHand(pmd->getXYZMap(), handObject.getHand().pointer_finger_ij, handObject.getHand().shape_centroid_ij));
- - } else if (planeObjectIndex != -1) {
- - planeObject = objects[planeObjectIndex];
- - cv::Mat scene = Visualizer::visualizePlaneRegression(pmd->getXYZMap(), planeObject.getPlane().getPlaneEquation(), planeObject.getPlane().R_SQUARED_DISTANCE_THRESHOLD, clicked);
- - if (planeObject.leftEdgeConnected) {
- - Visualizer::visualizePlanePoints(mask, planeObject.getPlane().getPlaneIndicies());
- - cv::Moments m = cv::moments(mask, false);
- - paletteCenter = cv::Point (m.m10 / m.m00, m.m01 / m.m00);
- - cv::circle(scene, paletteCenter, 2, cv::Scalar(0, 0, 255), 2);
- - paletteFound = true;
- - }
- - cv::imshow("Results", scene);
- - }
- -
- - // Organize the data and send to game engine
- -
- - std::string handX = "-", handY = "-", handZ = "-";
- - std::string paletteX = "-", paletteY = "-", paletteZ = "-";
- - std::string clickStatus = "2";
- - std::string num_fingers = "0";
- - if (handObjectIndex != -1) {
- - cv::Vec3f handPos = handAverager.addDataPoint(objects[handObjectIndex].getHand().fingers_xyz[0]);
- - //float hand_pt[3] = { objects[handObjectIndex].getHand().pointer_finger_xyz[0], objects[handObjectIndex].getHand().pointer_finger_xyz[1], objects[handObjectIndex].getHand().pointer_finger_xyz[2]};
- - float hand_pt[3] = { handPos[0], handPos[1], handPos[2] };
- - cv::Mat hand_mat = cv::Mat(3, 1, CV_32FC1, &hand_pt);
- - hand_mat = r*hand_mat + t;
- - handX = std::to_string(hand_mat.at<float>(0, 0));
- - handY = std::to_string(hand_mat.at<float>(1, 0));
- - handZ = std::to_string(hand_mat.at<float>(2, 0));
- - num_fingers = std::to_string(objects[handObjectIndex].getHand().fingers_xyz.size());
- - }
- - else {
- - handAverager.addEmptyPoint();
- - }
- - if (paletteFound) {
- - cv::Vec3f pt = paleeteAverager.addDataPoint(pmd->getXYZMap().at<cv::Vec3f>(paletteCenter.y, paletteCenter.x));
- - float palette_pt[3] = { pt[0], pt[1], pt[2] };
- - cv::Mat palette_mat = cv::Mat(3, 1, CV_32FC1, &palette_pt);
- - palette_mat = r*palette_mat + t;
- - paletteX = std::to_string(palette_mat.at<float>(0, 0));
- - paletteY = std::to_string(palette_mat.at<float>(1, 0));
- - paletteZ = std::to_string(palette_mat.at<float>(2, 0));
- - } else {
- - paleeteAverager.addEmptyPoint();
- - }
- - if (clicked) {
- - clickStatus = "1";
- - }
- -
- - std::string tempS = "";
- - tempS = handX + "%" + handY + "%" + handZ + "%" + paletteX + "%" + paletteY + "%" + paletteZ + "%" + clickStatus + "%" + num_fingers;
- - u.send(tempS);
- -
- -
- -
- - /**** Start: Write Frames to File ****/
- - //std::string filename = "img" + std::to_string(frame) + ".yml";
- - //pmd->writeImage(filename);
- - //std::cout << filename << std::endl;
- - /**** End: Write Frames to File ****/
- -
- -
- -
- - /**** Start: Loop Break Condition ****/
- - int c = cvWaitKey(1);
- - if (c == 'q' || c == 'Q' || c == 27) {
- - break;
- - }
- - /**** End: Loop Break Condition ****/
- - frame++;
- - }
- -
- - pmd->destroyInstance();
- - return 0;
- +// C++ Libraries
- +#include <stdio.h>
- +#include <iostream>
- +#include <string>
- +#include <time.h>
- +
- +// OpenCV Libraries
- +#include <opencv/cxcore.h>
- +#include "opencv2/highgui/highgui.hpp"
- +
- +// OpenARK Libraries
- +#include "PMDCamera.h"
- +#include "Webcam.h"
- +#include "Visualizer.h"
- +#include "Hand.h"
- +#include "Plane.h"
- +#include "Calibration.h"
- +#include "Util.h"
- +#include "UDPSender.h"
- +#include "Object3D.h"
- +#include "StreamingAverager.h"
- +
- +int main() {
- + clock_t starttime = clock();
- + DepthCamera* pmd = new PMDCamera();
- + //RGBCamera *cam = new Webcam(1);
- + int frame = 0;
- + //Calibration::XYZToUnity(*pmd, 4, 4, 3);
- + cv::FileStorage fs;
- + fs.open("RT_Transform.txt", cv::FileStorage::READ);
- +
- + cv::Mat r, t;
- + fs["R"] >> r;
- + fs["T"] >> t;
- +
- + fs.release();
- +
- + UDPSender u = UDPSender();
- + cv::namedWindow("Results", CV_WINDOW_NORMAL);
- +
- + StreamingAverager handAverager = StreamingAverager(4, 0.1);
- + StreamingAverager paleeteAverager = StreamingAverager(6, 0.05);
- +
- + while (true)
- + {
- + pmd->update();
- +
- + /**
- + std::string filename = "..//OpenARK_Datasets//TwoHandDataSet1//img" + std::to_string(frame) + ".yml";
- + if (!pmd->readImage(filename))
- + break;
- + **/
- +
- + // Loading image from sensor
- +
- + pmd->removeNoise();
- + cv::imshow("XYZ Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- + if (pmd->badInput) {
- + continue;
- + }
- +
- + // Classifying objects in the scene
- +
- + pmd->computeClusters(0.02, 500);
- + std::vector<cv::Mat> clusters = pmd->getClusters();
- + std::vector<Object3D> objects;
- +
- + int handObjectIndex = -1, planeObjectIndex = -1;
- + for (int i = 0; i < clusters.size(); i++) {
- + Object3D obj = Object3D(clusters[i].clone());
- + if (obj.hasHand) {
- + handObjectIndex = i;
- + }
- +
- + if (obj.hasPlane) {
- + planeObjectIndex = i;
- + }
- + objects.push_back(obj);
- +
- + }
- +
- + // Interprate the relationship between the objects
- +
- + bool clicked = false, paletteFound = false;
- + Object3D handObject, planeObject;
- + cv::Point paletteCenter(-1. -1);
- + cv::Mat mask = cv::Mat::zeros(pmd->getXYZMap().rows, pmd->getXYZMap().cols, CV_8UC1);
- + if (planeObjectIndex != -1 && handObjectIndex != -1) {
- + planeObject = objects[planeObjectIndex];
- + handObject = objects[handObjectIndex];
- +
- + clicked = handObject.getHand().touchObject(planeObject.getPlane().getPlaneEquation(), planeObject.getPlane().R_SQUARED_DISTANCE_THRESHOLD * 5);
- + cv::Mat scene = Visualizer::visualizePlaneRegression(pmd->getXYZMap(), planeObject.getPlane().getPlaneEquation(), planeObject.getPlane().R_SQUARED_DISTANCE_THRESHOLD, clicked);
- + //scene = Visualizer::visualizeHand(scene, handObject.getHand().pointer_finger_ij, handObject.getHand().shape_centroid_ij);
- + if (planeObject.leftEdgeConnected) {
- + Visualizer::visualizePlanePoints(mask, planeObject.getPlane().getPlaneIndicies());
- + cv::Moments m = cv::moments(mask, false);
- + paletteCenter = cv::Point (m.m10 / m.m00, m.m01 / m.m00);
- + cv::circle(scene, paletteCenter, 2, cv::Scalar(0, 0, 255), 2);
- + paletteFound = true;
- + }
- + cv::imshow("Results", scene);
- + } else if (handObjectIndex != -1) {
- + handObject = objects[handObjectIndex];
- + //cv::imshow("Results", Visualizer::visualizeHand(pmd->getXYZMap(), handObject.getHand().pointer_finger_ij, handObject.getHand().shape_centroid_ij));
- + } else if (planeObjectIndex != -1) {
- + planeObject = objects[planeObjectIndex];
- + cv::Mat scene = Visualizer::visualizePlaneRegression(pmd->getXYZMap(), planeObject.getPlane().getPlaneEquation(), planeObject.getPlane().R_SQUARED_DISTANCE_THRESHOLD, clicked);
- + if (planeObject.leftEdgeConnected) {
- + Visualizer::visualizePlanePoints(mask, planeObject.getPlane().getPlaneIndicies());
- + cv::Moments m = cv::moments(mask, false);
- + paletteCenter = cv::Point (m.m10 / m.m00, m.m01 / m.m00);
- + cv::circle(scene, paletteCenter, 2, cv::Scalar(0, 0, 255), 2);
- + paletteFound = true;
- + }
- + cv::imshow("Results", scene);
- + }
- +
- + // Organize the data and send to game engine
- +
- + std::string handX = "-", handY = "-", handZ = "-";
- + std::string paletteX = "-", paletteY = "-", paletteZ = "-";
- + std::string clickStatus = "2";
- + std::string num_fingers = "0";
- + if (handObjectIndex != -1) {
- + cv::Vec3f handPos = handAverager.addDataPoint(objects[handObjectIndex].getHand().fingers_xyz[0]);
- + //float hand_pt[3] = { objects[handObjectIndex].getHand().pointer_finger_xyz[0], objects[handObjectIndex].getHand().pointer_finger_xyz[1], objects[handObjectIndex].getHand().pointer_finger_xyz[2]};
- + float hand_pt[3] = { handPos[0], handPos[1], handPos[2] };
- + cv::Mat hand_mat = cv::Mat(3, 1, CV_32FC1, &hand_pt);
- + hand_mat = r*hand_mat + t;
- + handX = std::to_string(hand_mat.at<float>(0, 0));
- + handY = std::to_string(hand_mat.at<float>(1, 0));
- + handZ = std::to_string(hand_mat.at<float>(2, 0));
- + num_fingers = std::to_string(objects[handObjectIndex].getHand().fingers_xyz.size());
- + }
- + else {
- + handAverager.addEmptyPoint();
- + }
- + if (paletteFound) {
- + cv::Vec3f pt = paleeteAverager.addDataPoint(pmd->getXYZMap().at<cv::Vec3f>(paletteCenter.y, paletteCenter.x));
- + float palette_pt[3] = { pt[0], pt[1], pt[2] };
- + cv::Mat palette_mat = cv::Mat(3, 1, CV_32FC1, &palette_pt);
- + palette_mat = r*palette_mat + t;
- + paletteX = std::to_string(palette_mat.at<float>(0, 0));
- + paletteY = std::to_string(palette_mat.at<float>(1, 0));
- + paletteZ = std::to_string(palette_mat.at<float>(2, 0));
- + } else {
- + paleeteAverager.addEmptyPoint();
- + }
- + if (clicked) {
- + clickStatus = "1";
- + }
- +
- + std::string tempS = "";
- + tempS = handX + "%" + handY + "%" + handZ + "%" + paletteX + "%" + paletteY + "%" + paletteZ + "%" + clickStatus + "%" + num_fingers;
- + u.send(tempS);
- +
- +
- +
- + /**** Start: Write Frames to File ****/
- + //std::string filename = "img" + std::to_string(frame) + ".yml";
- + //pmd->writeImage(filename);
- + //std::cout << filename << std::endl;
- + /**** End: Write Frames to File ****/
- +
- +
- +
- + /**** Start: Loop Break Condition ****/
- + int c = cvWaitKey(1);
- + if (c == 'q' || c == 'Q' || c == 27) {
- + break;
- + }
- + /**** End: Loop Break Condition ****/
- + frame++;
- + }
- +
- + pmd->destroyInstance();
- + return 0;
- }
- \ No newline at end of file
- diff --git a/samplecode/CreatingDebugData.cpp b/samplecode/CreatingDebugData.cpp
- index 9f66c0b..8ff63ed 100644
- --- a/samplecode/CreatingDebugData.cpp
- +++ b/samplecode/CreatingDebugData.cpp
- @@ -1,45 +1,45 @@
- -// C++ Libraries
- -#include <stdio.h>
- -#include <iostream>
- -#include <string>
- -
- -// OpenCV Libraries
- -#include <opencv/cxcore.h>
- -#include "opencv2/highgui/highgui.hpp"
- -
- -// OpenARK Libraries
- -#include "PMDCamera.h"
- -#include "Visualizer.h"
- -#include "Util.h"
- -
- -int main() {
- - clock_t starttime = clock();
- - DepthCamera* pmd = new PMDCamera();
- - int frame = 0;
- -
- - while (true)
- - {
- - pmd->update();
- -
- - /**** Start: Write Frames to File ****/
- - std::string filename = "img" + std::to_string(frame) + ".yml";
- - pmd->writeImage(filename);
- - std::cout << filename << std::endl;
- - /**** End: Write Frames to File ****/
- -
- - pmd->removeNoise();
- - cv::imshow("XYZ Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- -
- - /**** Start: Loop Break Condition ****/
- - int c = cvWaitKey(1);
- - if (c == 'q' || c == 'Q' || c == 27) {
- - break;
- - }
- - /**** End: Loop Break Condition ****/
- - frame++;
- -
- - }
- -
- - pmd->destroyInstance();
- - return 0;
- +// C++ Libraries
- +#include <stdio.h>
- +#include <iostream>
- +#include <string>
- +
- +// OpenCV Libraries
- +#include <opencv/cxcore.h>
- +#include "opencv2/highgui/highgui.hpp"
- +
- +// OpenARK Libraries
- +#include "PMDCamera.h"
- +#include "Visualizer.h"
- +#include "Util.h"
- +
- +int main() {
- + clock_t starttime = clock();
- + DepthCamera* pmd = new PMDCamera();
- + int frame = 0;
- +
- + while (true)
- + {
- + pmd->update();
- +
- + /**** Start: Write Frames to File ****/
- + std::string filename = "img" + std::to_string(frame) + ".yml";
- + pmd->writeImage(filename);
- + std::cout << filename << std::endl;
- + /**** End: Write Frames to File ****/
- +
- + pmd->removeNoise();
- + cv::imshow("XYZ Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- +
- + /**** Start: Loop Break Condition ****/
- + int c = cvWaitKey(1);
- + if (c == 'q' || c == 'Q' || c == 27) {
- + break;
- + }
- + /**** End: Loop Break Condition ****/
- + frame++;
- +
- + }
- +
- + pmd->destroyInstance();
- + return 0;
- }
- \ No newline at end of file
- diff --git a/samplecode/HandTracking.cpp b/samplecode/HandTracking.cpp
- index 7e0a203..e6e03c4 100644
- --- a/samplecode/HandTracking.cpp
- +++ b/samplecode/HandTracking.cpp
- @@ -1,51 +1,51 @@
- -// C++ Libraries
- -#include <stdio.h>
- -#include <iostream>
- -#include <string>
- -
- -// OpenCV Libraries
- -#include <opencv/cxcore.h>
- -#include "opencv2/highgui/highgui.hpp"
- -
- -// OpenARK Libraries
- -#include "PMDCamera.h"
- -#include "Visualizer.h"
- -#include "Hand.h"
- -#include "Plane.h"
- -#include "Util.h"
- -
- -int main() {
- - DepthCamera* pmd = new PMDCamera(false);
- - int frame = 0;
- -
- - while (true)
- - {
- - // Load in the debug data
- - std::string filename = "..//OpenARK_Datasets//HandDataSet1//img" + std::to_string(frame) + ".yml";
- - if (!pmd->readImage(filename))
- - break;
- -
- - // Remove noise on the frame
- - pmd->removeNoise();
- - cv::imshow("XYZ Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- -
- - // Find the right hand
- - Hand right_hand = Hand(pmd->getClusters());
- -
- - // Show the hand
- - cv::imshow("Hand", Visualizer::visualizeHand(pmd->getXYZMap(), right_hand.pointer_finger_ij, right_hand.shape_centroid_ij));
- -
- -
- - /**** Start: Loop Break Condition ****/
- - int c = cvWaitKey(1);
- - if (c == 'q' || c == 'Q' || c == 27) {
- - break;
- - }
- - /**** End: Loop Break Condition ****/
- -
- - frame++;
- - }
- -
- - pmd->destroyInstance();
- - return 0;
- +// C++ Libraries
- +#include <stdio.h>
- +#include <iostream>
- +#include <string>
- +
- +// OpenCV Libraries
- +#include <opencv/cxcore.h>
- +#include "opencv2/highgui/highgui.hpp"
- +
- +// OpenARK Libraries
- +#include "PMDCamera.h"
- +#include "Visualizer.h"
- +#include "Hand.h"
- +#include "Plane.h"
- +#include "Util.h"
- +
- +int main() {
- + DepthCamera* pmd = new PMDCamera(false);
- + int frame = 0;
- +
- + while (true)
- + {
- + // Load in the debug data
- + std::string filename = "..//OpenARK_Datasets//HandDataSet1//img" + std::to_string(frame) + ".yml";
- + if (!pmd->readImage(filename))
- + break;
- +
- + // Remove noise on the frame
- + pmd->removeNoise();
- + cv::imshow("XYZ Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- +
- + // Find the right hand
- + Hand right_hand = Hand(pmd->getClusters());
- +
- + // Show the hand
- + cv::imshow("Hand", Visualizer::visualizeHand(pmd->getXYZMap(), right_hand.pointer_finger_ij, right_hand.shape_centroid_ij));
- +
- +
- + /**** Start: Loop Break Condition ****/
- + int c = cvWaitKey(1);
- + if (c == 'q' || c == 'Q' || c == 27) {
- + break;
- + }
- + /**** End: Loop Break Condition ****/
- +
- + frame++;
- + }
- +
- + pmd->destroyInstance();
- + return 0;
- }
- \ No newline at end of file
- diff --git a/samplecode/HandandPlane.cpp b/samplecode/HandandPlane.cpp
- index 6efd71b..33bdd11 100644
- --- a/samplecode/HandandPlane.cpp
- +++ b/samplecode/HandandPlane.cpp
- @@ -1,65 +1,65 @@
- -// C++ Libraries
- -#include <stdio.h>
- -#include <iostream>
- -#include <string>
- -
- -// OpenCV Libraries
- -#include <opencv/cxcore.h>
- -#include "opencv2/highgui/highgui.hpp"
- -
- -// OpenARK Libraries
- -#include "PMDCamera.h"
- -#include "Visualizer.h"
- -#include "Hand.h"
- -#include "Plane.h"
- -#include "Util.h"
- -
- -int main() {
- - DepthCamera* pmd = new PMDCamera(false);
- - int frame = 0;
- -
- - while (true)
- - {
- - // Load in the debug data
- - std::string filename = "..//OpenARK_Datasets//ClusterDataSet1//img" + std::to_string(frame) + ".yml";
- - if (!pmd->readImage(filename))
- - break;
- -
- - // Remove noise on the frame
- - pmd->removeNoise();
- - cv::imshow("XYZ Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- -
- - // Find the plane
- - Plane plane = Plane::Plane(pmd->getXYZMap());
- - Visualizer::visualizeCloud(plane.getDownCloud());
- - cv::imshow("Plane Regression", Visualizer::visualizePlaneRegression(pmd->getXYZMap(), plane.getPlaneEquation(), plane.R_SQUARED_DISTANCE_THRESHOLD));
- -
- - // Remove the plane
- - pmd->removePoints(plane.getPlaneIndicies());
- - cv::imshow("Hand Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- - pmd->computeClusters(0.02, 500);
- -
- - // Find the right hand
- - Hand right_hand = Hand(pmd->getClusters());
- -
- - // Show the hand
- - cv::imshow("Hand", Visualizer::visualizeHand(pmd->getXYZMap(), right_hand.pointer_finger_ij, right_hand.shape_centroid_ij));
- - if (right_hand.touchObject(plane.getPlaneEquation(), plane.R_SQUARED_DISTANCE_THRESHOLD * 3) == true)
- - {
- - printf("Touched Plane\n");
- - }
- -
- -
- - /**** Start: Loop Break Condition ****/
- - int c = cvWaitKey(1);
- - if (c == 'q' || c == 'Q' || c == 27) {
- - break;
- - }
- - /**** End: Loop Break Condition ****/
- -
- - frame++;
- - }
- -
- - pmd->destroyInstance();
- - return 0;
- +// C++ Libraries
- +#include <stdio.h>
- +#include <iostream>
- +#include <string>
- +
- +// OpenCV Libraries
- +#include <opencv/cxcore.h>
- +#include "opencv2/highgui/highgui.hpp"
- +
- +// OpenARK Libraries
- +#include "PMDCamera.h"
- +#include "Visualizer.h"
- +#include "Hand.h"
- +#include "Plane.h"
- +#include "Util.h"
- +
- +int main() {
- + DepthCamera* pmd = new PMDCamera(false);
- + int frame = 0;
- +
- + while (true)
- + {
- + // Load in the debug data
- + std::string filename = "..//OpenARK_Datasets//ClusterDataSet1//img" + std::to_string(frame) + ".yml";
- + if (!pmd->readImage(filename))
- + break;
- +
- + // Remove noise on the frame
- + pmd->removeNoise();
- + cv::imshow("XYZ Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- +
- + // Find the plane
- + Plane plane = Plane::Plane(pmd->getXYZMap());
- + Visualizer::visualizeCloud(plane.getDownCloud());
- + cv::imshow("Plane Regression", Visualizer::visualizePlaneRegression(pmd->getXYZMap(), plane.getPlaneEquation(), plane.R_SQUARED_DISTANCE_THRESHOLD));
- +
- + // Remove the plane
- + pmd->removePoints(plane.getPlaneIndicies());
- + cv::imshow("Hand Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- + pmd->computeClusters(0.02, 500);
- +
- + // Find the right hand
- + Hand right_hand = Hand(pmd->getClusters());
- +
- + // Show the hand
- + cv::imshow("Hand", Visualizer::visualizeHand(pmd->getXYZMap(), right_hand.pointer_finger_ij, right_hand.shape_centroid_ij));
- + if (right_hand.touchObject(plane.getPlaneEquation(), plane.R_SQUARED_DISTANCE_THRESHOLD * 3) == true)
- + {
- + printf("Touched Plane\n");
- + }
- +
- +
- + /**** Start: Loop Break Condition ****/
- + int c = cvWaitKey(1);
- + if (c == 'q' || c == 'Q' || c == 27) {
- + break;
- + }
- + /**** End: Loop Break Condition ****/
- +
- + frame++;
- + }
- +
- + pmd->destroyInstance();
- + return 0;
- }
- \ No newline at end of file
- diff --git a/samplecode/LoadingDebugData.cpp b/samplecode/LoadingDebugData.cpp
- index 51e1e93..d0a382b 100644
- --- a/samplecode/LoadingDebugData.cpp
- +++ b/samplecode/LoadingDebugData.cpp
- @@ -1,44 +1,44 @@
- -// C++ Libraries
- -#include <stdio.h>
- -#include <iostream>
- -#include <string>
- -
- -// OpenCV Libraries
- -#include <opencv/cxcore.h>
- -#include "opencv2/highgui/highgui.hpp"
- -
- -// OpenARK Libraries
- -#include "PMDCamera.h"
- -#include "Visualizer.h"
- -#include "Util.h"
- -
- -int main() {
- - DepthCamera* pmd = new PMDCamera(false); // Initiatize with use_live_sensor = false
- - int frame = 0;
- -
- - while (true)
- - {
- - // Read in each individual frame from file
- - std::string filename = "..//OpenARK_Datasets//HandDataSet2//img" + std::to_string(frame) + ".yml";
- - if (!pmd->readImage(filename))
- - break;
- -
- - // Remove nosie from the frame
- - pmd->removeNoise();
- -
- - // Display the resultant image
- - cv::imshow("XYZ Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- -
- - /**** Start: Loop Break Condition ****/
- - int c = cvWaitKey(1);
- - if (c == 'q' || c == 'Q' || c == 27) {
- - break;
- - }
- - /**** End: Loop Break Condition ****/
- -
- - frame++;
- - }
- -
- - pmd->destroyInstance();
- - return 0;
- +// C++ Libraries
- +#include <stdio.h>
- +#include <iostream>
- +#include <string>
- +
- +// OpenCV Libraries
- +#include <opencv/cxcore.h>
- +#include "opencv2/highgui/highgui.hpp"
- +
- +// OpenARK Libraries
- +#include "PMDCamera.h"
- +#include "Visualizer.h"
- +#include "Util.h"
- +
- +int main() {
- + DepthCamera* pmd = new PMDCamera(false); // Initiatize with use_live_sensor = false
- + int frame = 0;
- +
- + while (true)
- + {
- + // Read in each individual frame from file
- + std::string filename = "..//OpenARK_Datasets//HandDataSet2//img" + std::to_string(frame) + ".yml";
- + if (!pmd->readImage(filename))
- + break;
- +
- + // Remove nosie from the frame
- + pmd->removeNoise();
- +
- + // Display the resultant image
- + cv::imshow("XYZ Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- +
- + /**** Start: Loop Break Condition ****/
- + int c = cvWaitKey(1);
- + if (c == 'q' || c == 'Q' || c == 27) {
- + break;
- + }
- + /**** End: Loop Break Condition ****/
- +
- + frame++;
- + }
- +
- + pmd->destroyInstance();
- + return 0;
- }
- \ No newline at end of file
- diff --git a/samplecode/SensorIO.cpp b/samplecode/SensorIO.cpp
- index 6abf574..d569ff8 100644
- --- a/samplecode/SensorIO.cpp
- +++ b/samplecode/SensorIO.cpp
- @@ -1,41 +1,41 @@
- -// C++ Libraries
- -#include <stdio.h>
- -#include <iostream>
- -#include <string>
- -
- -// OpenCV Libraries
- -#include <opencv/cxcore.h>
- -#include "opencv2/highgui/highgui.hpp"
- -
- -// OpenARK Libraries
- -#include "PMDCamera.h"
- -#include "Visualizer.h"
- -#include "Util.h"
- -
- -int main() {
- - DepthCamera* pmd = new PMDCamera();
- - int frame = 0;
- -
- - while (true)
- - {
- - // Update the current frame
- - pmd->update();
- -
- - // REmove the current frame
- - pmd->removeNoise();
- -
- - // Visualize the XYZ Map
- - cv::imshow("XYZ Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- -
- - /**** Start: Loop Break Condition ****/
- - int c = cvWaitKey(1);
- - if (c == 'q' || c == 'Q' || c == 27) {
- - break;
- - }
- - /**** End: Loop Break Condition ****/
- - frame++;
- - }
- -
- - pmd->destroyInstance();
- - return 0;
- +// C++ Libraries
- +#include <stdio.h>
- +#include <iostream>
- +#include <string>
- +
- +// OpenCV Libraries
- +#include <opencv/cxcore.h>
- +#include "opencv2/highgui/highgui.hpp"
- +
- +// OpenARK Libraries
- +#include "PMDCamera.h"
- +#include "Visualizer.h"
- +#include "Util.h"
- +
- +int main() {
- + DepthCamera* pmd = new PMDCamera();
- + int frame = 0;
- +
- + while (true)
- + {
- + // Update the current frame
- + pmd->update();
- +
- + // REmove the current frame
- + pmd->removeNoise();
- +
- + // Visualize the XYZ Map
- + cv::imshow("XYZ Map", Visualizer::visualizeXYZMap(pmd->getXYZMap()));
- +
- + /**** Start: Loop Break Condition ****/
- + int c = cvWaitKey(1);
- + if (c == 'q' || c == 'Q' || c == 27) {
- + break;
- + }
- + /**** End: Loop Break Condition ****/
- + frame++;
- + }
- +
- + pmd->destroyInstance();
- + return 0;
- }
- \ No newline at end of file
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement