From a87b95c3ea191041fa51c3981dafda6f6a4fb143 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Thu, 2 Jun 2016 21:30:46 +0200 Subject: [PATCH 01/33] Fix build with VisualStudio 2010 --- src/SLPoseWidget.cpp | 2 +- src/SLPoseWidget.h | 2 +- src/SLTrackerDialog.cpp | 2 +- src/SLTrackerDialog.h | 2 +- src/SLTrackerWorker.h | 2 +- src/codec/CodecPhaseShiftMicro.cpp | 2 +- src/tracker/PoseFilter.cpp | 2 +- src/tracker/PoseFilter.h | 4 ++-- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/SLPoseWidget.cpp b/src/SLPoseWidget.cpp index 6d38c48..9f3312a 100644 --- a/src/SLPoseWidget.cpp +++ b/src/SLPoseWidget.cpp @@ -78,7 +78,7 @@ SLPoseWidget::SLPoseWidget(QWidget *parent) : QVTKWidget(parent) { } -void SLPoseWidget::showPoseEstimate(Eigen::Affine3f T){ +void SLPoseWidget::showPoseEstimate(const Eigen::Affine3f & T){ //SEGFAULT!! // visualizer->updateShapePose("cube", T); diff --git a/src/SLPoseWidget.h b/src/SLPoseWidget.h index 1db8ee4..452dc0e 100644 --- a/src/SLPoseWidget.h +++ b/src/SLPoseWidget.h @@ -22,7 +22,7 @@ class SLPoseWidget : public QVTKWidget { signals: public slots: - void showPoseEstimate(Eigen::Affine3f T); + void showPoseEstimate(const Eigen::Affine3f & T); private: pcl::visualization::PCLVisualizer *visualizer; diff --git a/src/SLTrackerDialog.cpp b/src/SLTrackerDialog.cpp index 50a4aeb..58bd559 100644 --- a/src/SLTrackerDialog.cpp +++ b/src/SLTrackerDialog.cpp @@ -81,7 +81,7 @@ void SLTrackerDialog::closeEvent(QCloseEvent *){ action->setChecked(false); } -void SLTrackerDialog::showPoseEstimate(Eigen::Affine3f T){ +void SLTrackerDialog::showPoseEstimate(const Eigen::Affine3f & T){ if(ui->poseTab->isVisible()){ ui->poseWidget->showPoseEstimate(T); diff --git a/src/SLTrackerDialog.h b/src/SLTrackerDialog.h index afbab10..0d6bde0 100644 --- a/src/SLTrackerDialog.h +++ b/src/SLTrackerDialog.h @@ -28,7 +28,7 @@ class SLTrackerDialog : public QDialog { ~SLTrackerDialog(); public slots: void receiveNewPointCloud(PointCloudConstPtr pointCloud); - void showPoseEstimate(Eigen::Affine3f T); + void showPoseEstimate(const Eigen::Affine3f & T); private slots: void on_startStopPushButton_clicked(); signals: diff --git a/src/SLTrackerWorker.h b/src/SLTrackerWorker.h index 5af0d0c..d2e6378 100644 --- a/src/SLTrackerWorker.h +++ b/src/SLTrackerWorker.h @@ -31,7 +31,7 @@ class SLTrackerWorker : public QObject { void trackPointCloud(PointCloudConstPtr pointCloud); void setReference(PointCloudConstPtr referencePointCloud); signals: - void newPoseEstimate(Eigen::Affine3f T); + void newPoseEstimate(const Eigen::Affine3f & T); void error(QString err); private: bool busy; diff --git a/src/codec/CodecPhaseShiftMicro.cpp b/src/codec/CodecPhaseShiftMicro.cpp index af1fc83..a032e46 100644 --- a/src/codec/CodecPhaseShiftMicro.cpp +++ b/src/codec/CodecPhaseShiftMicro.cpp @@ -130,7 +130,7 @@ void DecoderPhaseShiftMicro::decodeFrames(cv::Mat &up, cv::Mat &vp, cv::Mat &mas cv::Mat bestDistMatch(1, rows*cols, CV_32F); for(int i=0; i::infinity(); for(int j=0; jfilterPoseEstimate(T, Tnew); emit newFilteredPoseEstimate(Tnew); diff --git a/src/tracker/PoseFilter.h b/src/tracker/PoseFilter.h index c2e918f..aa03b88 100644 --- a/src/tracker/PoseFilter.h +++ b/src/tracker/PoseFilter.h @@ -22,9 +22,9 @@ class PoseFilter : public QObject{ ~PoseFilter(); void filterPoseEstimate(const Eigen::Affine3f &Told, Eigen::Affine3f &Tnew); public slots: - void filterPoseEstimate(Eigen::Affine3f T); + void filterPoseEstimate(const Eigen::Affine3f & T); signals: - void newFilteredPoseEstimate(Eigen::Affine3f T); + void newFilteredPoseEstimate(const Eigen::Affine3f & T); // For debugging purposes //void imshow(const char* windowName, cv::Mat im, unsigned int x, unsigned int y); private: From 379548c7ebf19c3a1635b90e504006a0c7e0cefe Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Thu, 2 Jun 2016 21:31:12 +0200 Subject: [PATCH 02/33] Fix build with VTK6 and Qt4 --- CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 29f57e6..7f5f5e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -210,8 +210,9 @@ else(VTK_QT_VERSION VERSION_GREATER "4") qt4_add_resources(RCC_SRCS ${RC_FILES}) add_executable(slstudio ${CPP_FILES} ${UISrcs} ${MOCSrcs} ${RCC_SRCS}) - target_link_libraries(slstudio QVTK ${PCL_LIBRARIES} ${OpenCV_LIBS} - ${Boost_LIBRARIES} ${GLEW_LIBRARIES} ${OPENGL_LIBRARIES} ${DEVICE_LIBS}) + target_link_libraries(slstudio Qt4::QtTest ${VTK_LIBRARIES} ${PCL_LIBRARIES} + ${OpenCV_LIBS} ${Boost_LIBRARIES} ${GLEW_LIBRARIES} + ${OPENGL_LIBRARIES} ${DEVICE_LIBS}) endif(VTK_QT_VERSION VERSION_GREATER "4") if(MSVC) From 8cbc5a89b47d977e213059ea5267852796364371 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Thu, 2 Jun 2016 21:31:56 +0200 Subject: [PATCH 03/33] Support IDS cameras in CMake build --- CMakeLists.txt | 10 +++++++--- cmake/FindIds.cmake | 27 +++++++++++++++++++++++++++ src/camera/CMakeLists.txt | 12 ++++++++++++ src/camera/CameraIDSImaging.cpp | 2 +- 4 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 cmake/FindIds.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 7f5f5e6..7b96dfe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -172,10 +172,15 @@ add_subdirectory(${PROJECT_SOURCE_DIR}/src/camera) add_subdirectory(${PROJECT_SOURCE_DIR}/src/projector) if(WITH_CAMERAXIMEA) - link_directories(${XIMEA_LIBRARY_DIR}) + link_directories(${XIMEA_LIBRARY_DIR}) add_definitions(-DWITH_CAMERAXIMEA) endif(WITH_CAMERAXIMEA) +if(WITH_CAMERAIDSIMAGING) + link_directories(${IDSIMAGING_LIBRARY_DIR}) + add_definitions(-DWITH_CAMERAIDSIMAGING) +endif(WITH_CAMERAIDSIMAGING) + if(WITH_LC4500API) add_definitions(-DWITH_LC4500API) endif(WITH_LC4500API) @@ -218,6 +223,5 @@ endif(VTK_QT_VERSION VERSION_GREATER "4") if(MSVC) set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/wd4819 /wd4996" ) endif(MSVC) -message(status " :Ximea Lib : ${XIMEA_LIBRARY} at ${XIMEA_LIBRARY_DIR}") -message(status " :Device Libs : ${DEVICE_LIBS} ") + diff --git a/cmake/FindIds.cmake b/cmake/FindIds.cmake new file mode 100644 index 0000000..2d1a589 --- /dev/null +++ b/cmake/FindIds.cmake @@ -0,0 +1,27 @@ +# - Find IDS +# This module looks for the IDS uEye software package +# and determines where the binaries and header files are. +# This code sets the following variables: +# +# IDS_FOUND - True if uEye API found +# IDS_PATH: - Path to the uEye API folder +# IDS_LIBRARY_DIR - uEye libraries folder + +set(IDS_FOUND) +set(IDS_PATH) +set(IDS_LIBRARY) + +if(WIN32) + find_path(IDS_PATH uEye.h) + + if(EXISTS ${IDS_PATH}) + find_library(IDS_LIBRARY uEye_api.lib) + if(EXISTS ${IDS_LIBRARY}) + set(IDS_FOUND 1) + endif() + endif() +endif() + +mark_as_advanced(FORCE IDS_FOUND) +mark_as_advanced(FORCE IDS_PATH) +mark_as_advanced(FORCE IDS_LIBRARY) diff --git a/src/camera/CMakeLists.txt b/src/camera/CMakeLists.txt index eaaf21c..2a89501 100644 --- a/src/camera/CMakeLists.txt +++ b/src/camera/CMakeLists.txt @@ -20,3 +20,15 @@ if(WITH_CAMERAXIMEA) message(SEND_ERROR "Could not find Ximea camera support.") endif(XIMEA_FOUND) endif(WITH_CAMERAXIMEA) + +if(WITH_CAMERAIDSIMAGING) + include("${CMAKE_SOURCE_DIR}/cmake/FindIds.cmake") + if(IDS_FOUND) + include_directories(${IDS_PATH}) + add_library(IdsCamera STATIC CameraIDSImaging.cpp CameraIDSImaging.h) + target_link_libraries(IdsCamera ${XIMEA_LIBRARY}) + set(DEVICE_LIBS ${DEVICE_LIBS} IdsCamera ${IDS_LIBRARY} PARENT_SCOPE) + else(IDS_FOUND) + message(SEND_ERROR "Could not find IDS uEye camera support.") + endif(IDS_FOUND) +endif(WITH_CAMERAIDSIMAGING) \ No newline at end of file diff --git a/src/camera/CameraIDSImaging.cpp b/src/camera/CameraIDSImaging.cpp index 4ce6ac2..eb7926d 100644 --- a/src/camera/CameraIDSImaging.cpp +++ b/src/camera/CameraIDSImaging.cpp @@ -289,7 +289,7 @@ unsigned int CameraIDSImaging::getFrameWidth(){ return frameWidth; } -unsigned int CameraIDSImaging::getFrameWidthHeight(){ +unsigned int CameraIDSImaging::getFrameHeight(){ return frameHeight; } From 47fb76fdc5f0acb4ec1738275ac6c59789cc4625 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Thu, 9 Jun 2016 19:47:55 +0200 Subject: [PATCH 04/33] Disable ximea support per default --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7b96dfe..77f5a57 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ set(QT_USE_QTOPENGL TRUE) configure_file(${PROJECT_SOURCE_DIR}/slconfig.h.in ${PROJECT_BINARY_DIR}/slconfig.h) -option(WITH_CAMERAXIMEA "Use Ximea Camera" ON) +option(WITH_CAMERAXIMEA "Use Ximea Camera" OFF) option(WITH_CAMERAIIDC "Use IIDC Camera" OFF) option(WITH_CAMERAIDSIMAGING "Use IDS Camera" OFF) option(WITH_CAMERAPOINTGREY "Use Pointgrey Camera" OFF) From 1b5fc7c166b7c61b750572f9fe774941af6cb375 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Thu, 9 Jun 2016 19:49:08 +0200 Subject: [PATCH 05/33] Fix intendation --- src/SLPointCloudWidget.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SLPointCloudWidget.cpp b/src/SLPointCloudWidget.cpp index 9d38117..de0b9f2 100644 --- a/src/SLPointCloudWidget.cpp +++ b/src/SLPointCloudWidget.cpp @@ -64,9 +64,9 @@ void SLPointCloudWidget::updateCalibration(){ // Projector coordinate system cv::Mat TransformPCV(4, 4, CV_32F, 0.0); - cv::Mat(calibration.Rp).copyTo(TransformPCV.colRange(0, 3).rowRange(0, 3)); - cv::Mat(calibration.Tp).copyTo(TransformPCV.col(3).rowRange(0, 3)); - TransformPCV.at(3, 3) = 1.0; // make it homogeneous + cv::Mat(calibration.Rp).copyTo(TransformPCV.colRange(0, 3).rowRange(0, 3)); + cv::Mat(calibration.Tp).copyTo(TransformPCV.col(3).rowRange(0, 3)); + TransformPCV.at(3, 3) = 1.0; // make it homogeneous Eigen::Affine3f TransformP; cv::cv2eigen(TransformPCV, TransformP.matrix()); From ab481ca84666b51ed8cb4f2d4dbd49658b321d50 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Thu, 9 Jun 2016 19:49:45 +0200 Subject: [PATCH 06/33] Build with OpenCV versions 2 and 3 --- CMakeLists.txt | 7 ++++-- src/calibrator/CalibratorLocHom.cpp | 7 +++++- src/calibrator/CalibratorRBF.cpp | 5 +++++ src/codec/CodecPhaseShiftModulated.cpp | 30 +++++++++++++------------- 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 77f5a57..4ff7f7c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -204,7 +204,6 @@ if(VTK_QT_VERSION VERSION_GREATER "4") target_link_libraries(slstudio ${VTK_LIBRARIES} ${PCL_LIBRARIES} ${OpenCV_LIBS} ${Boost_LIBRARIES} ${GLEW_LIBRARIES} ${OPENGL_LIBRARIES} ${DEVICE_LIBS}) - else(VTK_QT_VERSION VERSION_GREATER "4") #Legacy qt4 support find_package(Qt4 REQUIRED) @@ -218,8 +217,12 @@ else(VTK_QT_VERSION VERSION_GREATER "4") target_link_libraries(slstudio Qt4::QtTest ${VTK_LIBRARIES} ${PCL_LIBRARIES} ${OpenCV_LIBS} ${Boost_LIBRARIES} ${GLEW_LIBRARIES} ${OPENGL_LIBRARIES} ${DEVICE_LIBS}) - endif(VTK_QT_VERSION VERSION_GREATER "4") + +if(OpenCV_VERSION VERSION_LESS "3") + add_definitions(-DOPENCV2) +endif(OpenCV_VERSION VERSION_LESS "3") + if(MSVC) set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/wd4819 /wd4996" ) endif(MSVC) diff --git a/src/calibrator/CalibratorLocHom.cpp b/src/calibrator/CalibratorLocHom.cpp index cacd4ef..f8eaf51 100644 --- a/src/calibrator/CalibratorLocHom.cpp +++ b/src/calibrator/CalibratorLocHom.cpp @@ -176,8 +176,13 @@ CalibrationData CalibratorLocHom::calibrate(){ //stereo calibration cv::Mat Rp, Tp, E, F; - double stereo_error = cv::stereoCalibrate(Q, qc, qp, Kc, kc, Kp, kp, frameSize, Rp, Tp, E, F,cv::CALIB_FIX_INTRINSIC, +#ifdef OPENCV2 + double stereo_error = cv::stereoCalibrate(Q, qc, qp, Kc, kc, Kp, kp, frameSize, Rp, Tp, E, F, cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 100, DBL_EPSILON)); +#else // OPENCV2 + double stereo_error = cv::stereoCalibrate(Q, qc, qp, Kc, kc, Kp, kp, frameSize, Rp, Tp, E, F, cv::CALIB_FIX_INTRINSIC, + cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 100, DBL_EPSILON)); +#endif // OPENCV2 CalibrationData calData(Kc, kc, cam_error, Kp, kp, proj_error, Rp, Tp, stereo_error); diff --git a/src/calibrator/CalibratorRBF.cpp b/src/calibrator/CalibratorRBF.cpp index 64694a1..8db5043 100644 --- a/src/calibrator/CalibratorRBF.cpp +++ b/src/calibrator/CalibratorRBF.cpp @@ -175,8 +175,13 @@ CalibrationData CalibratorRBF::calibrate(){ //stereo calibration cv::Mat Rp, Tp, E, F; +#ifdef OPENCV2 + double stereo_error = cv::stereoCalibrate(Q, qc, qp, Kc, kc, Kp, kp, frameSize, Rp, Tp, E, F, + cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 100, DBL_EPSILON)); +#else // OPENCV2 double stereo_error = cv::stereoCalibrate(Q, qc, qp, Kc, kc, Kp, kp, frameSize, Rp, Tp, E, F, cv::CALIB_FIX_INTRINSIC, cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 100, DBL_EPSILON)); +#endif // OPENCV2 CalibrationData calData(Kc, kc, cam_error, Kp, kp, proj_error, Rp, Tp, stereo_error); diff --git a/src/codec/CodecPhaseShiftModulated.cpp b/src/codec/CodecPhaseShiftModulated.cpp index a3805ef..bd2a873 100644 --- a/src/codec/CodecPhaseShiftModulated.cpp +++ b/src/codec/CodecPhaseShiftModulated.cpp @@ -29,12 +29,12 @@ EncoderPhaseShiftModulated::EncoderPhaseShiftModulated(unsigned int _screenCols, std::vector Lx; // Signal std::vector My; // Carriers - for (uint x = 0; x < Nx; x++) { + for (unsigned int x = 0; x < Nx; x++) { float phaseX = 2 * pi / Nx * x; float pitch = (float)screenCols / (float)nPhaseX; cv::Mat lx(screenRows, screenCols, CV_32F); - for (uint r = 0; r < screenRows; r++) { - for (uint c = 0; c < screenCols; c++) { + for (unsigned int r = 0; r < screenRows; r++) { + for (unsigned int c = 0; c < screenCols; c++) { float phase = 2 * pi * c / pitch - phaseX; float amp = 0.5 + 0.5 * cos(phase); lx.at(r, c) = amp; @@ -44,13 +44,13 @@ EncoderPhaseShiftModulated::EncoderPhaseShiftModulated(unsigned int _screenCols, } #if USE_SINE_MODULATOR - for (uint y = 0; y < Ny; y++) { + for (unsigned int y = 0; y < Ny; y++) { float phaseY = 2 * pi / Ny * y; //float pitch = (float)screenCols / (float)nPhaseY; float pitch = (float)screenRows / (float)nPhaseY; cv::Mat my(screenRows, screenCols, CV_32F); - for (uint r = 0; r < screenRows; r++) { - for (uint c = 0; c < screenCols; c++) { + for (unsigned int r = 0; r < screenRows; r++) { + for (unsigned int c = 0; c < screenCols; c++) { float phase = 2 * pi * r / pitch - phaseY; //float phase = 2 * pi * c / pitch - phaseY; float amp = 0.5 + 0.5 * cos(phase); @@ -60,13 +60,13 @@ EncoderPhaseShiftModulated::EncoderPhaseShiftModulated(unsigned int _screenCols, My.push_back(my); } #else - for (uint y = 0; y < Ny; y++) { - uint period = screenCols / nPhaseY; - //uint period = screenRows / nPhaseY; - uint phase = period * y / Ny; + for (unsigned int y = 0; y < Ny; y++) { + unsigned int period = screenCols / nPhaseY; + //unsigned int period = screenRows / nPhaseY; + unsigned int phase = period * y / Ny; cv::Mat my(screenRows, screenCols, CV_32F); - for (uint r = 0; r < screenRows; r++) { - for (uint c = 0; c < screenCols; c++) { + for (unsigned int r = 0; r < screenRows; r++) { + for (unsigned int c = 0; c < screenCols; c++) { float amp = (r + phase) % period > period / 2 ? 1 : 0; //float amp = (c + phase) % period > period / 2 ? 1 : 0; my.at(r, c) = amp; @@ -75,8 +75,8 @@ EncoderPhaseShiftModulated::EncoderPhaseShiftModulated(unsigned int _screenCols, My.push_back(my); } #endif - for (uint x = 0; x < Lx.size(); x++) { - for (uint y = 0; y < My.size(); y++) { + for (unsigned int x = 0; x < Lx.size(); x++) { + for (unsigned int y = 0; y < My.size(); y++) { cv::Mat I; cv::multiply(Lx[x], My[y], I, 255, CV_8U); cv::cvtColor(I, I, CV_GRAY2RGB); @@ -136,7 +136,7 @@ void DecoderPhaseShiftModulated::decodeFrames(cv::Mat &up, cv::Mat &vp, cv::Mat std::vector framesY(frames.begin() + (x - Ny), frames.begin() + x); cv::Mat Imin = cv::min(framesY[0], framesY[1]); cv::Mat Imax = cv::max(framesY[0], framesY[1]); - for (uint i = 2; i < framesY.size(); i++) { + for (unsigned int i = 2; i < framesY.size(); i++) { Imin = cv::min(Imin, framesY[i]); Imax = cv::max(Imax, framesY[i]); } From 7dd462fb7e2b2cd11993baa2843fd90716a11033 Mon Sep 17 00:00:00 2001 From: Benjamin Langmann Date: Sun, 12 Jun 2016 14:59:08 +0200 Subject: [PATCH 07/33] Added QtGlWidget based projector --- src/SLCalibrationDialog.cpp | 10 +- src/SLPreferenceDialog.cpp | 1 + src/SLStudio.pro | 2 + src/projector/ProjectorQtGL.cpp | 237 ++++++++++++++++++++++++++++++++ src/projector/ProjectorQtGL.h | 160 +++++++++++++++++++++ 5 files changed, 408 insertions(+), 2 deletions(-) create mode 100644 src/projector/ProjectorQtGL.cpp create mode 100644 src/projector/ProjectorQtGL.h diff --git a/src/SLCalibrationDialog.cpp b/src/SLCalibrationDialog.cpp index 2bafb5c..4b44710 100644 --- a/src/SLCalibrationDialog.cpp +++ b/src/SLCalibrationDialog.cpp @@ -11,6 +11,7 @@ #include "ProjectorLC3000.h" #include "ProjectorLC4500.h" #include "SLProjectorVirtual.h" +#include "ProjectorQtGL.h" #include "CalibratorLocHom.h" #include "CalibratorRBF.h" @@ -59,6 +60,8 @@ SLCalibrationDialog::SLCalibrationDialog(SLStudio *parent) : QDialog(parent), ui projector = new ProjectorLC3000(0); else if(screenNum == -3) projector = new ProjectorLC4500(0); + else if(screenNum == -4) + projector = new ProjectorQtGL(); else std::cerr << "SLCalibrationDialog: invalid projector id " << screenNum << std::endl; @@ -92,8 +95,11 @@ SLCalibrationDialog::SLCalibrationDialog(SLStudio *parent) : QDialog(parent), ui if(diamondPattern) pattern = cvtools::diamondDownsample(pattern); - projector->setPattern(i, pattern.ptr(), pattern.cols, pattern.rows); + if (!pattern.isContinuous()) { + pattern = pattern.clone(); + } + projector->setPattern(i, pattern.ptr(), pattern.cols, pattern.rows); } // Start live view @@ -182,7 +188,7 @@ void SLCalibrationDialog::on_snapButton_clicked(){ #if 1 // Write frame seq to disk for(int i=0; iprojectorComboBox->addItem("LC4500 API", -3); #endif + ui->projectorComboBox->addItem("Qt GL Window", -4); // Query cameras vector< vector > interfaceCameraList = Camera::GetInterfaceCameraList(); diff --git a/src/SLStudio.pro b/src/SLStudio.pro index d170873..f072a3e 100644 --- a/src/SLStudio.pro +++ b/src/SLStudio.pro @@ -40,6 +40,7 @@ HEADERS += SLStudio.h \ projector/OpenGLContext.h \ projector/ProjectorLC3000.h \ projector/ProjectorLC4500.h \ + projector/ProjectorQtGL.h \ codec/Codec.h \ codec/phaseunwrap.h \ codec/phasecorr.h \ @@ -94,6 +95,7 @@ SOURCES += main.cpp \ SLTraceWidget.cpp \ camera/Camera.cpp \ projector/ProjectorOpenGL.cpp \ + projector/ProjectorQtGL.cpp \ codec/phaseunwrap.cpp \ codec/phasecorr.cpp \ codec/CodecCalibration.cpp \ diff --git a/src/projector/ProjectorQtGL.cpp b/src/projector/ProjectorQtGL.cpp new file mode 100644 index 0000000..21ea650 --- /dev/null +++ b/src/projector/ProjectorQtGL.cpp @@ -0,0 +1,237 @@ +/* + * Author: Benjamin Langmann (b.langmann@gmx.de) + * Date: 2016 + */ + +#include "ProjectorQtGL.h" + +#include +#include +#include + +ProjectorQtGLWidget::ProjectorQtGLWidget(QWidget * parent) : QGLWidget(parent), m_display(-2) +{ + m_texture.tex = NULL; + + // Set up fragment shader + GLenum err = glewInit(); + if(err != GLEW_OK) + std::cerr << "ProjectorOpenGL: Could not initialize GLEW!" << std::endl; + + QDesktopWidget deskTopwidget; + int currentScreen = deskTopwidget.screenNumber(this); + int countScreens = deskTopwidget.screenCount(); + int newScreen = 0; + for (int i = countScreens-1; i >= 0; --i) + { + if (i != currentScreen) + { + newScreen = i; + break; + } + } + QRect geometry = deskTopwidget.screenGeometry(newScreen); + setGeometry(geometry.x(), geometry.y(), geometry.width(), geometry.height()); + deskTopwidget.deleteLater(); +} + +void ProjectorQtGLWidget::initializeGL() +{ + glEnable(GL_TEXTURE_2D); + + glViewport(0, 0, (GLint) width(), (GLint) height()); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0, 1, 1, 0, -1, 1); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + +void ProjectorQtGLWidget::resizeGL(int w, int h) +{ + glViewport(0, 0, (GLint)w, (GLint)h); +} + +void ProjectorQtGLWidget::paintGL() +{ + while (!m_texturesToUpload.empty()) + { + Texture *tex = m_texturesToUpload.front(); + m_texturesToUpload.pop_front(); + + if (tex->ID+1 == frameBuffers.size()+1) + { + GLuint frameBuffer; + + // Generate frame buffer object + glGenFramebuffers(1, &frameBuffer); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frameBuffer); + frameBuffers.push_back(frameBuffer); + + // Generate render buffer object to store pixel data + GLuint renderBuffer; + glGenRenderbuffers(1,&renderBuffer); + glBindRenderbuffer(GL_RENDERBUFFER, renderBuffer); + glRenderbufferStorage(GL_RENDERBUFFER,GL_RGBA8, width(), height()); + + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderBuffer); + + GLint status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + if (status != GL_FRAMEBUFFER_COMPLETE) + std::cout << "Error Framebuffer Complete" << std::endl; + else + std::cout << "Framebuffer Complete" << std::endl; + + } else if (tex->ID < frameBuffers.size()) { + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, frameBuffers[tex->ID]); + + } else if (tex->ID+1 > frameBuffers.size()+1){ + + std::cerr << "ProjectorOpenGL: cannot set pattern " << tex->ID << " before setting " << frameBuffers.size() << " -- " << tex->ID-1 << std::endl; + return; + } + + // Render pattern into buffer + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex->texWidth, tex->texHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, tex->tex); + + glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + float texWidthf = (float)width()/tex->texWidth; + float texHeightf = (float)height()/tex->texHeight; + + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(0, 0); + glTexCoord2f(texWidthf, 0); glVertex2i(1, 0); + glTexCoord2f(texWidthf, texHeightf); glVertex2i(1, 1); + glTexCoord2f(0, texHeightf); glVertex2i(0, 1); + glEnd(); + + delete tex; + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + } + + if (m_display == -1) + { + glClearColor(0.0, 0.0, 0.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + } + else if (m_display == -2) + { + glClearColor(1.0, 1.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT); + } + else if (m_display == -3) + { + if (m_texture.tex == NULL) + { + return; + } + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_texture.texWidth, m_texture.texHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, m_texture.tex); + + // glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + + float texWidthf = (float)width()/m_texture.texWidth; + float texHeightf = (float)height()/m_texture.texHeight; + + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(0, 0); + glTexCoord2f(texWidthf, 0); glVertex2i(1, 0); + glTexCoord2f(texWidthf, texHeightf); glVertex2i(1, 1); + glTexCoord2f(0, texHeightf); glVertex2i(0, 1); + glEnd(); + } + else if(m_display >= 0 && m_display < frameBuffers.size()) + { + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + glBindFramebuffer(GL_READ_FRAMEBUFFER, frameBuffers[m_display]); + + glBlitFramebuffer(0, 0, width(), height(), 0, 0, width(), height(), GL_COLOR_BUFFER_BIT, GL_NEAREST); + } + else + { + std::cerr << "ProjectorOpenGL: cannot display pattern " << m_display<< "! Out of bounds." << std::endl; + return; + } + + std::cout << "Displaying pattern: " << m_display << std::endl; + m_waitCond.wakeAll(); +} + +ProjectorQtGL::ProjectorQtGL() +{ + m_helper = new HelperObject(); + if (QThread::currentThread() != QApplication::instance()->thread()) + { + m_helper->moveToThread(QApplication::instance()->thread()); + QMetaObject::invokeMethod(m_helper, "show"); + while (!m_helper->m_glWidget) { + + } + } + else { + m_helper->show(); + } +} + +ProjectorQtGL::~ProjectorQtGL() +{ + m_helper->deleteLater(); +} + +void ProjectorQtGL::setPattern(unsigned int patternNumber, const unsigned char *tex, unsigned int texWidth, unsigned int texHeight) +{ + if (m_helper->m_glWidget) + m_helper->m_glWidget->setPattern(patternNumber, tex, texWidth, texHeight); +} + +void ProjectorQtGL::displayPattern(unsigned int patternNumber) +{ + if (m_helper->m_glWidget) + m_helper->m_glWidget->displayPattern(patternNumber); +} + +void ProjectorQtGL::displayTexture(const unsigned char *tex, unsigned int texWidth, unsigned int texHeight) +{ + if (m_helper->m_glWidget) + m_helper->m_glWidget->displayTexture(tex, texWidth, texHeight); +} + +void ProjectorQtGL::displayBlack() +{ + if (m_helper->m_glWidget) + m_helper->m_glWidget->displayBlack(); +} + +void ProjectorQtGL::displayWhite() +{ + if (m_helper->m_glWidget) + m_helper->m_glWidget->displayWhite(); +} + +void ProjectorQtGL::getScreenRes(unsigned int *nx, unsigned int *ny) +{ + if (m_helper->m_glWidget) + { + *nx = m_helper->m_glWidget->width(); + *ny = m_helper->m_glWidget->height(); + } + else + { + *nx = 100; + *ny = 100; + } +} diff --git a/src/projector/ProjectorQtGL.h b/src/projector/ProjectorQtGL.h new file mode 100644 index 0000000..03d47e5 --- /dev/null +++ b/src/projector/ProjectorQtGL.h @@ -0,0 +1,160 @@ +/* + * Author: Benjamin Langmann (b.langmann@gmx.de) + * Date: 2016 + */ + +#ifndef PROJECTORQTGL_H +#define PROJECTORQTGL_H + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "Projector.h" + +struct Texture +{ + size_t ID; + const unsigned char *tex; + unsigned int texWidth; + unsigned int texHeight; + bool ownsData = false; + + void takeOwnership() + { + if (ownsData) return; + unsigned char *newBuffer = new unsigned char[3*texWidth*texHeight]; + memcpy(newBuffer, tex, 3*texWidth*texHeight); + tex = newBuffer; + ownsData = true; + } + + ~Texture() + { + if (ownsData) + delete[] tex; + } +}; + +class ProjectorQtGLWidget : public QGLWidget +{ + Q_OBJECT + +public: + // Interface function + ProjectorQtGLWidget(QWidget * parent = 0); + + QWaitCondition m_waitCond; + + void setPattern(unsigned int patternNumber, const unsigned char *tex, unsigned int texWidth, unsigned int texHeight) + { + Texture *newTex = new Texture; + newTex->ID = patternNumber; + newTex->tex = tex; + newTex->texWidth = texWidth; + newTex->texHeight = texHeight; + newTex->takeOwnership(); + m_texturesToUpload.push_back(newTex); + } + + void displayPattern(unsigned int patternNumber) + { + m_display = patternNumber; + synchronizedUpdate(); + } + + void displayTexture(const unsigned char *tex, unsigned int width, unsigned int height) + { + m_texture.tex = tex; + m_texture.texWidth = width; + m_texture.texHeight = height; + m_display = -3; + synchronizedUpdate(); + } + + void displayBlack() {m_display = -1; synchronizedUpdate();} + void displayWhite() {m_display = -2; synchronizedUpdate();} + +protected: + int m_display; + Texture m_texture; + std::deque m_texturesToUpload; + std::vector frameBuffers; + + void initializeGL(); + + void resizeGL(int w, int h); + + void paintGL(); + + void mouseDoubleClickEvent(QMouseEvent *) + { + if (isFullScreen()) + showNormal(); + else + showFullScreen(); + } + + void synchronizedUpdate() + { + if (QThread::currentThread() != this->thread()) + { + update(); + QMutex mutex; + mutex.lock(); + m_waitCond.wait(&mutex); + mutex.unlock(); + } + else + updateGL(); + } +}; + +class HelperObject : public QObject +{ + Q_OBJECT +public: + HelperObject() : QObject(), m_glWidget(NULL) {} + + ~HelperObject() { + if (m_glWidget) + m_glWidget->deleteLater(); + } + + ProjectorQtGLWidget* m_glWidget; + +public slots: + void show() { + m_glWidget = new ProjectorQtGLWidget(); + m_glWidget->showFullScreen(); + } +}; + +// ProjectorOpenGL implementations +class ProjectorQtGL : public Projector +{ + public: + // Interface function + ProjectorQtGL(); + + // Define preset pattern sequence and upload to GPU + void setPattern(unsigned int patternNumber, const unsigned char *tex, unsigned int texWidth, unsigned int texHeight); + void displayPattern(unsigned int patternNumber); + // Upload and display pattern on the fly + void displayTexture(const unsigned char *tex, unsigned int width, unsigned int height); + void displayBlack(); + void displayWhite(); + void getScreenRes(unsigned int *nx, unsigned int *ny); + ~ProjectorQtGL(); +private: + HelperObject* m_helper; +}; + +#endif From dd7e5ec9daec3881f4aab3022d1a1237d6bc3b6c Mon Sep 17 00:00:00 2001 From: Benjamin Langmann Date: Sun, 12 Jun 2016 15:03:37 +0200 Subject: [PATCH 08/33] Added OpenCV based camera and V4L2 --- src/SLCalibrationDialog.h | 2 + src/SLScanWorker.cpp | 7 + src/SLStudio.pro | 11 +- src/camera/Camera.cpp | 24 ++ src/camera/CameraOpenCV.cpp | 146 ++++++++ src/camera/CameraOpenCV.h | 38 ++ src/camera/CameraV4L.cpp | 672 ++++++++++++++++++++++++++++++++++++ src/camera/CameraV4L.h | 47 +++ 8 files changed, 945 insertions(+), 2 deletions(-) create mode 100644 src/camera/CameraOpenCV.cpp create mode 100644 src/camera/CameraOpenCV.h create mode 100644 src/camera/CameraV4L.cpp create mode 100644 src/camera/CameraV4L.h diff --git a/src/SLCalibrationDialog.h b/src/SLCalibrationDialog.h index 37b8178..0c41e44 100644 --- a/src/SLCalibrationDialog.h +++ b/src/SLCalibrationDialog.h @@ -35,6 +35,8 @@ class SLCalibrationDialog : public QDialog { void on_listWidget_itemSelectionChanged(); void on_saveButton_clicked(); void onNewSequenceResult(cv::Mat img, unsigned int idx, bool success); + virtual void reject() {close();} + signals: void newCalibrationSaved(CalibrationData _calib); private: diff --git a/src/SLScanWorker.cpp b/src/SLScanWorker.cpp index d1f79f9..c59971b 100644 --- a/src/SLScanWorker.cpp +++ b/src/SLScanWorker.cpp @@ -28,6 +28,7 @@ #include "ProjectorLC4500.h" #include "SLProjectorVirtual.h" +#include "ProjectorQtGL.h" #include "SLCameraVirtual.h" #include "SLPointCloudWidget.h" @@ -68,6 +69,8 @@ void SLScanWorker::setup(){ projector = new ProjectorLC3000(0); else if(screenNum == -3) projector = new ProjectorLC4500(0); + else if(screenNum == -4) + projector = new ProjectorQtGL(); else std::cerr << "SLScanWorker: invalid projector id " << screenNum << std::endl; @@ -142,6 +145,10 @@ void SLScanWorker::setup(){ if(diamondPattern) pattern=cvtools::diamondDownsample(pattern); + if (!pattern.isContinuous()) { + pattern = pattern.clone(); + } + projector->setPattern(i, pattern.ptr(), pattern.cols, pattern.rows); //cv::imwrite(cv::format("pat_%d.png", i), pattern); diff --git a/src/SLStudio.pro b/src/SLStudio.pro index f072a3e..735b0fa 100644 --- a/src/SLStudio.pro +++ b/src/SLStudio.pro @@ -73,7 +73,8 @@ HEADERS += SLStudio.h \ tracker/CorrEstKdTreeFast.h \ tracker/TrackerPCL.h \ tracker/PoseFilter.h \ - cvtools.h + cvtools.h \ + camera/CameraOpenCV.h SOURCES += main.cpp \ @@ -123,7 +124,8 @@ SOURCES += main.cpp \ tracker/TrackerNDT.cpp \ tracker/CorrRejectOrgBoundFast.cpp \ tracker/TrackerPCL.cpp \ - tracker/PoseFilter.cpp + tracker/PoseFilter.cpp \ + camera/CameraOpenCV.cpp INCLUDEPATH += camera/ projector/ codec/ triangulator/ calibrator/ tracker/ @@ -381,3 +383,8 @@ win32{ LIBS += -lsetupapi } +unix:!macx{ + DEFINES += WITH_CAMERAV4L + HEADERS += camera/CameraV4L.h + SOURCES += camera/CameraV4L.cpp +} diff --git a/src/camera/Camera.cpp b/src/camera/Camera.cpp index 8de005d..970e6e5 100644 --- a/src/camera/Camera.cpp +++ b/src/camera/Camera.cpp @@ -13,6 +13,12 @@ #include "CameraPointGrey.h" #endif +#include "CameraOpenCV.h" + +#ifdef WITH_CAMERAV4L + #include "CameraV4L.h" +#endif + // Global camera enumerator std::vector< std::vector > Camera::GetInterfaceCameraList(){ std::vector< std::vector > ret; @@ -34,6 +40,14 @@ std::vector< std::vector > Camera::GetInterfaceCameraList(){ ret.push_back(ptgreycameras); #endif + std::vector cvcameras = CameraOpenCV::getCameraList(); + ret.push_back(cvcameras); + +#ifdef WITH_CAMERAV4L + std::vector v4lcameras = CameraV4L::getCameraList(); + ret.push_back(v4lcameras); +#endif + return ret; } @@ -63,5 +77,15 @@ Camera* Camera::NewCamera(unsigned int interfaceNum, unsigned int camNum, Camera return new CameraPointGrey(camNum, triggerMode); #endif + interfaceNum -= 1; + if(interfaceNum == 0) + return new CameraOpenCV(camNum); + +#ifdef WITH_CAMERAV4L + interfaceNum -= 1; + if(interfaceNum == 0) + return new CameraV4L(camNum); +#endif + return (Camera*)NULL; } diff --git a/src/camera/CameraOpenCV.cpp b/src/camera/CameraOpenCV.cpp new file mode 100644 index 0000000..a251398 --- /dev/null +++ b/src/camera/CameraOpenCV.cpp @@ -0,0 +1,146 @@ +/* + * Author: Benjamin Langmann (b.langmann@gmx.de) + * Date: 2016 + */ + +#include "CameraOpenCV.h" + +#include +#include +#include + +vector CameraOpenCV::getCameraList() +{ + vector ret; + + for (unsigned int i=0; i<2; i++) { + CameraInfo info; + info.vendor = "OpenCV"; + std::ostringstream s; + s << i; + info.model = s.str(); + info.busID = i; + ret.push_back(info); + } + + return ret; +} + +CameraOpenCV::CameraOpenCV(unsigned int camNum) : Camera(triggerModeSoftware), + m_bytes(0) +{ + m_devNum = camNum; + + CameraSettings settings; + setCameraSettings(settings); +} + +CameraSettings CameraOpenCV::getCameraSettings() +{ + CameraSettings settings; + + return settings; +} + + +void CameraOpenCV::setCameraSettings(CameraSettings settings) +{ +} + +void CameraOpenCV::startCapture() +{ + m_videoCap.open(m_devNum); + std::cout << "Exposure: " << m_videoCap.get(CV_CAP_PROP_EXPOSURE) << std::endl; + m_videoCap.set(CV_CAP_PROP_EXPOSURE, 10); + std::cout << "Exposure: " << m_videoCap.get(CV_CAP_PROP_EXPOSURE) << std::endl; + + capturing = m_videoCap.isOpened(); + + if (capturing) + { + cv::Mat frame, out; + m_videoCap >> frame; + QElapsedTimer timer; + timer.start(); + m_grabTimeMS = 0; + for (int i = 0; i < 30; ++i) + { + m_videoCap >> frame; + m_grabTimeMS += timer.restart(); + } + m_grabTimeMS /= 30; + cout << "Measured grab time: " << m_grabTimeMS << endl; + cv::cvtColor(frame, out, cv::COLOR_BGR2GRAY); + m_bytes = out.step * out.rows; + } +} + +void CameraOpenCV::stopCapture() +{ + m_videoCap.release(); + capturing = false; + m_bytes = 0; +} + +CameraFrame CameraOpenCV::getFrame(){ + + CameraFrame frame; + + if (!capturing) { + cerr << "ERROR: Not capturing on camera. Call startCapture() before lockFrame()." << endl; + return frame; + } + + cv::Mat cvframe, out; + QElapsedTimer timer; + timer.start(); + for (int i = 0; i < 30; ++i) + { + m_videoCap.grab(); + qint64 t = timer.restart(); + if (t >= 0.3 * m_grabTimeMS) break; + //cout << "Time to grab frame to short (" << t << "), retaking image ..." << endl; + } + bool ret = m_videoCap.retrieve(cvframe); + + if (!ret || cvframe.empty()) + { + cerr << "ERROR: Did not get a image from the camera." << endl; + return frame; + } + + cv::cvtColor(cvframe, out, cv::COLOR_BGR2GRAY); + // Copy frame address and properties + frame.memory = out.data; + frame.width = out.cols; + frame.height = out.rows; + frame.sizeBytes = frame.height * out.step; + + return frame; +} + +size_t CameraOpenCV::getFrameSizeBytes() +{ + if (!capturing) { + cerr << "ERROR: Cannot get frame size before capturing. Call startCapture() before getFrameSizeBytes()." << endl; + return 0; + } + + return m_bytes; +} + +size_t CameraOpenCV::getFrameWidth() +{ + return m_videoCap.get(CV_CAP_PROP_FRAME_WIDTH); +} + + +size_t CameraOpenCV::getFrameHeight() +{ + return m_videoCap.get(CV_CAP_PROP_FRAME_HEIGHT); +} + +CameraOpenCV::~CameraOpenCV() +{ +} + diff --git a/src/camera/CameraOpenCV.h b/src/camera/CameraOpenCV.h new file mode 100644 index 0000000..d0dd916 --- /dev/null +++ b/src/camera/CameraOpenCV.h @@ -0,0 +1,38 @@ +/* + * Author: Benjamin Langmann (b.langmann@gmx.de) + * Date: 2016 + */ + +#ifndef CAMERAOPENCV +#define CAMERAOPENCV + +#include "Camera.h" +#include + +using namespace std; + +class CameraOpenCV : public Camera { + public: + // Static methods + static vector getCameraList(); + // Interface function + CameraOpenCV(unsigned int camNum); + CameraSettings getCameraSettings(); + void setCameraSettings(CameraSettings); + void startCapture(); + void stopCapture(); + CameraFrame getFrame(); + size_t getFrameSizeBytes(); + size_t getFrameWidth(); + size_t getFrameHeight(); + ~CameraOpenCV(); + + private: + size_t m_grabTimeMS; + size_t m_devNum; + size_t m_bytes; + cv::VideoCapture m_videoCap; +}; + +#endif // CAMERAOPENCV + diff --git a/src/camera/CameraV4L.cpp b/src/camera/CameraV4L.cpp new file mode 100644 index 0000000..4fae5a1 --- /dev/null +++ b/src/camera/CameraV4L.cpp @@ -0,0 +1,672 @@ +/* + * Author: Benjamin Langmann (b.langmann@gmx.de) + * Date: 2016 + */ + +#include "CameraV4L.h" + +#include +#include +#include +#include +#include + +#include /* getopt_long() */ + +#include /* low-level i/o */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +#define CLEAR(x) memset(&(x), 0, sizeof(x)) + +enum io_method { + IO_METHOD_READ, + IO_METHOD_MMAP, + IO_METHOD_USERPTR, +}; + +static int xioctl(int fh, int request, void *arg) +{ + int r; + + do { + r = ioctl(fh, request, arg); + } while (-1 == r && EINTR == errno); + + return r; +} + +static int open_device(const char* dev_name) +{ + struct stat st; + + if (-1 == stat(dev_name, &st)) { + fprintf(stderr, "Cannot identify '%s': %d, %s\n", dev_name, errno, strerror(errno)); + return -1; + } + + if (!S_ISCHR(st.st_mode)) { + fprintf(stderr, "%s is no device\n", dev_name); + return -1; + } + + int fd = open(dev_name, O_RDWR /* required */ | O_NONBLOCK, 0); + + if (-1 == fd) { + fprintf(stderr, "Cannot open '%s': %d, %s\n", dev_name, errno, strerror(errno)); + return -1; + } + return fd; +} + +static bool uninit_device(int io, struct buffer *buffers, size_t n_buffers) +{ + unsigned int i; + + switch (io) { + case IO_METHOD_READ: + delete[] buffers[0].start; + break; + + case IO_METHOD_MMAP: + for (i = 0; i < n_buffers; ++i) + if (-1 == munmap(buffers[i].start, buffers[i].length)) + return false; + break; + + case IO_METHOD_USERPTR: + for (i = 0; i < n_buffers; ++i) + delete[] buffers[i].start; + break; + } + + delete[] buffers; + return true; +} + +static bool init_read(struct buffer **buffers, unsigned int buffer_size) +{ + *buffers = new buffer[1]; + + if (!*buffers) { + fprintf(stderr, "Out of memory\n"); + exit(EXIT_FAILURE); + } + + (*buffers)[0].length = buffer_size; + (*buffers)[0].start = new char[buffer_size]; + + if (!(*buffers)[0].start) { + fprintf(stderr, "Out of memory\n"); + exit(EXIT_FAILURE); + } + return true; +} + +static bool init_mmap(int fd, struct buffer **buffers, int n_buffers, unsigned int buffer_size) +{ + struct v4l2_requestbuffers req; + + CLEAR(req); + + req.count = n_buffers; + req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + req.memory = V4L2_MEMORY_MMAP; + + if (-1 == xioctl(fd, VIDIOC_REQBUFS, &req)) { + if (EINVAL == errno) { + cerr << "Camera does not support memory mapping" << endl; + return false; + } else { + cerr << "Error initializing device (VIDIOC_REQBUFS)" << endl; + return false; + } + } + + if (req.count != n_buffers) { + cerr << "Insufficient buffer memory" << endl; + return false; + } + + *buffers = new buffer[n_buffers]; + + if (!buffers) { + fprintf(stderr, "Out of memory\n"); + exit(EXIT_FAILURE); + } + + for (int i = 0; i < n_buffers; ++i) { + struct v4l2_buffer buf; + + CLEAR(buf); + + buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + buf.memory = V4L2_MEMORY_MMAP; + buf.index = i; + + if (-1 == xioctl(fd, VIDIOC_QUERYBUF, &buf)) { + cerr << "Error initializing device (VIDIOC_QUERYBUF)" << endl; + return false; + } + + (*buffers)[n_buffers].length = buf.length; + (*buffers)[n_buffers].start = (char*) + mmap(NULL /* start anywhere */, + buf.length, + PROT_READ | PROT_WRITE /* required */, + MAP_SHARED /* recommended */, + fd, buf.m.offset); + + if (MAP_FAILED == (*buffers)[n_buffers].start) { + cerr << "Error initializing device (mmap)" << endl; + return false; + } + } + return true; +} + + +static bool init_userp(int fd, struct buffer **buffers, int n_buffers, unsigned int buffer_size) +{ + struct v4l2_requestbuffers req; + + CLEAR(req); + + req.count = n_buffers; + req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + req.memory = V4L2_MEMORY_USERPTR; + + if (-1 == xioctl(fd, VIDIOC_REQBUFS, &req)) { + if (EINVAL == errno) { + cerr << "Camera does not support user pointer i/o" << endl; + return false; + } else { + cerr << "Error initializing device (VIDIOC_REQBUFS)" << endl; + return false; + } + } + + *buffers = new buffer[n_buffers]; + + if (!buffers) { + fprintf(stderr, "Out of memory\n"); + exit(EXIT_FAILURE); + } + + for (int i = 0; i < n_buffers; ++i) { + (*buffers)[i].length = buffer_size; + (*buffers)[i].start = new char[buffer_size]; + + if (!(*buffers)[i].start) { + fprintf(stderr, "Out of memory\n"); + exit(EXIT_FAILURE); + } + } + return true; +} + + +static bool init_device(int fd, const char* dev_name, int io, buffer** buffers, size_t n_buffers, struct v4l2_format& fmt) +{ + struct v4l2_capability cap; + struct v4l2_cropcap cropcap; + struct v4l2_crop crop; + + unsigned int min; + + if (-1 == xioctl(fd, VIDIOC_QUERYCAP, &cap)) { + if (EINVAL == errno) { + fprintf(stderr, "%s is no V4L2 device\n", + dev_name); + return false; + } else { + return false; + } + } + + if (!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) { + fprintf(stderr, "%s is no video capture device\n", + dev_name); + return false; + } + + switch (io) { + case IO_METHOD_READ: + if (!(cap.capabilities & V4L2_CAP_READWRITE)) { + fprintf(stderr, "%s does not support read i/o\n", + dev_name); + return false; + } + break; + + case IO_METHOD_MMAP: + case IO_METHOD_USERPTR: + if (!(cap.capabilities & V4L2_CAP_STREAMING)) { + fprintf(stderr, "%s does not support streaming i/o\n", + dev_name); + return false; + } + break; + } + + + /* Select video input, video standard and tune here. */ + + CLEAR(cropcap); + + cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + + if (0 == xioctl(fd, VIDIOC_CROPCAP, &cropcap)) { + crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + crop.c = cropcap.defrect; /* reset to default */ + + if (-1 == xioctl(fd, VIDIOC_S_CROP, &crop)) { + switch (errno) { + case EINVAL: + /* Cropping not supported. */ + break; + default: + /* Errors ignored. */ + break; + } + } + } else { + /* Errors ignored. */ + } + + fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + if (0) { + CLEAR(fmt); + fmt.fmt.pix.width = 640; + fmt.fmt.pix.height = 480; + fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV; + fmt.fmt.pix.field = V4L2_FIELD_INTERLACED; + + if (-1 == xioctl(fd, VIDIOC_S_FMT, &fmt)) + { + cerr << "Error initializing device (VIDIOC_S_FMT)" << endl; + return false; + } + /* Note VIDIOC_S_FMT may change width and height. */ + } else { + /* Preserve original settings as set by v4l2-ctl for example */ + if (-1 == xioctl(fd, VIDIOC_G_FMT, &fmt)) + { + cerr << "Error initializing device (VIDIOC_G_FMT)" << endl; + return false; + } + } + + /* Buggy driver paranoia. */ + min = fmt.fmt.pix.width * 2; + if (fmt.fmt.pix.bytesperline < min) + fmt.fmt.pix.bytesperline = min; + min = fmt.fmt.pix.bytesperline * fmt.fmt.pix.height; + if (fmt.fmt.pix.sizeimage < min) + fmt.fmt.pix.sizeimage = min; + + switch (io) { + case IO_METHOD_READ: + return init_read(buffers, fmt.fmt.pix.sizeimage); + break; + + case IO_METHOD_MMAP: + init_mmap(fd, buffers, n_buffers, fmt.fmt.pix.sizeimage); + break; + + case IO_METHOD_USERPTR: + return init_userp(fd, buffers, n_buffers, fmt.fmt.pix.sizeimage); + break; + } + return true; +} + +static buffer read_frame(int io, int fd, buffer* buffers, size_t n_buffers) +{ + struct v4l2_buffer buf; + unsigned int i; + buffer ret_buffer; + ret_buffer.length = 0; + ret_buffer.start = NULL; + + switch (io) { + case IO_METHOD_READ: + if (-1 == read(fd, buffers[0].start, buffers[0].length)) { + switch (errno) { + case EAGAIN: + return ret_buffer; + + case EIO: + /* Could ignore EIO, see spec. */ + + /* fall through */ + + default: + cerr << "Error reading frame (read)" << endl; + return ret_buffer; + } + } + ret_buffer = buffers[0]; + break; + + case IO_METHOD_MMAP: + CLEAR(buf); + + buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + buf.memory = V4L2_MEMORY_MMAP; + + if (-1 == xioctl(fd, VIDIOC_DQBUF, &buf)) { + switch (errno) { + case EAGAIN: + return ret_buffer; + + case EIO: + /* Could ignore EIO, see spec. */ + + /* fall through */ + + default: + cerr << "Error reading frame (VIDIOC_DQBUF)" << endl; + return ret_buffer; + } + } + + assert(buf.index < n_buffers); + ret_buffer = buffers[buf.index]; + + if (-1 == xioctl(fd, VIDIOC_QBUF, &buf)) { + cerr << "Error reading frame (VIDIOC_QBUF)" << endl; + return ret_buffer; + } + break; + + case IO_METHOD_USERPTR: + CLEAR(buf); + + buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + buf.memory = V4L2_MEMORY_USERPTR; + + int ret; + do { + ret = xioctl(fd, VIDIOC_DQBUF, &buf); + if (ret == -1 && errno != EAGAIN) + break; + } while (ret == -1); + + if (-1 == ret) { + cerr << "Error reading frame (VIDIOC_DQBUF)" << endl; + return ret_buffer; + } + + for (i = 0; i < n_buffers; ++i) + if (buf.m.userptr == (unsigned long)buffers[i].start + && buf.length == buffers[i].length) + break; + + assert(i < n_buffers); + + ret_buffer = buffers[i]; + + if (-1 == xioctl(fd, VIDIOC_QBUF, &buf)) { + cerr << "Error reading frame (VIDIOC_QBUF)" << endl; + return ret_buffer; + } + break; + } + + return ret_buffer; +} + +vector CameraV4L::getCameraList() +{ + vector ret; + + for (unsigned int i=0; i<16; i++) { + QString devName = "/dev/video" + QString::number(i); + + if (QFileInfo(devName).exists()) { + CameraInfo info; + info.vendor = "V4L"; + info.model = devName.toStdString(); + info.busID = i; + ret.push_back(info); + } + } + + return ret; +} + +CameraV4L::CameraV4L(unsigned int camNum) : Camera(triggerModeSoftware) +{ + m_numBuffers = 1; + m_buffers = NULL; + m_io = IO_METHOD_USERPTR; //IO_METHOD_READ; + opened = false; + + std::ostringstream devName; + devName << "/dev/video"; + devName << camNum; + m_fd = open_device(devName.str().c_str()); + + if (m_fd == -1) { + cerr << "Error opening V4L camera: " << devName.str() << endl; + return; + } + + struct v4l2_format fmt; + if (!init_device(m_fd, devName.str().c_str(), m_io, &m_buffers, m_numBuffers, fmt)) { + cerr << "Error inialializing V4L camera: " << devName.str() << endl; + return; + } + + m_width = fmt.fmt.pix.width; + m_height = fmt.fmt.pix.height; + m_bytes = fmt.fmt.pix.sizeimage; + opened = true; +} + +CameraSettings CameraV4L::getCameraSettings() +{ + CameraSettings settings; + + return settings; +} + +static void setV4LCtrl(int fd, unsigned int id, int value, const char* ctrl_id) +{ + struct v4l2_control ctrl; + CLEAR(ctrl); + ctrl.id = id; + ctrl.value = value; + if (-1 == ioctl(fd, VIDIOC_S_CTRL, &ctrl)) { + cerr << "Error initializing device (VIDIOC_S_CTRL, id: " << ctrl_id << ")" << endl; + } +} + +void CameraV4L::setCameraSettings(CameraSettings settings) +{ + setV4LCtrl(m_fd, V4L2_CID_EXPOSURE_AUTO, V4L2_EXPOSURE_MANUAL, "V4L2_CID_EXPOSURE_AUTO"); + setV4LCtrl(m_fd, V4L2_CID_EXPOSURE_ABSOLUTE, settings.shutter * 10.f, "V4L2_CID_EXPOSURE_ABSOLUTE"); + setV4LCtrl(m_fd, V4L2_CID_AUTO_WHITE_BALANCE, 0, "V4L2_CID_AUTO_WHITE_BALANCE"); + setV4LCtrl(m_fd, V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE, V4L2_WHITE_BALANCE_MANUAL, "V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE"); + setV4LCtrl(m_fd, V4L2_CID_ISO_SENSITIVITY, V4L2_ISO_SENSITIVITY_MANUAL, "V4L2_CID_ISO_SENSITIVITY"); + setV4LCtrl(m_fd, V4L2_CID_3A_LOCK, 1, "V4L2_CID_3A_LOCK"); + setV4LCtrl(m_fd, V4L2_CID_AUTOGAIN, 0, "V4L2_CID_AUTOGAIN"); + setV4LCtrl(m_fd, V4L2_CID_POWER_LINE_FREQUENCY, V4L2_CID_POWER_LINE_FREQUENCY_DISABLED, "V4L2_CID_POWER_LINE_FREQUENCY"); + setV4LCtrl(m_fd, V4L2_CID_HUE_AUTO, 0, "V4L2_CID_HUE_AUTO"); + setV4LCtrl(m_fd, V4L2_CID_AUTOBRIGHTNESS, 0, "V4L2_CID_AUTOBRIGHTNESS"); + setV4LCtrl(m_fd, V4L2_CID_FOCUS_AUTO, 0, "V4L2_CID_FOCUS_AUTO"); + setV4LCtrl(m_fd, V4L2_CID_BACKLIGHT_COMPENSATION, 0, "V4L2_CID_BACKLIGHT_COMPENSATION"); + setV4LCtrl(m_fd, V4L2_CID_FOCUS_ABSOLUTE, 0, "V4L2_CID_FOCUS_ABSOLUTE"); + setV4LCtrl(m_fd, V4L2_CID_BRIGHTNESS, 30, "V4L2_CID_BRIGHTNESS"); +} + +void CameraV4L::startCapture() +{ + if (!opened) { + cerr << "ERROR: CameraV4L not opened, cannot start capture!" << endl; + return; + } + + unsigned int i; + enum v4l2_buf_type type; + + switch (m_io) { + case IO_METHOD_READ: + /* Nothing to do. */ + break; + + case IO_METHOD_MMAP: + for (i = 0; i < m_numBuffers; ++i) { + struct v4l2_buffer buf; + + CLEAR(buf); + buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + buf.memory = V4L2_MEMORY_MMAP; + buf.index = i; + + if (-1 == xioctl(m_fd, VIDIOC_QBUF, &buf)) { + cerr << "Error initializing device (VIDIOC_QBUF)" << endl; + return; + } + } + type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + if (-1 == xioctl(m_fd, VIDIOC_STREAMON, &type)) + { + cerr << "Error initializing device (VIDIOC_STREAMON)" << endl; + return; + } + break; + + case IO_METHOD_USERPTR: + for (i = 0; i < m_numBuffers; ++i) { + struct v4l2_buffer buf; + + CLEAR(buf); + buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + buf.memory = V4L2_MEMORY_USERPTR; + buf.index = i; + buf.m.userptr = (unsigned long)m_buffers[i].start; + buf.length = m_buffers[i].length; + + if (-1 == xioctl(m_fd, VIDIOC_QBUF, &buf)) { + cerr << "Error initializing device (VIDIOC_QBUF)" << endl; + return; + } + } + type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + if (-1 == xioctl(m_fd, VIDIOC_STREAMON, &type)) { + cerr << "Error initializing device (VIDIOC_STREAMON)" << endl; + return; + } + break; + } + capturing = true; +} + +void CameraV4L::stopCapture() +{ + if (!capturing) + { + std::cerr << "CameraV4L: not capturing!" << std::endl; + return; + } + enum v4l2_buf_type type; + + switch (m_io) { + case IO_METHOD_READ: + /* Nothing to do. */ + break; + + case IO_METHOD_MMAP: + case IO_METHOD_USERPTR: + type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + if (-1 == xioctl(m_fd, VIDIOC_STREAMOFF, &type)) + { + cerr << "Error deinitializing device (VIDIOC_STREAMOFF)" << endl; + } + break; + } + + capturing = false; +} + +CameraFrame CameraV4L::getFrame(){ + + CameraFrame frame; + + if (!capturing) { + cerr << "ERROR: Not capturing on camera. Call startCapture() before lockFrame()." << endl; + return frame; + } + + buffer buf; + + for (int i = 0; i < 2; ++i) { + buf = read_frame(m_io, m_fd, m_buffers, m_numBuffers); + + if (!buf.start) + { + cerr << "ERROR: Did not get a image from the camera." << endl; + return frame; + } + } + + cv::Mat cvframe(m_height, m_width, CV_8UC2, buf.start); + cv::cvtColor(cvframe, m_lastImage, cv::COLOR_YUV2GRAY_YUYV); + + // Copy frame address and properties + frame.memory = m_lastImage.data; + frame.width = m_lastImage.cols; + frame.height = m_lastImage.rows; + frame.sizeBytes = frame.height * m_lastImage.step; + + return frame; +} + +size_t CameraV4L::getFrameSizeBytes() +{ + if (!capturing) { + cerr << "ERROR: Cannot get frame size before capturing. Call startCapture() before getFrameSizeBytes()." << endl; + return 0; + } + + return m_bytes; +} + +size_t CameraV4L::getFrameWidth() +{ + return m_width; +} + + +size_t CameraV4L::getFrameHeight() +{ + return m_height; +} + +CameraV4L::~CameraV4L() +{ + if (!opened) + return; + if (capturing) + stopCapture(); + + uninit_device(m_io, m_buffers, m_numBuffers); + + if (close(m_fd) == -1) + { + cerr << "Error closing device." << endl; + } +} + diff --git a/src/camera/CameraV4L.h b/src/camera/CameraV4L.h new file mode 100644 index 0000000..4f5c4c3 --- /dev/null +++ b/src/camera/CameraV4L.h @@ -0,0 +1,47 @@ +/* + * Author: Benjamin Langmann (b.langmann@gmx.de) + * Date: 2016 + */ + +#ifndef CAMERAV4L +#define CAMERAV4L + +#include "Camera.h" + +#include + +using namespace std; + +struct buffer { + char *start; + size_t length; +}; + +class CameraV4L : public Camera { + public: + // Static methods + static vector getCameraList(); + // Interface function + CameraV4L(unsigned int camNum); + CameraSettings getCameraSettings(); + void setCameraSettings(CameraSettings); + void startCapture(); + void stopCapture(); + CameraFrame getFrame(); + size_t getFrameSizeBytes(); + size_t getFrameWidth(); + size_t getFrameHeight(); + ~CameraV4L(); + + private: + size_t m_bytes, m_width, m_height; + buffer* m_buffers; + size_t m_numBuffers; + int m_fd; + int m_io; + bool opened; + cv::Mat m_lastImage; +}; + +#endif // CAMERAV4L + From 35c2ac94625b39bf5aaa856fe40faa4e718cbcb7 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Thu, 25 Aug 2016 18:06:15 +0200 Subject: [PATCH 09/33] Add ProjectorQtGL and CameraOpenCV to CMake build --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ff7f7c..c784c45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,11 +65,13 @@ file(GLOB H_FILES ${PROJECT_BINARY_DIR}/cmakeconfig.h src/SLTriangulatorWorker.h src/SLTraceWidget.h src/camera/Camera.h + src/camera/CameraOpenCV.h src/projector/Projector.h src/projector/ProjectorOpenGL.h src/projector/OpenGLContext.h src/projector/ProjectorLC3000.h src/projector/ProjectorLC4500.h + src/projector/ProjectorQtGL.h src/codec/Codec.h src/codec/phaseunwrap.h src/codec/phasecorr.h @@ -122,7 +124,9 @@ file(GLOB CPP_FILES src/main.cpp src/SLTriangulatorWorker.cpp src/SLTraceWidget.cpp src/camera/Camera.cpp + src/camera/CameraOpenCV.cpp src/projector/ProjectorOpenGL.cpp + src/projector/ProjectorQtGL.cpp src/codec/phaseunwrap.cpp src/codec/phasecorr.cpp src/codec/CodecCalibration.cpp From 4f7dd6d12d42b44135b784cb01043525bc9d0bc8 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Thu, 25 Aug 2016 18:37:44 +0200 Subject: [PATCH 10/33] All projectors and cameras are CMake options --- CMakeLists.txt | 89 ++++++++++++------------------------ cmake/FindGlew.cmake | 17 +++++++ slconfig.h.in | 7 ++- src/SLCalibrationDialog.cpp | 29 ++++++++++-- src/SLPreferenceDialog.cpp | 9 +++- src/SLScanWorker.cpp | 27 +++++++++-- src/camera/CMakeLists.txt | 40 +++++++++++++--- src/camera/Camera.cpp | 14 +++--- src/projector/CMakeLists.txt | 44 +++++++++++++----- 9 files changed, 181 insertions(+), 95 deletions(-) create mode 100644 cmake/FindGlew.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index c784c45..5ba1643 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,18 +2,30 @@ #Copyright Reserved. 2013-2016 cmake_minimum_required(VERSION 2.8 FATAL_ERROR) +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) project(slstudio) find_package(PCL REQUIRED) find_package(VTK REQUIRED) find_package(OpenCV REQUIRED) -find_package(Boost 1.47 COMPONENTS filesystem thread chrono exception REQUIRED) +find_package(Boost 1.47 COMPONENTS filesystem thread chrono REQUIRED) find_package(Glew REQUIRED) find_package(OpenGL REQUIRED) +if(VTK_QT_VERSION VERSION_GREATER "4") + find_package(Qt5 COMPONENTS Core Gui Test Widgets OpenGL REQUIRED) +else(VTK_QT_VERSION VERSION_GREATER "4") + #Legacy qt4 support + find_package(Qt4 REQUIRED) +endif(VTK_QT_VERSION VERSION_GREATER "4") + +if(OpenCV_VERSION VERSION_LESS "3") + add_definitions(-DOPENCV2) +endif(OpenCV_VERSION VERSION_LESS "3") + include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR} - ${PCL_INCLUDE_DIRS} ${VTK_DIR} ${OpenCV_INCLUDE_DIRS} ${Boost_INCLUDE_DIR} - ${GLEW_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIRS} ) + ${PCL_INCLUDE_DIRS} ${VTK_DIR} ${OpenCV_INCLUDE_DIRS} ${Boost_INCLUDE_DIR} + ${GLEW_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIRS} ) include(${VTK_USE_FILE}) include_directories(${PROJECT_SOURCE_DIR}/src/camera) @@ -31,12 +43,17 @@ set(QT_USE_QTOPENGL TRUE) configure_file(${PROJECT_SOURCE_DIR}/slconfig.h.in ${PROJECT_BINARY_DIR}/slconfig.h) -option(WITH_CAMERAXIMEA "Use Ximea Camera" OFF) -option(WITH_CAMERAIIDC "Use IIDC Camera" OFF) -option(WITH_CAMERAIDSIMAGING "Use IDS Camera" OFF) -option(WITH_CAMERAPOINTGREY "Use Pointgrey Camera" OFF) +option(WITH_CAMERAXIMEA "Use Ximea camera" OFF) +option(WITH_CAMERAIIDC "Use IIDC camera" OFF) +option(WITH_CAMERAIDSIMAGING "Use IDS camera" OFF) +option(WITH_CAMERAPOINTGREY "Use Pointgrey camera" OFF) +option(WITH_CAMERAV4L "Use V4L camera" OFF) +option(WITH_CAMERAOPENCV "Use OpenCV camera" OFF) + option(WITH_LC3000API "Use LightCrafter 3000 projector" ON) option(WITH_LC4500API "Use LightCrafter 4500 projector" ON) +option(WITH_PROJECTOROPENGL "Use OpenGL projector" ON) +option(WITH_PROJECTORQT "Use Qt projector" ON) #Set source file set @@ -65,13 +82,7 @@ file(GLOB H_FILES ${PROJECT_BINARY_DIR}/cmakeconfig.h src/SLTriangulatorWorker.h src/SLTraceWidget.h src/camera/Camera.h - src/camera/CameraOpenCV.h src/projector/Projector.h - src/projector/ProjectorOpenGL.h - src/projector/OpenGLContext.h - src/projector/ProjectorLC3000.h - src/projector/ProjectorLC4500.h - src/projector/ProjectorQtGL.h src/codec/Codec.h src/codec/phaseunwrap.h src/codec/phasecorr.h @@ -124,9 +135,6 @@ file(GLOB CPP_FILES src/main.cpp src/SLTriangulatorWorker.cpp src/SLTraceWidget.cpp src/camera/Camera.cpp - src/camera/CameraOpenCV.cpp - src/projector/ProjectorOpenGL.cpp - src/projector/ProjectorQtGL.cpp src/codec/phaseunwrap.cpp src/codec/phasecorr.cpp src/codec/CodecCalibration.cpp @@ -158,59 +166,25 @@ file(GLOB CPP_FILES src/main.cpp file(GLOB RC_FILES src/SLResources.qrc) - -# Compile with system dependent OpenGL Context code -if(APPLE) - list(APPEND CPP_FILES src/projector/OpenGLContext.Mac.mm) -elseif(WIN32) - list(APPEND CPP_FILES src/projector/OpenGLContext.Win.cpp) - add_definitions(-DWIN32 -D_UNICODE -DUNICODE) -else() - list(APPEND CPP_FILES src/projector/OpenGLContext.Unix.cpp) -endif() - set(DEVICE_LIBS) #Device Options - camera add_subdirectory(${PROJECT_SOURCE_DIR}/src/camera) #Device Options - projector add_subdirectory(${PROJECT_SOURCE_DIR}/src/projector) -if(WITH_CAMERAXIMEA) - link_directories(${XIMEA_LIBRARY_DIR}) - add_definitions(-DWITH_CAMERAXIMEA) -endif(WITH_CAMERAXIMEA) - -if(WITH_CAMERAIDSIMAGING) - link_directories(${IDSIMAGING_LIBRARY_DIR}) - add_definitions(-DWITH_CAMERAIDSIMAGING) -endif(WITH_CAMERAIDSIMAGING) - -if(WITH_LC4500API) - add_definitions(-DWITH_LC4500API) -endif(WITH_LC4500API) - -if(WITH_LC3000API) - add_definitions(-DWITH_LC3000API) -endif(WITH_LC3000API) - - if(VTK_QT_VERSION VERSION_GREATER "4") # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) - find_package(Qt5 COMPONENTS Core Gui Test Widgets REQUIRED) - - qt5_wrap_ui(UISrcs ${UI_FILES} ) + qt5_wrap_ui(UISrcs ${UI_FILES}) # CMAKE_AUTOMOC in ON so the MocHdrs will be automatically wrapped. qt5_add_resources(RCC_SRCS ${RC_FILES}) add_executable(slstudio ${CPP_FILES} ${UISrcs} ${H_FILES} ${RCC_SRCS}) qt5_use_modules(slstudio Core Gui Widgets Test) target_link_libraries(slstudio ${VTK_LIBRARIES} ${PCL_LIBRARIES} - ${OpenCV_LIBS} ${Boost_LIBRARIES} ${GLEW_LIBRARIES} - ${OPENGL_LIBRARIES} ${DEVICE_LIBS}) + ${OpenCV_LIBS} ${Boost_LIBRARIES} ${DEVICE_LIBS}) else(VTK_QT_VERSION VERSION_GREATER "4") - #Legacy qt4 support - find_package(Qt4 REQUIRED) + #Legacy qt4 support include(${QT_USE_FILE}) qt4_wrap_ui(UISrcs ${UI_FILES}) @@ -219,16 +193,11 @@ else(VTK_QT_VERSION VERSION_GREATER "4") add_executable(slstudio ${CPP_FILES} ${UISrcs} ${MOCSrcs} ${RCC_SRCS}) target_link_libraries(slstudio Qt4::QtTest ${VTK_LIBRARIES} ${PCL_LIBRARIES} - ${OpenCV_LIBS} ${Boost_LIBRARIES} ${GLEW_LIBRARIES} - ${OPENGL_LIBRARIES} ${DEVICE_LIBS}) + ${OpenCV_LIBS} ${Boost_LIBRARIES} ${DEVICE_LIBS}) endif(VTK_QT_VERSION VERSION_GREATER "4") -if(OpenCV_VERSION VERSION_LESS "3") - add_definitions(-DOPENCV2) -endif(OpenCV_VERSION VERSION_LESS "3") - if(MSVC) - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/wd4819 /wd4996" ) + set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/wd4819 /wd4996" ) endif(MSVC) diff --git a/cmake/FindGlew.cmake b/cmake/FindGlew.cmake new file mode 100644 index 0000000..ca481a2 --- /dev/null +++ b/cmake/FindGlew.cmake @@ -0,0 +1,17 @@ +set(GLEW_FOUND) +set(GLEW_PATH) +set(GLEW_LIBRARY) + +if(UNIX) + find_path(GLEW_PATH glew.h) + if(EXISTS ${GLEW_PATH}) + find_library(GLEW_LIBRARY GLEW) + if(EXISTS ${GLEW_LIBRARY}) + set(GLEW_FOUND 1) + endif() + endif() +endif() + +mark_as_advanced(FORCE GLEW_FOUND) +mark_as_advanced(FORCE GLEW_PATH) +mark_as_advanced(FORCE GLEW_LIBRARY) diff --git a/slconfig.h.in b/slconfig.h.in index dc265fe..8428ded 100644 --- a/slconfig.h.in +++ b/slconfig.h.in @@ -3,5 +3,10 @@ #cmakedefine WITH_CAMERAIIDC #cmakedefine WITH_CAMERAIDSIMAGING #cmakedefine WITH_CAMERAPOINTGREY +#cmakedefine WITH_CAMERAV4L +#cmakedefine WITH_CAMERAOPENCV + #cmakedefine WITH_LC3000API -#cmakedefine WITH_LC4500API \ No newline at end of file +#cmakedefine WITH_LC4500API +#cmakedefine WITH_PROJECTOROPENGL +#cmakedefine WITH_PROJECTORQT \ No newline at end of file diff --git a/src/SLCalibrationDialog.cpp b/src/SLCalibrationDialog.cpp index 4b44710..4a2c735 100644 --- a/src/SLCalibrationDialog.cpp +++ b/src/SLCalibrationDialog.cpp @@ -7,11 +7,23 @@ #include #include "Camera.h" +#include "SLProjectorVirtual.h" + +#ifdef WITH_PROJECTOROPENGL #include "ProjectorOpenGL.h" +#endif + +#ifdef WITH_LC3000API #include "ProjectorLC3000.h" +#endif + +#ifdef WITH_LC4500API #include "ProjectorLC4500.h" -#include "SLProjectorVirtual.h" +#endif + +#ifdef WITH_PROJECTORQT #include "ProjectorQtGL.h" +#endif #include "CalibratorLocHom.h" #include "CalibratorRBF.h" @@ -52,16 +64,25 @@ SLCalibrationDialog::SLCalibrationDialog(SLStudio *parent) : QDialog(parent), ui // Initialize projector int screenNum = settings.value("projector/screenNumber", -1).toInt(); - if(screenNum >= 0) - projector = new ProjectorOpenGL(screenNum); - else if(screenNum == -1) + if(screenNum == -1) projector = new SLProjectorVirtual(screenNum); +#ifdef WITH_PROJECTOROPENGL + else if(screenNum >= 0) + projector = new ProjectorOpenGL(screenNum); +#endif +#ifdef WITH_LC3000API else if(screenNum == -2) projector = new ProjectorLC3000(0); +#endif +#ifdef WITH_LC4500API else if(screenNum == -3) projector = new ProjectorLC4500(0); +#endif +#ifdef WITH_PROJECTORQT else if(screenNum == -4) projector = new ProjectorQtGL(); +#endif + else std::cerr << "SLCalibrationDialog: invalid projector id " << screenNum << std::endl; diff --git a/src/SLPreferenceDialog.cpp b/src/SLPreferenceDialog.cpp index 73a5b4c..bdc9d67 100644 --- a/src/SLPreferenceDialog.cpp +++ b/src/SLPreferenceDialog.cpp @@ -1,7 +1,9 @@ #include "SLPreferenceDialog.h" #include "ui_SLPreferenceDialog.h" +#ifdef WITH_PROJECTOROPENGL #include "OpenGLContext.h" +#endif #include "Camera.h" #include "Codec.h" @@ -13,11 +15,14 @@ SLPreferenceDialog::SLPreferenceDialog(QWidget *parent) : QDialog(parent), ui(ne ui->setupUi(this); // Query projectors +#ifdef WITH_PROJECTOROPENGL vector screenList = OpenGLContext::GetScreenInfo(); for(unsigned int i=0; iprojectorComboBox->addItem(screenString, i); } +#endif + // Add virtual projector option ui->projectorComboBox->addItem("SLStudio Virtual Screen", -1); // Add LC3000 option @@ -28,7 +33,9 @@ SLPreferenceDialog::SLPreferenceDialog(QWidget *parent) : QDialog(parent), ui(ne #ifdef WITH_LC4500API ui->projectorComboBox->addItem("LC4500 API", -3); #endif - ui->projectorComboBox->addItem("Qt GL Window", -4); + #ifdef WITH_PROJECTORQT + ui->projectorComboBox->addItem("Qt GL Window", -4); + #endif // Query cameras vector< vector > interfaceCameraList = Camera::GetInterfaceCameraList(); diff --git a/src/SLScanWorker.cpp b/src/SLScanWorker.cpp index 54867f5..214945e 100644 --- a/src/SLScanWorker.cpp +++ b/src/SLScanWorker.cpp @@ -23,12 +23,23 @@ #include "CodecFastRatio.h" #include "CodecGrayCode.h" +#ifdef WITH_PROJECTOROPENGL #include "ProjectorOpenGL.h" +#endif + +#ifdef WITH_LC3000API #include "ProjectorLC3000.h" +#endif + +#ifdef WITH_LC4500API #include "ProjectorLC4500.h" +#endif -#include "SLProjectorVirtual.h" +#ifdef WITH_PROJECTORQT #include "ProjectorQtGL.h" +#endif + +#include "SLProjectorVirtual.h" #include "SLCameraVirtual.h" #include "SLPointCloudWidget.h" @@ -61,16 +72,24 @@ void SLScanWorker::setup(){ // Initialize projector int screenNum = settings.value("projector/screenNumber", -1).toInt(); - if(screenNum >= 0) - projector = new ProjectorOpenGL(screenNum); - else if(screenNum == -1) + if(screenNum == -1) projector = new SLProjectorVirtual(screenNum); +#ifdef WITH_PROJECTOROPENGL + else if(screenNum >= 0) + projector = new ProjectorOpenGL(screenNum); +#endif +#ifdef WITH_LC3000API else if(screenNum == -2) projector = new ProjectorLC3000(0); +#endif +#ifdef WITH_LC4500API else if(screenNum == -3) projector = new ProjectorLC4500(0); +#endif +#ifdef WITH_PROJECTORQT else if(screenNum == -4) projector = new ProjectorQtGL(); +#endif else std::cerr << "SLScanWorker: invalid projector id " << screenNum << std::endl; diff --git a/src/camera/CMakeLists.txt b/src/camera/CMakeLists.txt index 2a89501..4b9f56e 100644 --- a/src/camera/CMakeLists.txt +++ b/src/camera/CMakeLists.txt @@ -1,8 +1,6 @@ include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/camera) - - if(WITH_CAMERAXIMEA) include("${CMAKE_SOURCE_DIR}/cmake/FindXimea.cmake") if(XIMEA_FOUND) @@ -14,8 +12,8 @@ if(WITH_CAMERAXIMEA) endif() include_directories(${XIMEA_PATH}) add_library(XimeaCamera STATIC CameraXIMEA.cpp CameraXIMEA.h) - target_link_libraries(XimeaCamera ${XIMEA_LIBRARY}) - set(DEVICE_LIBS ${DEVICE_LIBS} XimeaCamera ${XIMEA_LIBRARY} PARENT_SCOPE) + add_definitions(-DWITH_CAMERAXIMEA) + set(DEVICE_LIBS ${DEVICE_LIBS} XimeaCamera ${IDS_LIBRARY} PARENT_SCOPE) else(XIMEA_FOUND) message(SEND_ERROR "Could not find Ximea camera support.") endif(XIMEA_FOUND) @@ -26,9 +24,39 @@ if(WITH_CAMERAIDSIMAGING) if(IDS_FOUND) include_directories(${IDS_PATH}) add_library(IdsCamera STATIC CameraIDSImaging.cpp CameraIDSImaging.h) - target_link_libraries(IdsCamera ${XIMEA_LIBRARY}) + add_definitions(-DWITH_CAMERAIDSIMAGING) set(DEVICE_LIBS ${DEVICE_LIBS} IdsCamera ${IDS_LIBRARY} PARENT_SCOPE) else(IDS_FOUND) message(SEND_ERROR "Could not find IDS uEye camera support.") endif(IDS_FOUND) -endif(WITH_CAMERAIDSIMAGING) \ No newline at end of file +endif(WITH_CAMERAIDSIMAGING) + +if(WITH_CAMERAIDC) + add_library(IdcCamera STATIC CameraIIDC.cpp CameraIIDC.h) + add_definitions(-DWITH_CAMERAIDC) + set(DEVICE_LIBS ${DEVICE_LIBS} IdcCamera PARENT_SCOPE) +endif(WITH_CAMERAIDC) + +if(WITH_CAMERAPOINTGREY) + include("${CMAKE_SOURCE_DIR}/cmake/FindPointGrey.cmake") + if(POINTGREY_FOUND) + include_directories(${POINTGREY_PATH}) + add_library(PointGreyCamera STATIC CameraPointGrey.cpp CameraPointGrey.h) + add_definitions(-DWITH_CAMERAPOINTGREY) + set(DEVICE_LIBS ${DEVICE_LIBS} PointGreyCamera ${POINTGREY_LIBRARY} PARENT_SCOPE) + else(POINTGREY_FOUND) + message(SEND_ERROR "Could not find PointGrey camera camera support.") + endif(POINTGREY_FOUND) +endif(WITH_CAMERAPOINTGREY) + +if(WITH_CAMERAV4L) + add_library(V4LCamera STATIC CameraV4L.cpp CameraV4L.cpp) + add_definitions(-DWITH_CAMERAV4L) + set(DEVICE_LIBS ${DEVICE_LIBS} V4LCamera PARENT_SCOPE) +endif(WITH_CAMERAV4L) + +if(WITH_CAMERAOPENCV) + add_library(OpenCvCamera STATIC CameraOpenCV.cpp CameraOpenCV.h) + add_definitions(-DWITH_CAMERAOPENCV) + set(DEVICE_LIBS ${DEVICE_LIBS} OpenCvCamera ${POINTGREY_LIBRARY} PARENT_SCOPE) +endif(WITH_CAMERAOPENCV) \ No newline at end of file diff --git a/src/camera/Camera.cpp b/src/camera/Camera.cpp index 970e6e5..6b70326 100644 --- a/src/camera/Camera.cpp +++ b/src/camera/Camera.cpp @@ -12,9 +12,9 @@ #ifdef WITH_CAMERAPOINTGREY #include "CameraPointGrey.h" #endif - -#include "CameraOpenCV.h" - +#ifdef WITH_CAMERAOPENCV + #include "CameraOpenCV.h" +#endif #ifdef WITH_CAMERAV4L #include "CameraV4L.h" #endif @@ -39,10 +39,10 @@ std::vector< std::vector > Camera::GetInterfaceCameraList(){ std::vector ptgreycameras = CameraPointGrey::getCameraList(); ret.push_back(ptgreycameras); #endif - +#ifdef WITH_CAMERAOPENCV std::vector cvcameras = CameraOpenCV::getCameraList(); ret.push_back(cvcameras); - +#endif #ifdef WITH_CAMERAV4L std::vector v4lcameras = CameraV4L::getCameraList(); ret.push_back(v4lcameras); @@ -76,11 +76,11 @@ Camera* Camera::NewCamera(unsigned int interfaceNum, unsigned int camNum, Camera if(interfaceNum == 0) return new CameraPointGrey(camNum, triggerMode); #endif - +#ifdef WITH_CAMERAOPENCV interfaceNum -= 1; if(interfaceNum == 0) return new CameraOpenCV(camNum); - +#endif #ifdef WITH_CAMERAV4L interfaceNum -= 1; if(interfaceNum == 0) diff --git a/src/projector/CMakeLists.txt b/src/projector/CMakeLists.txt index a383b73..785ca28 100644 --- a/src/projector/CMakeLists.txt +++ b/src/projector/CMakeLists.txt @@ -10,24 +10,44 @@ if(WITH_LC4500API) else() list(APPEND LC4500_SRC LC4500API/hid.Libusb.c) endif() - #message(status " :LC4500 SRC : ${LC4500_SRC}") add_library(LC4500Projector STATIC ${LC4500_SRC} LC4500API/API.h) - if(WIN32) - set(PROJ4500_LIBS LC4500Projector setupapi) - else(WIN32) - set(PROJ4500_LIBS LC4500Projector) - endif(WIN32) - - target_link_libraries(LC4500Projector) + if(WIN32) + set(PROJ4500_LIBS LC4500Projector setupapi) + else(WIN32) + set(PROJ4500_LIBS LC4500Projector) + endif(WIN32) + add_definitions(-DWITH_LC4500API) endif(WITH_LC4500API) if(WITH_LC3000API) list(APPEND LC3000_SRC ProjectorLC3000.cpp LC3000API/lcr_cmd.cpp LC3000API/lcr_packetizer.cpp LC3000API/tcp_client.cpp) add_library(LC3000Projector STATIC ${LC3000_SRC} LC3000API/lcr_cmd.h) - set(PROJ3000_LIBS LC3000Projector) - - target_link_libraries(LC3000Projector) + set(PROJ3000_LIBS LC3000Projector) + add_definitions(-DWITH_LC3000API) endif(WITH_LC3000API) -set(DEVICE_LIBS ${DEVICE_LIBS} ${PROJ4500_LIBS} ${PROJ3000_LIBS} PARENT_SCOPE) \ No newline at end of file + +set(DEVICE_LIBS ${DEVICE_LIBS} ${PROJ4500_LIBS} ${PROJ3000_LIBS} PARENT_SCOPE) + +if(WITH_PROJECTOROPENGL) + # Compile with system dependent OpenGL Context code + if(APPLE) + set(OPENGL_CONTEXT_CPP "src/projector/OpenGLContext.Mac.mm") + elseif() + set(OPENGL_CONTEXT_CPP "src/projector/OpenGLContext.Win.cpp") + add_definitions(-DWIN32 -D_UNICODE -DUNICODE) + else() + set(OPENGL_CONTEXT_CPP "src/projector/OpenGLContext.Unix.cpp") + endif() + + add_library(OpenGlProjector STATIC ProjectorOpenGL.cpp ${OPENGL_CONTEXT_CPP} ProjectorOpenGL.h) + add_definitions(-DWITH_PROJECTOROPENGL) + set(DEVICE_LIBS ${DEVICE_LIBS} ${GLEW_LIBRARIES} PARENT_SCOPE) +endif(WITH_PROJECTOROPENGL) + +if(WITH_PROJECTORQT) + add_library(QtProjector STATIC ProjectorQtGL.cpp ProjectorQtGL.h OpenGLContext.h) + add_definitions(-DWITH_PROJECTORQT) + set(DEVICE_LIBS ${DEVICE_LIBS} ${GLEW_LIBRARIES} PARENT_SCOPE) +endif(WITH_PROJECTORQT) \ No newline at end of file From 57e9db2e1e8af63857711ee3de6dc6c319e1a10a Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Thu, 8 Sep 2016 10:47:54 +0200 Subject: [PATCH 11/33] V4L and OpenCV cameras so not depend on Qt --- CMakeLists.txt | 18 +++++++++++++----- src/camera/CMakeLists.txt | 33 +++++++++++++++++++-------------- src/camera/CameraOpenCV.cpp | 20 +++++++++----------- src/camera/CameraOpenCV.h | 2 +- src/camera/CameraV4L.cpp | 13 +++++++------ src/projector/CMakeLists.txt | 27 ++++++++++++++++----------- 6 files changed, 65 insertions(+), 48 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ba1643..525015e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ project(slstudio) find_package(PCL REQUIRED) find_package(VTK REQUIRED) find_package(OpenCV REQUIRED) -find_package(Boost 1.47 COMPONENTS filesystem thread chrono REQUIRED) +find_package(Boost 1.47 COMPONENTS filesystem thread timer chrono REQUIRED) find_package(Glew REQUIRED) find_package(OpenGL REQUIRED) @@ -55,7 +55,6 @@ option(WITH_LC4500API "Use LightCrafter 4500 projector" ON) option(WITH_PROJECTOROPENGL "Use OpenGL projector" ON) option(WITH_PROJECTORQT "Use Qt projector" ON) - #Set source file set file(GLOB UI_FILES src/SLStudio.ui src/SLPreferenceDialog.ui @@ -166,12 +165,18 @@ file(GLOB CPP_FILES src/main.cpp file(GLOB RC_FILES src/SLResources.qrc) -set(DEVICE_LIBS) +set(PROJECTOR_DEVICE_LIBS) +set(CAMERA_DEVICE_LIBS) +set(PROJECTOR_DEVICE_DEFS) +set(CAMERA_DEVICE_DEFS) #Device Options - camera add_subdirectory(${PROJECT_SOURCE_DIR}/src/camera) #Device Options - projector add_subdirectory(${PROJECT_SOURCE_DIR}/src/projector) +add_definitions(${CAMERA_DEVICE_DEFS}) +add_definitions(${PROJECTOR_DEVICE_DEFS}) + if(VTK_QT_VERSION VERSION_GREATER "4") # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) @@ -181,8 +186,10 @@ if(VTK_QT_VERSION VERSION_GREATER "4") qt5_add_resources(RCC_SRCS ${RC_FILES}) add_executable(slstudio ${CPP_FILES} ${UISrcs} ${H_FILES} ${RCC_SRCS}) qt5_use_modules(slstudio Core Gui Widgets Test) + add_definitions(${COMPILER_DEFINES}) target_link_libraries(slstudio ${VTK_LIBRARIES} ${PCL_LIBRARIES} - ${OpenCV_LIBS} ${Boost_LIBRARIES} ${DEVICE_LIBS}) + ${OpenCV_LIBS} ${Boost_LIBRARIES} ${CAMERA_DEVICE_LIBS} + ${PROJECTOR_DEVICE_LIBS}) else(VTK_QT_VERSION VERSION_GREATER "4") #Legacy qt4 support include(${QT_USE_FILE}) @@ -193,7 +200,8 @@ else(VTK_QT_VERSION VERSION_GREATER "4") add_executable(slstudio ${CPP_FILES} ${UISrcs} ${MOCSrcs} ${RCC_SRCS}) target_link_libraries(slstudio Qt4::QtTest ${VTK_LIBRARIES} ${PCL_LIBRARIES} - ${OpenCV_LIBS} ${Boost_LIBRARIES} ${DEVICE_LIBS}) + ${OpenCV_LIBS} ${Boost_LIBRARIES} ${CAMERA_DEVICE_LIBS} + ${PROJECTOR_DEVICE_LIBS} ) endif(VTK_QT_VERSION VERSION_GREATER "4") if(MSVC) diff --git a/src/camera/CMakeLists.txt b/src/camera/CMakeLists.txt index 4b9f56e..d750328 100644 --- a/src/camera/CMakeLists.txt +++ b/src/camera/CMakeLists.txt @@ -1,5 +1,7 @@ include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/camera) +set(DEVICE_LIBS) +set(DEVICE_DEFS) if(WITH_CAMERAXIMEA) include("${CMAKE_SOURCE_DIR}/cmake/FindXimea.cmake") @@ -12,8 +14,8 @@ if(WITH_CAMERAXIMEA) endif() include_directories(${XIMEA_PATH}) add_library(XimeaCamera STATIC CameraXIMEA.cpp CameraXIMEA.h) - add_definitions(-DWITH_CAMERAXIMEA) - set(DEVICE_LIBS ${DEVICE_LIBS} XimeaCamera ${IDS_LIBRARY} PARENT_SCOPE) + set(DEVICE_LIBS ${DEVICE_LIBS} XimeaCamera ${IDS_LIBRARY}) + set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_CAMERAXIMEA) else(XIMEA_FOUND) message(SEND_ERROR "Could not find Ximea camera support.") endif(XIMEA_FOUND) @@ -24,8 +26,8 @@ if(WITH_CAMERAIDSIMAGING) if(IDS_FOUND) include_directories(${IDS_PATH}) add_library(IdsCamera STATIC CameraIDSImaging.cpp CameraIDSImaging.h) - add_definitions(-DWITH_CAMERAIDSIMAGING) - set(DEVICE_LIBS ${DEVICE_LIBS} IdsCamera ${IDS_LIBRARY} PARENT_SCOPE) + set(DEVICE_LIBS ${DEVICE_LIBS} IdsCamera ${IDS_LIBRARY}) + set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_CAMERAIDSIMAGING) else(IDS_FOUND) message(SEND_ERROR "Could not find IDS uEye camera support.") endif(IDS_FOUND) @@ -33,8 +35,8 @@ endif(WITH_CAMERAIDSIMAGING) if(WITH_CAMERAIDC) add_library(IdcCamera STATIC CameraIIDC.cpp CameraIIDC.h) - add_definitions(-DWITH_CAMERAIDC) - set(DEVICE_LIBS ${DEVICE_LIBS} IdcCamera PARENT_SCOPE) + set(DEVICE_LIBS ${DEVICE_LIBS} IdcCamera) + set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_CAMERAIDC) endif(WITH_CAMERAIDC) if(WITH_CAMERAPOINTGREY) @@ -42,21 +44,24 @@ if(WITH_CAMERAPOINTGREY) if(POINTGREY_FOUND) include_directories(${POINTGREY_PATH}) add_library(PointGreyCamera STATIC CameraPointGrey.cpp CameraPointGrey.h) - add_definitions(-DWITH_CAMERAPOINTGREY) - set(DEVICE_LIBS ${DEVICE_LIBS} PointGreyCamera ${POINTGREY_LIBRARY} PARENT_SCOPE) + set(DEVICE_LIBS ${DEVICE_LIBS} PointGreyCamera ${POINTGREY_LIBRARY}) + set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_CAMERAPOINTGREY) else(POINTGREY_FOUND) message(SEND_ERROR "Could not find PointGrey camera camera support.") endif(POINTGREY_FOUND) endif(WITH_CAMERAPOINTGREY) if(WITH_CAMERAV4L) - add_library(V4LCamera STATIC CameraV4L.cpp CameraV4L.cpp) - add_definitions(-DWITH_CAMERAV4L) - set(DEVICE_LIBS ${DEVICE_LIBS} V4LCamera PARENT_SCOPE) + add_library(V4LCamera STATIC CameraV4L.cpp CameraV4L.h) + set(DEVICE_LIBS ${DEVICE_LIBS} V4LCamera) + set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_CAMERAV4L) endif(WITH_CAMERAV4L) if(WITH_CAMERAOPENCV) add_library(OpenCvCamera STATIC CameraOpenCV.cpp CameraOpenCV.h) - add_definitions(-DWITH_CAMERAOPENCV) - set(DEVICE_LIBS ${DEVICE_LIBS} OpenCvCamera ${POINTGREY_LIBRARY} PARENT_SCOPE) -endif(WITH_CAMERAOPENCV) \ No newline at end of file + set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_CAMERAOPENCV) + set(DEVICE_LIBS ${DEVICE_LIBS} OpenCvCamera) +endif(WITH_CAMERAOPENCV) + +set(CAMERA_DEVICE_DEFS ${DEVICE_DEFS} PARENT_SCOPE) +set(CAMERA_DEVICE_LIBS ${DEVICE_LIBS} PARENT_SCOPE) \ No newline at end of file diff --git a/src/camera/CameraOpenCV.cpp b/src/camera/CameraOpenCV.cpp index a251398..a698e70 100644 --- a/src/camera/CameraOpenCV.cpp +++ b/src/camera/CameraOpenCV.cpp @@ -7,7 +7,7 @@ #include #include -#include +#include vector CameraOpenCV::getCameraList() { @@ -60,16 +60,15 @@ void CameraOpenCV::startCapture() { cv::Mat frame, out; m_videoCap >> frame; - QElapsedTimer timer; - timer.start(); - m_grabTimeMS = 0; + m_grabTimeNS = 0; for (int i = 0; i < 30; ++i) { + boost::timer::cpu_timer timer; m_videoCap >> frame; - m_grabTimeMS += timer.restart(); + m_grabTimeNS += timer.elapsed().wall; } - m_grabTimeMS /= 30; - cout << "Measured grab time: " << m_grabTimeMS << endl; + m_grabTimeNS /= 30; + cout << "Measured grab time: " << m_grabTimeNS << endl; cv::cvtColor(frame, out, cv::COLOR_BGR2GRAY); m_bytes = out.step * out.rows; } @@ -92,13 +91,12 @@ CameraFrame CameraOpenCV::getFrame(){ } cv::Mat cvframe, out; - QElapsedTimer timer; - timer.start(); for (int i = 0; i < 30; ++i) { + boost::timer::cpu_timer timer; m_videoCap.grab(); - qint64 t = timer.restart(); - if (t >= 0.3 * m_grabTimeMS) break; + boost::timer::nanosecond_type t = timer.elapsed().wall; + if (t >= 0.3 * m_grabTimeNS) break; //cout << "Time to grab frame to short (" << t << "), retaking image ..." << endl; } bool ret = m_videoCap.retrieve(cvframe); diff --git a/src/camera/CameraOpenCV.h b/src/camera/CameraOpenCV.h index d0dd916..365d8b7 100644 --- a/src/camera/CameraOpenCV.h +++ b/src/camera/CameraOpenCV.h @@ -28,7 +28,7 @@ class CameraOpenCV : public Camera { ~CameraOpenCV(); private: - size_t m_grabTimeMS; + size_t m_grabTimeNS; size_t m_devNum; size_t m_bytes; cv::VideoCapture m_videoCap; diff --git a/src/camera/CameraV4L.cpp b/src/camera/CameraV4L.cpp index 4fae5a1..16ad443 100644 --- a/src/camera/CameraV4L.cpp +++ b/src/camera/CameraV4L.cpp @@ -23,9 +23,8 @@ #include #include -#include -#include - +#include +#include #define CLEAR(x) memset(&(x), 0, sizeof(x)) @@ -432,12 +431,14 @@ vector CameraV4L::getCameraList() vector ret; for (unsigned int i=0; i<16; i++) { - QString devName = "/dev/video" + QString::number(i); + + boost::filesystem::path devName(std::string("/dev/video") + + boost::lexical_cast(i)); - if (QFileInfo(devName).exists()) { + if (boost::filesystem::exists(devName)) { CameraInfo info; info.vendor = "V4L"; - info.model = devName.toStdString(); + info.model = devName.string(); info.busID = i; ret.push_back(info); } diff --git a/src/projector/CMakeLists.txt b/src/projector/CMakeLists.txt index 785ca28..0c7cfaf 100644 --- a/src/projector/CMakeLists.txt +++ b/src/projector/CMakeLists.txt @@ -1,5 +1,7 @@ include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/projector) +set(DEVICE_LIBS) +set(DEVICE_DEFS) if(WITH_LC4500API) list(APPEND LC4500_SRC ProjectorLC4500.cpp LC4500API/API.cpp LC4500API/usb.cpp) @@ -11,13 +13,13 @@ if(WITH_LC4500API) list(APPEND LC4500_SRC LC4500API/hid.Libusb.c) endif() add_library(LC4500Projector STATIC ${LC4500_SRC} LC4500API/API.h) + set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_LC4500API) if(WIN32) set(PROJ4500_LIBS LC4500Projector setupapi) else(WIN32) set(PROJ4500_LIBS LC4500Projector) endif(WIN32) - add_definitions(-DWITH_LC4500API) endif(WITH_LC4500API) if(WITH_LC3000API) @@ -25,29 +27,32 @@ if(WITH_LC3000API) LC3000API/lcr_packetizer.cpp LC3000API/tcp_client.cpp) add_library(LC3000Projector STATIC ${LC3000_SRC} LC3000API/lcr_cmd.h) set(PROJ3000_LIBS LC3000Projector) - add_definitions(-DWITH_LC3000API) + set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_LC3000API) endif(WITH_LC3000API) -set(DEVICE_LIBS ${DEVICE_LIBS} ${PROJ4500_LIBS} ${PROJ3000_LIBS} PARENT_SCOPE) +set(DEVICE_LIBS ${DEVICE_LIBS} ${PROJ4500_LIBS} ${PROJ3000_LIBS}) if(WITH_PROJECTOROPENGL) # Compile with system dependent OpenGL Context code if(APPLE) - set(OPENGL_CONTEXT_CPP "src/projector/OpenGLContext.Mac.mm") + set(OPENGL_CONTEXT_CPP OpenGLContext.Mac.mm) elseif() - set(OPENGL_CONTEXT_CPP "src/projector/OpenGLContext.Win.cpp") + set(OPENGL_CONTEXT_CPP OpenGLContext.Win.cpp) add_definitions(-DWIN32 -D_UNICODE -DUNICODE) else() - set(OPENGL_CONTEXT_CPP "src/projector/OpenGLContext.Unix.cpp") + set(OPENGL_CONTEXT_CPP OpenGLContext.Unix.cpp) endif() add_library(OpenGlProjector STATIC ProjectorOpenGL.cpp ${OPENGL_CONTEXT_CPP} ProjectorOpenGL.h) - add_definitions(-DWITH_PROJECTOROPENGL) - set(DEVICE_LIBS ${DEVICE_LIBS} ${GLEW_LIBRARIES} PARENT_SCOPE) + set(DEVICE_LIBS ${DEVICE_LIBS} OpenGlProjector ${OPENGL_LIBRARIES}) + set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_PROJECTOROPENGL) endif(WITH_PROJECTOROPENGL) if(WITH_PROJECTORQT) add_library(QtProjector STATIC ProjectorQtGL.cpp ProjectorQtGL.h OpenGLContext.h) - add_definitions(-DWITH_PROJECTORQT) - set(DEVICE_LIBS ${DEVICE_LIBS} ${GLEW_LIBRARIES} PARENT_SCOPE) -endif(WITH_PROJECTORQT) \ No newline at end of file + set(DEVICE_LIBS ${DEVICE_LIBS} QtProjector) + set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_PROJECTORQT) +endif(WITH_PROJECTORQT) + +set(PROJECTOR_DEVICE_LIBS ${DEVICE_LIBS} PARENT_SCOPE) +set(PROJECTOR_DEVICE_DEFS ${DEVICE_DEFS} PARENT_SCOPE) \ No newline at end of file From 869759c1e17bd552561e8f9b56d1303fadac0a52 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Thu, 8 Sep 2016 11:24:48 +0200 Subject: [PATCH 12/33] Move codecs, triangulation and calibration to dedicated algorithms library --- CMakeLists.txt | 59 ++++++---------------------------------------- src/CMakeLists.txt | 57 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 52 deletions(-) create mode 100644 src/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 525015e..88acc4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,8 @@ find_package(OpenGL REQUIRED) if(VTK_QT_VERSION VERSION_GREATER "4") find_package(Qt5 COMPONENTS Core Gui Test Widgets OpenGL REQUIRED) + # Instruct CMake to run moc automatically when needed. + set(CMAKE_AUTOMOC ON) else(VTK_QT_VERSION VERSION_GREATER "4") #Legacy qt4 support find_package(Qt4 REQUIRED) @@ -81,31 +83,6 @@ file(GLOB H_FILES ${PROJECT_BINARY_DIR}/cmakeconfig.h src/SLTriangulatorWorker.h src/SLTraceWidget.h src/camera/Camera.h - src/projector/Projector.h - src/codec/Codec.h - src/codec/phaseunwrap.h - src/codec/phasecorr.h - src/codec/pstools.h - src/codec/CodecCalibration.h - src/codec/CodecPhaseShift2x3.h - src/codec/CodecPhaseShiftDescatter.h - src/codec/CodecPhaseShift3.h - src/codec/CodecPhaseShift3FastWrap.h - src/codec/CodecPhaseShift3Unwrap.h - src/codec/CodecPhaseShift4.h - src/codec/CodecGrayCode.h - src/codec/CodecPhaseShift2p1.h - src/codec/CodecFastRatio.h - src/codec/CodecPhaseShiftModulated.h - src/codec/CodecPhaseShiftMicro.h - src/codec/CodecPhaseShiftNStep.h - src/triangulator/Triangulator.h - src/calibrator/CalibrationData.h - src/calibrator/Calibrator.h - src/calibrator/CalibratorLocHom.h - src/calibrator/CalibratorRBF.h - src/calibrator/CThinPlateSpline.h - src/calibrator/RBFInterpolator.h src/tracker/Tracker.h src/tracker/TrackerICP.h src/tracker/TrackerNDT.h @@ -134,28 +111,6 @@ file(GLOB CPP_FILES src/main.cpp src/SLTriangulatorWorker.cpp src/SLTraceWidget.cpp src/camera/Camera.cpp - src/codec/phaseunwrap.cpp - src/codec/phasecorr.cpp - src/codec/CodecCalibration.cpp - src/codec/CodecPhaseShift2x3.cpp - src/codec/CodecPhaseShiftDescatter.cpp - src/codec/CodecPhaseShift3.cpp - src/codec/CodecPhaseShift3FastWrap.cpp - src/codec/CodecPhaseShift3Unwrap.cpp - src/codec/CodecPhaseShift4.cpp - src/codec/CodecFastRatio.cpp - src/codec/CodecPhaseShift2p1.cpp - src/codec/CodecPhaseShiftModulated.cpp - src/codec/CodecPhaseShiftMicro.cpp - src/codec/CodecGrayCode.cpp - src/codec/pstools.cpp - src/codec/CodecPhaseShiftNStep.cpp - src/triangulator/Triangulator.cpp - src/calibrator/CalibrationData.cpp - src/calibrator/CalibratorLocHom.cpp - src/calibrator/CalibratorRBF.cpp - src/calibrator/CThinPlateSpline.cpp - src/calibrator/RBFInterpolator.cpp src/cvtools.cpp src/tracker/TrackerICP.cpp src/tracker/TrackerNDT.cpp @@ -174,20 +129,20 @@ add_subdirectory(${PROJECT_SOURCE_DIR}/src/camera) #Device Options - projector add_subdirectory(${PROJECT_SOURCE_DIR}/src/projector) +#Algorithms library +add_subdirectory(${PROJECT_SOURCE_DIR}/src) + add_definitions(${CAMERA_DEVICE_DEFS}) add_definitions(${PROJECTOR_DEVICE_DEFS}) if(VTK_QT_VERSION VERSION_GREATER "4") - # Instruct CMake to run moc automatically when needed. - set(CMAKE_AUTOMOC ON) - qt5_wrap_ui(UISrcs ${UI_FILES}) # CMAKE_AUTOMOC in ON so the MocHdrs will be automatically wrapped. qt5_add_resources(RCC_SRCS ${RC_FILES}) add_executable(slstudio ${CPP_FILES} ${UISrcs} ${H_FILES} ${RCC_SRCS}) qt5_use_modules(slstudio Core Gui Widgets Test) add_definitions(${COMPILER_DEFINES}) - target_link_libraries(slstudio ${VTK_LIBRARIES} ${PCL_LIBRARIES} + target_link_libraries(slstudio slalgorithms ${VTK_LIBRARIES} ${PCL_LIBRARIES} ${OpenCV_LIBS} ${Boost_LIBRARIES} ${CAMERA_DEVICE_LIBS} ${PROJECTOR_DEVICE_LIBS}) else(VTK_QT_VERSION VERSION_GREATER "4") @@ -199,7 +154,7 @@ else(VTK_QT_VERSION VERSION_GREATER "4") qt4_add_resources(RCC_SRCS ${RC_FILES}) add_executable(slstudio ${CPP_FILES} ${UISrcs} ${MOCSrcs} ${RCC_SRCS}) - target_link_libraries(slstudio Qt4::QtTest ${VTK_LIBRARIES} ${PCL_LIBRARIES} + target_link_libraries(slstudio slalgorithms Qt4::QtTest ${VTK_LIBRARIES} ${PCL_LIBRARIES} ${OpenCV_LIBS} ${Boost_LIBRARIES} ${CAMERA_DEVICE_LIBS} ${PROJECTOR_DEVICE_LIBS} ) endif(VTK_QT_VERSION VERSION_GREATER "4") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..debb78f --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,57 @@ +set(HEADERS + codec/Codec.h + codec/phaseunwrap.h + codec/phasecorr.h + codec/pstools.h + codec/CodecCalibration.h + codec/CodecPhaseShift2x3.h + codec/CodecPhaseShiftDescatter.h + codec/CodecPhaseShift3.h + codec/CodecPhaseShift3FastWrap.h + codec/CodecPhaseShift3Unwrap.h + codec/CodecPhaseShift4.h + codec/CodecGrayCode.h + codec/CodecPhaseShift2p1.h + codec/CodecFastRatio.h + codec/CodecPhaseShiftModulated.h + codec/CodecPhaseShiftMicro.h + codec/CodecPhaseShiftNStep.h + triangulator/Triangulator.h + calibrator/CalibrationData.h + calibrator/Calibrator.h + calibrator/CalibratorLocHom.h + calibrator/CalibratorRBF.h + calibrator/CThinPlateSpline.h + calibrator/RBFInterpolator.h +) + +set(SOURCES + codec/phaseunwrap.cpp + codec/phasecorr.cpp + codec/CodecCalibration.cpp + codec/CodecPhaseShift2x3.cpp + codec/CodecPhaseShiftDescatter.cpp + codec/CodecPhaseShift3.cpp + codec/CodecPhaseShift3FastWrap.cpp + codec/CodecPhaseShift3Unwrap.cpp + codec/CodecPhaseShift4.cpp + codec/CodecFastRatio.cpp + codec/CodecPhaseShift2p1.cpp + codec/CodecPhaseShiftModulated.cpp + codec/CodecPhaseShiftMicro.cpp + codec/CodecGrayCode.cpp + codec/pstools.cpp + codec/CodecPhaseShiftNStep.cpp + triangulator/Triangulator.cpp + calibrator/CalibrationData.cpp + calibrator/CalibratorLocHom.cpp + calibrator/CalibratorRBF.cpp + calibrator/CThinPlateSpline.cpp + calibrator/RBFInterpolator.cpp +) + +add_library(slalgorithms SHARED ${HEADERS} ${SOURCES}) +qt5_use_modules(slalgorithms Core) +target_link_libraries(slalgorithms + ${OpenCV_LIBS} +) From 9f2bb6391ed800435e4967c7b8497bb954aeb772 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Thu, 8 Sep 2016 11:27:20 +0200 Subject: [PATCH 13/33] Remove unused boost dependencies --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 88acc4f..1d85baa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ project(slstudio) find_package(PCL REQUIRED) find_package(VTK REQUIRED) find_package(OpenCV REQUIRED) -find_package(Boost 1.47 COMPONENTS filesystem thread timer chrono REQUIRED) +find_package(Boost 1.47 COMPONENTS filesystem timer REQUIRED) find_package(Glew REQUIRED) find_package(OpenGL REQUIRED) From 2dff6d9349a534b8260b7c35826e9b23367b6762 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Mon, 12 Sep 2016 20:38:30 +0200 Subject: [PATCH 14/33] Algorithms do not depend on Qt --- src/CMakeLists.txt | 2 +- src/SLCalibrationDialog.cpp | 9 ++++--- src/SLCalibrationDialog.h | 5 ++-- src/SLStudio.cpp | 4 +-- src/calibrator/CalibrationData.cpp | 41 +++++++++++++---------------- src/calibrator/CalibrationData.h | 13 +++++---- src/calibrator/Calibrator.h | 24 +++++++++++------ src/calibrator/CalibratorLocHom.cpp | 14 ++-------- src/calibrator/CalibratorLocHom.h | 3 +-- src/calibrator/CalibratorRBF.cpp | 14 ++-------- src/calibrator/CalibratorRBF.h | 3 +-- 11 files changed, 58 insertions(+), 74 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index debb78f..d73c45d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -51,7 +51,7 @@ set(SOURCES ) add_library(slalgorithms SHARED ${HEADERS} ${SOURCES}) -qt5_use_modules(slalgorithms Core) +#qt5_use_modules(slalgorithms Core) target_link_libraries(slalgorithms ${OpenCV_LIBS} ) diff --git a/src/SLCalibrationDialog.cpp b/src/SLCalibrationDialog.cpp index 4a2c735..7a44071 100644 --- a/src/SLCalibrationDialog.cpp +++ b/src/SLCalibrationDialog.cpp @@ -103,7 +103,7 @@ SLCalibrationDialog::SLCalibrationDialog(SLStudio *parent) : QDialog(parent), ui // Create calibrator calibrator = new CalibratorLocHom(screenCols, screenRows); - connect(calibrator, SIGNAL(newSequenceResult(cv::Mat, unsigned int, bool)), this, SLOT(onNewSequenceResult(cv::Mat,uint,bool))); + calibrator->setObserver(this); // Upload patterns to projector/GPU for(unsigned int i=0; igetNPatterns(); i++){ @@ -246,7 +246,10 @@ void SLCalibrationDialog::on_calibrateButton_clicked(){ } // Perform calibration - calib = calibrator->calibrate(); + unsigned int checkerSize = ui->checkerSizeBox->value(); + unsigned int checkerRows = ui->checkerRowsBox->value(); + unsigned int checkerCols = ui->checkerColsBox->value(); + calib = calibrator->calibrate(checkerSize, checkerRows, checkerCols); // Re-enable interface elements ui->calibrateButton->setEnabled(true); @@ -285,7 +288,7 @@ void SLCalibrationDialog::on_saveButton_clicked(){ } -void SLCalibrationDialog::onNewSequenceResult(cv::Mat img, unsigned int idx, bool success){ +void SLCalibrationDialog::newSequenceResult(cv::Mat img, unsigned int idx, bool success){ // Skip non-active frame sequences int idxListView = activeFrameSeqs[idx]; diff --git a/src/SLCalibrationDialog.h b/src/SLCalibrationDialog.h index 0c41e44..ac9bb9c 100644 --- a/src/SLCalibrationDialog.h +++ b/src/SLCalibrationDialog.h @@ -21,7 +21,7 @@ namespace Ui { class SLCalibrationDialog; } -class SLCalibrationDialog : public QDialog { +class SLCalibrationDialog : public QDialog, public CalibratorObserver { Q_OBJECT public: @@ -34,11 +34,12 @@ class SLCalibrationDialog : public QDialog { void on_calibrateButton_clicked(); void on_listWidget_itemSelectionChanged(); void on_saveButton_clicked(); - void onNewSequenceResult(cv::Mat img, unsigned int idx, bool success); + void newSequenceResult(cv::Mat img, unsigned int idx, bool success); virtual void reject() {close();} signals: void newCalibrationSaved(CalibrationData _calib); + private: Ui::SLCalibrationDialog *ui; Camera *camera; diff --git a/src/SLStudio.cpp b/src/SLStudio.cpp index c3983fb..681b5ba 100644 --- a/src/SLStudio.cpp +++ b/src/SLStudio.cpp @@ -267,7 +267,7 @@ void SLStudio::onActionLoadCalibration(){ QString fileName = QFileDialog::getOpenFileName(this, "Choose calibration file", QString(), "*.xml"); if(!(fileName.length() == 0)){ CalibrationData calibration; - calibration.load(fileName); + calibration.load(fileName.toStdString()); calibration.save("calibration.xml"); } } @@ -289,7 +289,7 @@ void SLStudio::onActionExportCalibration(){ QString type = info.suffix(); if(type == "") fileName.append(selectedFilter.remove(0,1)); - calibration.save(fileName); + calibration.save(fileName.toStdString()); } } diff --git a/src/calibrator/CalibrationData.cpp b/src/calibrator/CalibrationData.cpp index c946f2d..5d8a9cd 100644 --- a/src/calibrator/CalibrationData.cpp +++ b/src/calibrator/CalibrationData.cpp @@ -1,8 +1,6 @@ #include "CalibrationData.h" -#include -#include -#include +#include #include #include @@ -22,21 +20,18 @@ CalibrationData::CalibrationData(cv::Matx33f _Kc, cv::Vec _kc, double } -bool CalibrationData::load(const QString& filename){ - QFileInfo info(filename); - // QString type = info.suffix(); - - if(info.exists() && info.suffix()=="xml") +bool CalibrationData::load(const std::string& filename){ + if(boost::filesystem::exists(filename) && + boost::filesystem::path(filename).extension()=="xml") { return loadXML(filename); - else { - std::cerr << "CalibrationData error: no such .xml file: " << filename.toStdString() << std::endl; + } else { + std::cerr << "CalibrationData error: no such .xml file: " << filename << std::endl; return false; } } -bool CalibrationData::save(const QString& filename){ - QFileInfo info(filename); - QString type = info.suffix(); +bool CalibrationData::save(const std::string& filename){ + std::string type = boost::filesystem::path(filename).extension().string(); if (type=="xml"){ return saveXML(filename); @@ -45,18 +40,18 @@ bool CalibrationData::save(const QString& filename){ } else if (type=="m"){ return saveMatlab(filename); } else { - std::cerr << "CalibrationData error save: unknown file extension: " << type.toStdString() << std::endl; + std::cerr << "CalibrationData error save: unknown file extension: " << type << std::endl; return false; } return false; } -bool CalibrationData::loadXML(const QString& filename){ - cv::FileStorage fs(filename.toStdString(), cv::FileStorage::READ); // +bool CalibrationData::loadXML(const std::string& filename){ + cv::FileStorage fs(filename, cv::FileStorage::READ); // if (!fs.isOpened()) { - std::cerr << "CalibrationData error: could not open file " << filename.toStdString() << std::endl; + std::cerr << "CalibrationData error: could not open file " << filename << std::endl; return false; } @@ -82,10 +77,10 @@ bool CalibrationData::loadXML(const QString& filename){ return true; } -bool CalibrationData::saveSLCALIB(const QString& filename){ +bool CalibrationData::saveSLCALIB(const std::string& filename){ - FILE * fp = fopen(qPrintable(filename), "w"); + FILE * fp = fopen(filename.c_str(), "w"); if (!fp) return false; @@ -108,8 +103,8 @@ bool CalibrationData::saveSLCALIB(const QString& filename){ } -bool CalibrationData::saveXML(const QString& filename){ - cv::FileStorage fs(filename.toStdString(), cv::FileStorage::WRITE); +bool CalibrationData::saveXML(const std::string& filename){ + cv::FileStorage fs(filename, cv::FileStorage::WRITE); if (!fs.isOpened()) return false; @@ -128,9 +123,9 @@ bool CalibrationData::saveXML(const QString& filename){ return true; } -bool CalibrationData::saveMatlab(const QString& filename){ +bool CalibrationData::saveMatlab(const std::string& filename){ - std::ofstream file(qPrintable(filename)); + std::ofstream file(filename); if (!file) return false; diff --git a/src/calibrator/CalibrationData.h b/src/calibrator/CalibrationData.h index 89616cd..5caa729 100644 --- a/src/calibrator/CalibrationData.h +++ b/src/calibrator/CalibrationData.h @@ -1,7 +1,6 @@ #ifndef CALIBRATIONDATA_H #define CALIBRATIONDATA_H -#include #include class CalibrationData{ @@ -10,12 +9,12 @@ class CalibrationData{ CalibrationData(cv::Matx33f _Kc, cv::Vec _kc, double _cam_error, cv::Matx33f _Kp, cv::Vec _kp, double _proj_error, cv::Matx33f _Rp, cv::Vec3f _Tp, double _stereo_error); //CalibrationData(const QString& filename){load(filename);} - bool load(const QString& filename); - bool save(const QString& filename); - bool loadXML(const QString& filename); - bool saveXML(const QString& filename); - bool saveMatlab(const QString& filename); - bool saveSLCALIB(const QString& filename); + bool load(const std::string& filename); + bool save(const std::string& filename); + bool loadXML(const std::string& filename); + bool saveXML(const std::string& filename); + bool saveMatlab(const std::string& filename); + bool saveSLCALIB(const std::string& filename); void print(std::ostream &stream); cv::Matx33f Kc; // Intrinsic camera matrix diff --git a/src/calibrator/Calibrator.h b/src/calibrator/Calibrator.h index 2241378..fcbe856 100644 --- a/src/calibrator/Calibrator.h +++ b/src/calibrator/Calibrator.h @@ -1,26 +1,34 @@ #ifndef CALIBRATOR_H #define CALIBRATOR_H -#include - #include #include "CalibrationData.h" using namespace std; -class Calibrator : public QObject { - Q_OBJECT +class CalibratorObserver { +public: + virtual void newSequenceResult(cv::Mat img, unsigned int idx, bool success) = 0; +}; + +class Calibrator { public: - Calibrator(unsigned int _screenCols, unsigned int _screenRows) : screenCols(_screenCols), screenRows(_screenRows), N(0){} + Calibrator(unsigned int _screenCols, unsigned int _screenRows) : observer(0), screenCols(_screenCols), screenRows(_screenRows), N(0){} virtual unsigned int getNPatterns(){return N;} virtual cv::Mat getCalibrationPattern(unsigned int depth){return patterns[depth];} virtual void addFrameSequence(std::vector frameSeq){frameSeqs.push_back(frameSeq);} virtual void reset(){frameSeqs.clear();} - virtual CalibrationData calibrate() = 0; + virtual CalibrationData calibrate(const int checkerSize, const int checkerRows, const int checkerCols) = 0; virtual ~Calibrator(){} - signals: - void newSequenceResult(cv::Mat img, unsigned int idx, bool success); + void setObserver(CalibratorObserver* newObserver){observer = newObserver;} + protected: + void newSequenceResult(cv::Mat img, unsigned int idx, bool success){ + if (observer) + observer->newSequenceResult(img, idx, success); + } + + CalibratorObserver* observer; unsigned int screenCols, screenRows; unsigned int N; vector patterns; diff --git a/src/calibrator/CalibratorLocHom.cpp b/src/calibrator/CalibratorLocHom.cpp index f8eaf51..dc8edb9 100644 --- a/src/calibrator/CalibratorLocHom.cpp +++ b/src/calibrator/CalibratorLocHom.cpp @@ -3,8 +3,6 @@ #include "cvtools.h" -#include - CalibratorLocHom::CalibratorLocHom(unsigned int _screenCols, unsigned int _screenRows): Calibrator(_screenCols, _screenRows){ // Create encoder/decoder @@ -20,15 +18,7 @@ CalibratorLocHom::CalibratorLocHom(unsigned int _screenCols, unsigned int _scree } -CalibrationData CalibratorLocHom::calibrate(){ - - QSettings settings("SLStudio"); - - //Checkerboard parameters - unsigned int checkerSize = settings.value("calibration/checkerSize").toInt(); - unsigned int checkerRows = settings.value("calibration/checkerRows").toInt(); - unsigned int checkerCols = settings.value("calibration/checkerCols").toInt(); - +CalibrationData CalibratorLocHom::calibrate(const int checkerSize, const int checkerRows, const int checkerCols){ // Number of saddle points on calibration pattern cv::Size patternSize(checkerCols,checkerRows); @@ -89,7 +79,7 @@ CalibrationData CalibratorLocHom::calibrate(){ #endif // Emit chessboard results //std::cout << i << " newSequenceResult" << std::endl; - emit newSequenceResult(shadingColor, i, success); + newSequenceResult(shadingColor, i, success); if(success){ // Vectors of accepted points for current view diff --git a/src/calibrator/CalibratorLocHom.h b/src/calibrator/CalibratorLocHom.h index bac3178..f97d409 100644 --- a/src/calibrator/CalibratorLocHom.h +++ b/src/calibrator/CalibratorLocHom.h @@ -12,10 +12,9 @@ using namespace std; class CalibratorLocHom : public Calibrator { - Q_OBJECT public: CalibratorLocHom(unsigned int _screenCols, unsigned int _screenRows); - CalibrationData calibrate(); + CalibrationData calibrate(const int checkerSize, const int checkerRows, const int checkerCols); ~CalibratorLocHom(){delete encoder; delete decoder;} private: Encoder *encoder; diff --git a/src/calibrator/CalibratorRBF.cpp b/src/calibrator/CalibratorRBF.cpp index 8db5043..6460d0f 100644 --- a/src/calibrator/CalibratorRBF.cpp +++ b/src/calibrator/CalibratorRBF.cpp @@ -4,8 +4,6 @@ #include "cvtools.h" #include "RBFInterpolator.h" -#include -#include CalibratorRBF::CalibratorRBF(unsigned int _screenCols, unsigned int _screenRows): Calibrator(_screenCols, _screenRows){ @@ -22,15 +20,7 @@ CalibratorRBF::CalibratorRBF(unsigned int _screenCols, unsigned int _screenRows) } -CalibrationData CalibratorRBF::calibrate(){ - - QSettings settings("SLStudio"); - - //Checkerboard parameters - unsigned int checkerSize = settings.value("calibration/checkerSize").toInt(); - unsigned int checkerRows = settings.value("calibration/checkerRows").toInt(); - unsigned int checkerCols = settings.value("calibration/checkerCols").toInt(); - +CalibrationData CalibratorRBF::calibrate(const int checkerSize, const int checkerRows, const int checkerCols){ // Number of saddle points on calibration pattern cv::Size patternSize(checkerCols,checkerRows); @@ -82,7 +72,7 @@ CalibrationData CalibratorRBF::calibrate(){ cv::imwrite("shadingColor.png", shadingColor); #endif // Emit chessboard results - emit newSequenceResult(shadingColor, i, success); + newSequenceResult(shadingColor, i, success); if(success){ diff --git a/src/calibrator/CalibratorRBF.h b/src/calibrator/CalibratorRBF.h index 168e158..b5d51d0 100644 --- a/src/calibrator/CalibratorRBF.h +++ b/src/calibrator/CalibratorRBF.h @@ -12,10 +12,9 @@ using namespace std; class CalibratorRBF : public Calibrator { - Q_OBJECT public: CalibratorRBF(unsigned int _screenCols, unsigned int _screenRows); - CalibrationData calibrate(); + CalibrationData calibrate(const int checkerSize, const int checkerRows, const int checkerCols); ~CalibratorRBF(){delete encoder; delete decoder;} private: Encoder *encoder; From 1b049429ec723312c6d45869f6d232cc7e22c7d2 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Wed, 21 Sep 2016 20:33:44 +0200 Subject: [PATCH 15/33] Export symbols of algorithms library on windows --- CMakeLists.txt | 9 +++++---- src/CMakeLists.txt | 6 +++++- src/calibrator/CalibrationData.h | 4 +++- src/calibrator/CalibratorLocHom.h | 2 +- src/calibrator/CalibratorRBF.h | 2 +- src/codec/Codec.h | 6 ++++-- src/codec/CodecFastRatio.h | 4 ++-- src/codec/CodecGrayCode.h | 4 ++-- src/codec/CodecPhaseShift2p1.h | 4 ++-- src/codec/CodecPhaseShift2x3.h | 4 ++-- src/codec/CodecPhaseShift3.h | 4 ++-- src/codec/CodecPhaseShift3FastWrap.h | 4 ++-- src/codec/CodecPhaseShift3Unwrap.h | 4 ++-- src/codec/CodecPhaseShift4.h | 4 ++-- src/codec/CodecPhaseShiftDescatter.h | 4 ++-- src/codec/CodecPhaseShiftMicro.h | 4 ++-- src/codec/CodecPhaseShiftModulated.h | 4 ++-- src/codec/CodecPhaseShiftNStep.h | 4 ++-- src/triangulator/Triangulator.h | 4 +++- 19 files changed, 46 insertions(+), 35 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d85baa..cbc5993 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,14 +1,15 @@ #Baysen Vision Inc. Structured Light project setup file #Copyright Reserved. 2013-2016 -cmake_minimum_required(VERSION 2.8 FATAL_ERROR) +cmake_minimum_required(VERSION 2.8.6 FATAL_ERROR) +include (GenerateExportHeader) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) project(slstudio) find_package(PCL REQUIRED) find_package(VTK REQUIRED) find_package(OpenCV REQUIRED) -find_package(Boost 1.47 COMPONENTS filesystem timer REQUIRED) +find_package(Boost 1.47 COMPONENTS filesystem system timer REQUIRED) find_package(Glew REQUIRED) find_package(OpenGL REQUIRED) @@ -26,8 +27,8 @@ if(OpenCV_VERSION VERSION_LESS "3") endif(OpenCV_VERSION VERSION_LESS "3") include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR} - ${PCL_INCLUDE_DIRS} ${VTK_DIR} ${OpenCV_INCLUDE_DIRS} ${Boost_INCLUDE_DIR} - ${GLEW_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIRS} ) + ${CMAKE_CURRENT_BINARY_DIR}/src ${PCL_INCLUDE_DIRS} ${VTK_DIR} ${OpenCV_INCLUDE_DIRS} + ${Boost_INCLUDE_DIR} ${GLEW_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIRS} ) include(${VTK_USE_FILE}) include_directories(${PROJECT_SOURCE_DIR}/src/camera) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d73c45d..14b358f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,5 @@ set(HEADERS + cvtools.h codec/Codec.h codec/phaseunwrap.h codec/phasecorr.h @@ -26,6 +27,7 @@ set(HEADERS ) set(SOURCES + cvtools.cpp codec/phaseunwrap.cpp codec/phasecorr.cpp codec/CodecCalibration.cpp @@ -50,8 +52,10 @@ set(SOURCES calibrator/RBFInterpolator.cpp ) +add_compiler_export_flags() add_library(slalgorithms SHARED ${HEADERS} ${SOURCES}) -#qt5_use_modules(slalgorithms Core) +generate_export_header(slalgorithms) target_link_libraries(slalgorithms ${OpenCV_LIBS} + ${Boost_LIBRARIES} ) diff --git a/src/calibrator/CalibrationData.h b/src/calibrator/CalibrationData.h index 5caa729..0e18afc 100644 --- a/src/calibrator/CalibrationData.h +++ b/src/calibrator/CalibrationData.h @@ -3,7 +3,9 @@ #include -class CalibrationData{ +#include "slalgorithms_export.h" + +class SLALGORITHMS_EXPORT CalibrationData{ public: CalibrationData(); CalibrationData(cv::Matx33f _Kc, cv::Vec _kc, double _cam_error, cv::Matx33f _Kp, cv::Vec _kp, diff --git a/src/calibrator/CalibratorLocHom.h b/src/calibrator/CalibratorLocHom.h index f97d409..e994512 100644 --- a/src/calibrator/CalibratorLocHom.h +++ b/src/calibrator/CalibratorLocHom.h @@ -11,7 +11,7 @@ using namespace std; -class CalibratorLocHom : public Calibrator { +class SLALGORITHMS_EXPORT CalibratorLocHom : public Calibrator { public: CalibratorLocHom(unsigned int _screenCols, unsigned int _screenRows); CalibrationData calibrate(const int checkerSize, const int checkerRows, const int checkerCols); diff --git a/src/calibrator/CalibratorRBF.h b/src/calibrator/CalibratorRBF.h index b5d51d0..f358737 100644 --- a/src/calibrator/CalibratorRBF.h +++ b/src/calibrator/CalibratorRBF.h @@ -11,7 +11,7 @@ using namespace std; -class CalibratorRBF : public Calibrator { +class SLALGORITHMS_EXPORT CalibratorRBF : public Calibrator { public: CalibratorRBF(unsigned int _screenCols, unsigned int _screenRows); CalibrationData calibrate(const int checkerSize, const int checkerRows, const int checkerCols); diff --git a/src/codec/Codec.h b/src/codec/Codec.h index 5812f8a..307e1c5 100644 --- a/src/codec/Codec.h +++ b/src/codec/Codec.h @@ -4,13 +4,15 @@ #include #include +#include "slalgorithms_export.h" + enum CodecDir {CodecDirNone = 0, CodecDirHorizontal = 1 << 0, CodecDirVertical = 1 << 1, CodecDirBoth = CodecDirHorizontal | CodecDirVertical}; // Base class for all encoders -class Encoder { +class SLALGORITHMS_EXPORT Encoder { public: Encoder(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir = CodecDirHorizontal) : N(0),screenCols(_screenCols), screenRows(_screenRows), dir(_dir){} unsigned int getNPatterns(){return N;} @@ -24,7 +26,7 @@ class Encoder { CodecDir dir; }; -class Decoder { +class SLALGORITHMS_EXPORT Decoder { public: Decoder(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir = CodecDirHorizontal) : N(0), screenCols(_screenCols), screenRows(_screenRows), dir(_dir){} unsigned int getNPatterns(){return N;} diff --git a/src/codec/CodecFastRatio.h b/src/codec/CodecFastRatio.h index bfcc4cf..fb414cb 100644 --- a/src/codec/CodecFastRatio.h +++ b/src/codec/CodecFastRatio.h @@ -3,7 +3,7 @@ #include "Codec.h" -class EncoderFastRatio : public Encoder { +class SLALGORITHMS_EXPORT EncoderFastRatio : public Encoder { public: EncoderFastRatio(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class EncoderFastRatio : public Encoder { std::vector patterns; }; -class DecoderFastRatio : public Decoder { +class SLALGORITHMS_EXPORT DecoderFastRatio : public Decoder { public: DecoderFastRatio(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecGrayCode.h b/src/codec/CodecGrayCode.h index ad02e2d..4e11835 100644 --- a/src/codec/CodecGrayCode.h +++ b/src/codec/CodecGrayCode.h @@ -3,7 +3,7 @@ #include "Codec.h" -class EncoderGrayCode : public Encoder { +class SLALGORITHMS_EXPORT EncoderGrayCode : public Encoder { public: EncoderGrayCode(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class EncoderGrayCode : public Encoder { std::vector patterns; }; -class DecoderGrayCode : public Decoder { +class SLALGORITHMS_EXPORT DecoderGrayCode : public Decoder { public: DecoderGrayCode(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShift2p1.h b/src/codec/CodecPhaseShift2p1.h index a26d99d..c4a1279 100644 --- a/src/codec/CodecPhaseShift2p1.h +++ b/src/codec/CodecPhaseShift2p1.h @@ -3,7 +3,7 @@ #include "Codec.h" -class EncoderPhaseShift2p1 : public Encoder { +class SLALGORITHMS_EXPORT EncoderPhaseShift2p1 : public Encoder { public: EncoderPhaseShift2p1(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class EncoderPhaseShift2p1 : public Encoder { std::vector patterns; }; -class DecoderPhaseShift2p1 : public Decoder { +class SLALGORITHMS_EXPORT DecoderPhaseShift2p1 : public Decoder { public: DecoderPhaseShift2p1(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShift2x3.h b/src/codec/CodecPhaseShift2x3.h index 8d047f7..b632991 100644 --- a/src/codec/CodecPhaseShift2x3.h +++ b/src/codec/CodecPhaseShift2x3.h @@ -3,7 +3,7 @@ #include "Codec.h" -class EncoderPhaseShift2x3 : public Encoder { +class SLALGORITHMS_EXPORT EncoderPhaseShift2x3 : public Encoder { public: EncoderPhaseShift2x3(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class EncoderPhaseShift2x3 : public Encoder { std::vector patterns; }; -class DecoderPhaseShift2x3 : public Decoder { +class SLALGORITHMS_EXPORT DecoderPhaseShift2x3 : public Decoder { public: DecoderPhaseShift2x3(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShift3.h b/src/codec/CodecPhaseShift3.h index 826d586..c9f1c6e 100644 --- a/src/codec/CodecPhaseShift3.h +++ b/src/codec/CodecPhaseShift3.h @@ -3,7 +3,7 @@ #include "Codec.h" -class EncoderPhaseShift3 : public Encoder { +class SLALGORITHMS_EXPORT EncoderPhaseShift3 : public Encoder { public: EncoderPhaseShift3(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class EncoderPhaseShift3 : public Encoder { std::vector patterns; }; -class DecoderPhaseShift3 : public Decoder { +class SLALGORITHMS_EXPORT DecoderPhaseShift3 : public Decoder { public: DecoderPhaseShift3(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShift3FastWrap.h b/src/codec/CodecPhaseShift3FastWrap.h index 60979c7..ef67893 100644 --- a/src/codec/CodecPhaseShift3FastWrap.h +++ b/src/codec/CodecPhaseShift3FastWrap.h @@ -3,7 +3,7 @@ #include "Codec.h" -class EncoderPhaseShift3FastWrap : public Encoder { +class SLALGORITHMS_EXPORT EncoderPhaseShift3FastWrap : public Encoder { public: EncoderPhaseShift3FastWrap(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class EncoderPhaseShift3FastWrap : public Encoder { std::vector patterns; }; -class DecoderPhaseShift3FastWrap : public Decoder { +class SLALGORITHMS_EXPORT DecoderPhaseShift3FastWrap : public Decoder { public: DecoderPhaseShift3FastWrap(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShift3Unwrap.h b/src/codec/CodecPhaseShift3Unwrap.h index 2fd311c..dd43ccc 100644 --- a/src/codec/CodecPhaseShift3Unwrap.h +++ b/src/codec/CodecPhaseShift3Unwrap.h @@ -3,7 +3,7 @@ #include "Codec.h" -class EncoderPhaseShift3Unwrap : public Encoder { +class SLALGORITHMS_EXPORT EncoderPhaseShift3Unwrap : public Encoder { public: EncoderPhaseShift3Unwrap(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class EncoderPhaseShift3Unwrap : public Encoder { std::vector patterns; }; -class DecoderPhaseShift3Unwrap : public Decoder { +class SLALGORITHMS_EXPORT DecoderPhaseShift3Unwrap : public Decoder { public: DecoderPhaseShift3Unwrap(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShift4.h b/src/codec/CodecPhaseShift4.h index 0ea0f89..afffefb 100644 --- a/src/codec/CodecPhaseShift4.h +++ b/src/codec/CodecPhaseShift4.h @@ -3,7 +3,7 @@ #include "Codec.h" -class EncoderPhaseShift4 : public Encoder { +class SLALGORITHMS_EXPORT EncoderPhaseShift4 : public Encoder { public: EncoderPhaseShift4(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class EncoderPhaseShift4 : public Encoder { std::vector patterns; }; -class DecoderPhaseShift4 : public Decoder { +class SLALGORITHMS_EXPORT DecoderPhaseShift4 : public Decoder { public: DecoderPhaseShift4(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShiftDescatter.h b/src/codec/CodecPhaseShiftDescatter.h index 9f6e4c6..0286e45 100644 --- a/src/codec/CodecPhaseShiftDescatter.h +++ b/src/codec/CodecPhaseShiftDescatter.h @@ -3,7 +3,7 @@ #include "Codec.h" -class EncoderPhaseShiftDescatter : public Encoder { +class SLALGORITHMS_EXPORT EncoderPhaseShiftDescatter : public Encoder { public: EncoderPhaseShiftDescatter(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class EncoderPhaseShiftDescatter : public Encoder { std::vector patterns; }; -class DecoderPhaseShiftDescatter : public Decoder { +class SLALGORITHMS_EXPORT DecoderPhaseShiftDescatter : public Decoder { public: DecoderPhaseShiftDescatter(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShiftMicro.h b/src/codec/CodecPhaseShiftMicro.h index 78eb423..b0ae5d8 100644 --- a/src/codec/CodecPhaseShiftMicro.h +++ b/src/codec/CodecPhaseShiftMicro.h @@ -3,7 +3,7 @@ #include "Codec.h" -class EncoderPhaseShiftMicro : public Encoder { +class SLALGORITHMS_EXPORT EncoderPhaseShiftMicro : public Encoder { public: EncoderPhaseShiftMicro(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class EncoderPhaseShiftMicro : public Encoder { std::vector patterns; }; -class DecoderPhaseShiftMicro : public Decoder { +class SLALGORITHMS_EXPORT DecoderPhaseShiftMicro : public Decoder { public: DecoderPhaseShiftMicro(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShiftModulated.h b/src/codec/CodecPhaseShiftModulated.h index 9bbc22a..cff53f1 100644 --- a/src/codec/CodecPhaseShiftModulated.h +++ b/src/codec/CodecPhaseShiftModulated.h @@ -3,7 +3,7 @@ #include "Codec.h" -class EncoderPhaseShiftModulated : public Encoder { +class SLALGORITHMS_EXPORT EncoderPhaseShiftModulated : public Encoder { public: EncoderPhaseShiftModulated(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class EncoderPhaseShiftModulated : public Encoder { std::vector patterns; }; -class DecoderPhaseShiftModulated : public Decoder { +class SLALGORITHMS_EXPORT DecoderPhaseShiftModulated : public Decoder { public: DecoderPhaseShiftModulated(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShiftNStep.h b/src/codec/CodecPhaseShiftNStep.h index 4568608..72780c1 100644 --- a/src/codec/CodecPhaseShiftNStep.h +++ b/src/codec/CodecPhaseShiftNStep.h @@ -5,7 +5,7 @@ // 8 step phase shifting codec with phase unwrapping -class EncoderPhaseShiftNStep : public Encoder { +class SLALGORITHMS_EXPORT EncoderPhaseShiftNStep : public Encoder { public: EncoderPhaseShiftNStep(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -14,7 +14,7 @@ class EncoderPhaseShiftNStep : public Encoder { std::vector patterns; }; -class DecoderPhaseShiftNStep : public Decoder { +class SLALGORITHMS_EXPORT DecoderPhaseShiftNStep : public Decoder { public: DecoderPhaseShiftNStep(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/triangulator/Triangulator.h b/src/triangulator/Triangulator.h index 94b6a56..45e1846 100644 --- a/src/triangulator/Triangulator.h +++ b/src/triangulator/Triangulator.h @@ -5,7 +5,9 @@ #include -class Triangulator { +#include "slalgorithms_export.h" + +class SLALGORITHMS_EXPORT Triangulator { public: Triangulator(CalibrationData _calibration); CalibrationData getCalibration(){return calibration;} From 6f61d0a4c40b580f2e78570dd872e961dbce8d2f Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Wed, 21 Sep 2016 20:34:16 +0200 Subject: [PATCH 16/33] Fix Qt4 build --- CMakeLists.txt | 10 +++++----- src/projector/CMakeLists.txt | 5 +++-- src/projector/ProjectorQtGL.h | 4 +++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cbc5993..f15938e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ #Copyright Reserved. 2013-2016 cmake_minimum_required(VERSION 2.8.6 FATAL_ERROR) -include (GenerateExportHeader) +include(GenerateExportHeader) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) project(slstudio) @@ -19,7 +19,8 @@ if(VTK_QT_VERSION VERSION_GREATER "4") set(CMAKE_AUTOMOC ON) else(VTK_QT_VERSION VERSION_GREATER "4") #Legacy qt4 support - find_package(Qt4 REQUIRED) + find_package(Qt4 REQUIRED QtCore QtGui QtTest QtOpenGL) + include(${QT_USE_FILE}) endif(VTK_QT_VERSION VERSION_GREATER "4") if(OpenCV_VERSION VERSION_LESS "3") @@ -28,7 +29,7 @@ endif(OpenCV_VERSION VERSION_LESS "3") include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src ${PCL_INCLUDE_DIRS} ${VTK_DIR} ${OpenCV_INCLUDE_DIRS} - ${Boost_INCLUDE_DIR} ${GLEW_INCLUDE_DIRS} ${OPENGL_INCLUDE_DIRS} ) + ${Boost_INCLUDE_DIR} ${GLEW_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}) include(${VTK_USE_FILE}) include_directories(${PROJECT_SOURCE_DIR}/src/camera) @@ -148,14 +149,13 @@ if(VTK_QT_VERSION VERSION_GREATER "4") ${PROJECTOR_DEVICE_LIBS}) else(VTK_QT_VERSION VERSION_GREATER "4") #Legacy qt4 support - include(${QT_USE_FILE}) qt4_wrap_ui(UISrcs ${UI_FILES}) qt4_wrap_cpp(MOCSrcs ${H_FILES}) qt4_add_resources(RCC_SRCS ${RC_FILES}) add_executable(slstudio ${CPP_FILES} ${UISrcs} ${MOCSrcs} ${RCC_SRCS}) - target_link_libraries(slstudio slalgorithms Qt4::QtTest ${VTK_LIBRARIES} ${PCL_LIBRARIES} + target_link_libraries(slstudio slalgorithms Qt4::QtTest Qt4::QtOpenGL ${VTK_LIBRARIES} ${PCL_LIBRARIES} ${OpenCV_LIBS} ${Boost_LIBRARIES} ${CAMERA_DEVICE_LIBS} ${PROJECTOR_DEVICE_LIBS} ) endif(VTK_QT_VERSION VERSION_GREATER "4") diff --git a/src/projector/CMakeLists.txt b/src/projector/CMakeLists.txt index 0c7cfaf..d787bce 100644 --- a/src/projector/CMakeLists.txt +++ b/src/projector/CMakeLists.txt @@ -49,8 +49,9 @@ if(WITH_PROJECTOROPENGL) endif(WITH_PROJECTOROPENGL) if(WITH_PROJECTORQT) - add_library(QtProjector STATIC ProjectorQtGL.cpp ProjectorQtGL.h OpenGLContext.h) - set(DEVICE_LIBS ${DEVICE_LIBS} QtProjector) + qt4_wrap_cpp(MOCSrcs ProjectorQtGL.h) + add_library(QtProjector STATIC ProjectorQtGL.cpp ProjectorQtGL.h OpenGLContext.h ${MOCSrcs}) + set(DEVICE_LIBS ${DEVICE_LIBS} QtProjector ${GLEW_LIBRARY}) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_PROJECTORQT) endif(WITH_PROJECTORQT) diff --git a/src/projector/ProjectorQtGL.h b/src/projector/ProjectorQtGL.h index 03d47e5..a31f23f 100644 --- a/src/projector/ProjectorQtGL.h +++ b/src/projector/ProjectorQtGL.h @@ -25,7 +25,7 @@ struct Texture const unsigned char *tex; unsigned int texWidth; unsigned int texHeight; - bool ownsData = false; + bool ownsData; void takeOwnership() { @@ -36,6 +36,8 @@ struct Texture ownsData = true; } + Texture() : ownsData(false) {} + ~Texture() { if (ownsData) From 9d1dbcc11cfa35c9940943cf59191db29625d792 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Fri, 23 Sep 2016 14:00:40 +0200 Subject: [PATCH 17/33] Fix OpenGL projector --- CMakeLists.txt | 2 +- src/projector/CMakeLists.txt | 8 ++++---- src/projector/ProjectorOpenGL.cpp | 2 ++ src/projector/ProjectorOpenGL.h | 4 +--- src/projector/ProjectorQtGL.h | 1 + 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f15938e..ca21154 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -142,7 +142,7 @@ if(VTK_QT_VERSION VERSION_GREATER "4") # CMAKE_AUTOMOC in ON so the MocHdrs will be automatically wrapped. qt5_add_resources(RCC_SRCS ${RC_FILES}) add_executable(slstudio ${CPP_FILES} ${UISrcs} ${H_FILES} ${RCC_SRCS}) - qt5_use_modules(slstudio Core Gui Widgets Test) + qt5_use_modules(slstudio Core Gui Widgets Test OpenGL) add_definitions(${COMPILER_DEFINES}) target_link_libraries(slstudio slalgorithms ${VTK_LIBRARIES} ${PCL_LIBRARIES} ${OpenCV_LIBS} ${Boost_LIBRARIES} ${CAMERA_DEVICE_LIBS} diff --git a/src/projector/CMakeLists.txt b/src/projector/CMakeLists.txt index d787bce..2e9df2e 100644 --- a/src/projector/CMakeLists.txt +++ b/src/projector/CMakeLists.txt @@ -36,22 +36,22 @@ if(WITH_PROJECTOROPENGL) # Compile with system dependent OpenGL Context code if(APPLE) set(OPENGL_CONTEXT_CPP OpenGLContext.Mac.mm) - elseif() + elseif(WIN32) set(OPENGL_CONTEXT_CPP OpenGLContext.Win.cpp) add_definitions(-DWIN32 -D_UNICODE -DUNICODE) else() set(OPENGL_CONTEXT_CPP OpenGLContext.Unix.cpp) endif() - add_library(OpenGlProjector STATIC ProjectorOpenGL.cpp ${OPENGL_CONTEXT_CPP} ProjectorOpenGL.h) - set(DEVICE_LIBS ${DEVICE_LIBS} OpenGlProjector ${OPENGL_LIBRARIES}) + add_library(OpenGlProjector STATIC ProjectorOpenGL.cpp ${OPENGL_CONTEXT_CPP} ProjectorOpenGL.h OpenGLContext.h) + set(DEVICE_LIBS ${DEVICE_LIBS} OpenGlProjector ${OPENGL_LIBRARIES} ${GLEW_LIBRARY}) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_PROJECTOROPENGL) endif(WITH_PROJECTOROPENGL) if(WITH_PROJECTORQT) qt4_wrap_cpp(MOCSrcs ProjectorQtGL.h) add_library(QtProjector STATIC ProjectorQtGL.cpp ProjectorQtGL.h OpenGLContext.h ${MOCSrcs}) - set(DEVICE_LIBS ${DEVICE_LIBS} QtProjector ${GLEW_LIBRARY}) + set(DEVICE_LIBS ${DEVICE_LIBS} QtProjector) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_PROJECTORQT) endif(WITH_PROJECTORQT) diff --git a/src/projector/ProjectorOpenGL.cpp b/src/projector/ProjectorOpenGL.cpp index 4b177c6..432323d 100644 --- a/src/projector/ProjectorOpenGL.cpp +++ b/src/projector/ProjectorOpenGL.cpp @@ -1,5 +1,7 @@ #include "ProjectorOpenGL.h" +#include "Projector.h" +#include "OpenGLContext.h" ProjectorOpenGL::ProjectorOpenGL(unsigned int _screenNum){ diff --git a/src/projector/ProjectorOpenGL.h b/src/projector/ProjectorOpenGL.h index 3453caa..6f4f99d 100644 --- a/src/projector/ProjectorOpenGL.h +++ b/src/projector/ProjectorOpenGL.h @@ -3,13 +3,11 @@ #include #include -#include #include - #include "Projector.h" -#include "OpenGLContext.h" +class OpenGLContext; // ProjectorOpenGL implementations class ProjectorOpenGL : public Projector { diff --git a/src/projector/ProjectorQtGL.h b/src/projector/ProjectorQtGL.h index a31f23f..53d0662 100644 --- a/src/projector/ProjectorQtGL.h +++ b/src/projector/ProjectorQtGL.h @@ -12,6 +12,7 @@ #include #include + #include #include #include From 8fe29529f6653c3f862033405971b21d134a928c Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Fri, 23 Sep 2016 14:01:29 +0200 Subject: [PATCH 18/33] Move camera classes to separate library, rename slalgorithms to slalgorithm --- CMakeLists.txt | 17 +++++++++-------- src/CMakeLists.txt | 6 +++--- src/calibrator/CalibrationData.h | 4 ++-- src/calibrator/CalibratorLocHom.h | 2 +- src/calibrator/CalibratorRBF.h | 2 +- src/camera/CMakeLists.txt | 12 +++++++++++- src/camera/Camera.h | 4 +++- src/codec/Codec.h | 6 +++--- src/codec/CodecFastRatio.h | 4 ++-- src/codec/CodecGrayCode.h | 4 ++-- src/codec/CodecPhaseShift2p1.h | 4 ++-- src/codec/CodecPhaseShift2x3.h | 4 ++-- src/codec/CodecPhaseShift3.h | 4 ++-- src/codec/CodecPhaseShift3FastWrap.h | 4 ++-- src/codec/CodecPhaseShift3Unwrap.h | 4 ++-- src/codec/CodecPhaseShift4.h | 4 ++-- src/codec/CodecPhaseShiftDescatter.h | 4 ++-- src/codec/CodecPhaseShiftMicro.h | 4 ++-- src/codec/CodecPhaseShiftModulated.h | 4 ++-- src/codec/CodecPhaseShiftNStep.h | 4 ++-- src/triangulator/Triangulator.h | 4 ++-- 21 files changed, 59 insertions(+), 46 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ca21154..a87954d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,7 @@ project(slstudio) find_package(PCL REQUIRED) find_package(VTK REQUIRED) find_package(OpenCV REQUIRED) -find_package(Boost 1.47 COMPONENTS filesystem system timer REQUIRED) +find_package(Boost 1.47 COMPONENTS chrono filesystem system timer REQUIRED) find_package(Glew REQUIRED) find_package(OpenGL REQUIRED) @@ -28,7 +28,8 @@ if(OpenCV_VERSION VERSION_LESS "3") endif(OpenCV_VERSION VERSION_LESS "3") include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_BINARY_DIR}/src ${PCL_INCLUDE_DIRS} ${VTK_DIR} ${OpenCV_INCLUDE_DIRS} + ${CMAKE_CURRENT_BINARY_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src/camera + ${PCL_INCLUDE_DIRS} ${VTK_DIR} ${OpenCV_INCLUDE_DIRS} ${Boost_INCLUDE_DIR} ${GLEW_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}) include(${VTK_USE_FILE}) @@ -84,7 +85,6 @@ file(GLOB H_FILES ${PROJECT_BINARY_DIR}/cmakeconfig.h src/SLTrackerDialog.h src/SLTriangulatorWorker.h src/SLTraceWidget.h - src/camera/Camera.h src/tracker/Tracker.h src/tracker/TrackerICP.h src/tracker/TrackerNDT.h @@ -112,7 +112,6 @@ file(GLOB CPP_FILES src/main.cpp src/SLTrackerDialog.cpp src/SLTriangulatorWorker.cpp src/SLTraceWidget.cpp - src/camera/Camera.cpp src/cvtools.cpp src/tracker/TrackerICP.cpp src/tracker/TrackerNDT.cpp @@ -144,8 +143,9 @@ if(VTK_QT_VERSION VERSION_GREATER "4") add_executable(slstudio ${CPP_FILES} ${UISrcs} ${H_FILES} ${RCC_SRCS}) qt5_use_modules(slstudio Core Gui Widgets Test OpenGL) add_definitions(${COMPILER_DEFINES}) - target_link_libraries(slstudio slalgorithms ${VTK_LIBRARIES} ${PCL_LIBRARIES} - ${OpenCV_LIBS} ${Boost_LIBRARIES} ${CAMERA_DEVICE_LIBS} + target_link_libraries(slstudio slalgorithms slcameras + ${VTK_LIBRARIES} ${PCL_LIBRARIES} + ${OpenCV_LIBS} ${Boost_LIBRARIES} ${PROJECTOR_DEVICE_LIBS}) else(VTK_QT_VERSION VERSION_GREATER "4") #Legacy qt4 support @@ -155,8 +155,9 @@ else(VTK_QT_VERSION VERSION_GREATER "4") qt4_add_resources(RCC_SRCS ${RC_FILES}) add_executable(slstudio ${CPP_FILES} ${UISrcs} ${MOCSrcs} ${RCC_SRCS}) - target_link_libraries(slstudio slalgorithms Qt4::QtTest Qt4::QtOpenGL ${VTK_LIBRARIES} ${PCL_LIBRARIES} - ${OpenCV_LIBS} ${Boost_LIBRARIES} ${CAMERA_DEVICE_LIBS} + target_link_libraries(slstudio slalgorithm slcamera + Qt4::QtTest Qt4::QtOpenGL ${VTK_LIBRARIES} ${PCL_LIBRARIES} + ${OpenCV_LIBS} ${Boost_LIBRARIES} ${PROJECTOR_DEVICE_LIBS} ) endif(VTK_QT_VERSION VERSION_GREATER "4") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 14b358f..ede6864 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -53,9 +53,9 @@ set(SOURCES ) add_compiler_export_flags() -add_library(slalgorithms SHARED ${HEADERS} ${SOURCES}) -generate_export_header(slalgorithms) -target_link_libraries(slalgorithms +add_library(slalgorithm SHARED ${HEADERS} ${SOURCES}) +generate_export_header(slalgorithm) +target_link_libraries(slalgorithm ${OpenCV_LIBS} ${Boost_LIBRARIES} ) diff --git a/src/calibrator/CalibrationData.h b/src/calibrator/CalibrationData.h index 0e18afc..1076580 100644 --- a/src/calibrator/CalibrationData.h +++ b/src/calibrator/CalibrationData.h @@ -3,9 +3,9 @@ #include -#include "slalgorithms_export.h" +#include "slalgorithm_export.h" -class SLALGORITHMS_EXPORT CalibrationData{ +class SLALGORITHM_EXPORT CalibrationData{ public: CalibrationData(); CalibrationData(cv::Matx33f _Kc, cv::Vec _kc, double _cam_error, cv::Matx33f _Kp, cv::Vec _kp, diff --git a/src/calibrator/CalibratorLocHom.h b/src/calibrator/CalibratorLocHom.h index e994512..ed81eea 100644 --- a/src/calibrator/CalibratorLocHom.h +++ b/src/calibrator/CalibratorLocHom.h @@ -11,7 +11,7 @@ using namespace std; -class SLALGORITHMS_EXPORT CalibratorLocHom : public Calibrator { +class SLALGORITHM_EXPORT CalibratorLocHom : public Calibrator { public: CalibratorLocHom(unsigned int _screenCols, unsigned int _screenRows); CalibrationData calibrate(const int checkerSize, const int checkerRows, const int checkerCols); diff --git a/src/calibrator/CalibratorRBF.h b/src/calibrator/CalibratorRBF.h index f358737..d68cd4e 100644 --- a/src/calibrator/CalibratorRBF.h +++ b/src/calibrator/CalibratorRBF.h @@ -11,7 +11,7 @@ using namespace std; -class SLALGORITHMS_EXPORT CalibratorRBF : public Calibrator { +class SLALGORITHM_EXPORT CalibratorRBF : public Calibrator { public: CalibratorRBF(unsigned int _screenCols, unsigned int _screenRows); CalibrationData calibrate(const int checkerSize, const int checkerRows, const int checkerCols); diff --git a/src/camera/CMakeLists.txt b/src/camera/CMakeLists.txt index d750328..84e26ec 100644 --- a/src/camera/CMakeLists.txt +++ b/src/camera/CMakeLists.txt @@ -64,4 +64,14 @@ if(WITH_CAMERAOPENCV) endif(WITH_CAMERAOPENCV) set(CAMERA_DEVICE_DEFS ${DEVICE_DEFS} PARENT_SCOPE) -set(CAMERA_DEVICE_LIBS ${DEVICE_LIBS} PARENT_SCOPE) \ No newline at end of file +set(CAMERA_DEVICE_LIBS ${DEVICE_LIBS} PARENT_SCOPE) + +add_compiler_export_flags() +add_definitions(${DEVICE_DEFS}) +add_library(slcamera SHARED Camera.h Camera.cpp) +generate_export_header(slcamera) +target_link_libraries(slcamera + ${DEVICE_LIBS} + ${OpenCV_LIBS} + ${Boost_LIBRARIES} +) diff --git a/src/camera/Camera.h b/src/camera/Camera.h index c18481b..26b5434 100644 --- a/src/camera/Camera.h +++ b/src/camera/Camera.h @@ -4,6 +4,8 @@ #include #include +#include "slcamera_export.h" + struct CameraFrame { unsigned char *memory; unsigned int width; @@ -31,7 +33,7 @@ enum CameraTriggerMode { }; // Camera factory methods and abstract base class for camera implementations -class Camera { +class SLCAMERA_EXPORT Camera { public: // Static "camera factory" methods diff --git a/src/codec/Codec.h b/src/codec/Codec.h index 307e1c5..17b61b8 100644 --- a/src/codec/Codec.h +++ b/src/codec/Codec.h @@ -4,7 +4,7 @@ #include #include -#include "slalgorithms_export.h" +#include "slalgorithm_export.h" enum CodecDir {CodecDirNone = 0, CodecDirHorizontal = 1 << 0, @@ -12,7 +12,7 @@ enum CodecDir {CodecDirNone = 0, CodecDirBoth = CodecDirHorizontal | CodecDirVertical}; // Base class for all encoders -class SLALGORITHMS_EXPORT Encoder { +class SLALGORITHM_EXPORT Encoder { public: Encoder(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir = CodecDirHorizontal) : N(0),screenCols(_screenCols), screenRows(_screenRows), dir(_dir){} unsigned int getNPatterns(){return N;} @@ -26,7 +26,7 @@ class SLALGORITHMS_EXPORT Encoder { CodecDir dir; }; -class SLALGORITHMS_EXPORT Decoder { +class SLALGORITHM_EXPORT Decoder { public: Decoder(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir = CodecDirHorizontal) : N(0), screenCols(_screenCols), screenRows(_screenRows), dir(_dir){} unsigned int getNPatterns(){return N;} diff --git a/src/codec/CodecFastRatio.h b/src/codec/CodecFastRatio.h index fb414cb..4f997e9 100644 --- a/src/codec/CodecFastRatio.h +++ b/src/codec/CodecFastRatio.h @@ -3,7 +3,7 @@ #include "Codec.h" -class SLALGORITHMS_EXPORT EncoderFastRatio : public Encoder { +class SLALGORITHM_EXPORT EncoderFastRatio : public Encoder { public: EncoderFastRatio(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class SLALGORITHMS_EXPORT EncoderFastRatio : public Encoder { std::vector patterns; }; -class SLALGORITHMS_EXPORT DecoderFastRatio : public Decoder { +class SLALGORITHM_EXPORT DecoderFastRatio : public Decoder { public: DecoderFastRatio(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecGrayCode.h b/src/codec/CodecGrayCode.h index 4e11835..f2e357f 100644 --- a/src/codec/CodecGrayCode.h +++ b/src/codec/CodecGrayCode.h @@ -3,7 +3,7 @@ #include "Codec.h" -class SLALGORITHMS_EXPORT EncoderGrayCode : public Encoder { +class SLALGORITHM_EXPORT EncoderGrayCode : public Encoder { public: EncoderGrayCode(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class SLALGORITHMS_EXPORT EncoderGrayCode : public Encoder { std::vector patterns; }; -class SLALGORITHMS_EXPORT DecoderGrayCode : public Decoder { +class SLALGORITHM_EXPORT DecoderGrayCode : public Decoder { public: DecoderGrayCode(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShift2p1.h b/src/codec/CodecPhaseShift2p1.h index c4a1279..74f99d5 100644 --- a/src/codec/CodecPhaseShift2p1.h +++ b/src/codec/CodecPhaseShift2p1.h @@ -3,7 +3,7 @@ #include "Codec.h" -class SLALGORITHMS_EXPORT EncoderPhaseShift2p1 : public Encoder { +class SLALGORITHM_EXPORT EncoderPhaseShift2p1 : public Encoder { public: EncoderPhaseShift2p1(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class SLALGORITHMS_EXPORT EncoderPhaseShift2p1 : public Encoder { std::vector patterns; }; -class SLALGORITHMS_EXPORT DecoderPhaseShift2p1 : public Decoder { +class SLALGORITHM_EXPORT DecoderPhaseShift2p1 : public Decoder { public: DecoderPhaseShift2p1(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShift2x3.h b/src/codec/CodecPhaseShift2x3.h index b632991..5a19207 100644 --- a/src/codec/CodecPhaseShift2x3.h +++ b/src/codec/CodecPhaseShift2x3.h @@ -3,7 +3,7 @@ #include "Codec.h" -class SLALGORITHMS_EXPORT EncoderPhaseShift2x3 : public Encoder { +class SLALGORITHM_EXPORT EncoderPhaseShift2x3 : public Encoder { public: EncoderPhaseShift2x3(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class SLALGORITHMS_EXPORT EncoderPhaseShift2x3 : public Encoder { std::vector patterns; }; -class SLALGORITHMS_EXPORT DecoderPhaseShift2x3 : public Decoder { +class SLALGORITHM_EXPORT DecoderPhaseShift2x3 : public Decoder { public: DecoderPhaseShift2x3(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShift3.h b/src/codec/CodecPhaseShift3.h index c9f1c6e..77ae192 100644 --- a/src/codec/CodecPhaseShift3.h +++ b/src/codec/CodecPhaseShift3.h @@ -3,7 +3,7 @@ #include "Codec.h" -class SLALGORITHMS_EXPORT EncoderPhaseShift3 : public Encoder { +class SLALGORITHM_EXPORT EncoderPhaseShift3 : public Encoder { public: EncoderPhaseShift3(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class SLALGORITHMS_EXPORT EncoderPhaseShift3 : public Encoder { std::vector patterns; }; -class SLALGORITHMS_EXPORT DecoderPhaseShift3 : public Decoder { +class SLALGORITHM_EXPORT DecoderPhaseShift3 : public Decoder { public: DecoderPhaseShift3(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShift3FastWrap.h b/src/codec/CodecPhaseShift3FastWrap.h index ef67893..a94859e 100644 --- a/src/codec/CodecPhaseShift3FastWrap.h +++ b/src/codec/CodecPhaseShift3FastWrap.h @@ -3,7 +3,7 @@ #include "Codec.h" -class SLALGORITHMS_EXPORT EncoderPhaseShift3FastWrap : public Encoder { +class SLALGORITHM_EXPORT EncoderPhaseShift3FastWrap : public Encoder { public: EncoderPhaseShift3FastWrap(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class SLALGORITHMS_EXPORT EncoderPhaseShift3FastWrap : public Encoder { std::vector patterns; }; -class SLALGORITHMS_EXPORT DecoderPhaseShift3FastWrap : public Decoder { +class SLALGORITHM_EXPORT DecoderPhaseShift3FastWrap : public Decoder { public: DecoderPhaseShift3FastWrap(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShift3Unwrap.h b/src/codec/CodecPhaseShift3Unwrap.h index dd43ccc..9dabc59 100644 --- a/src/codec/CodecPhaseShift3Unwrap.h +++ b/src/codec/CodecPhaseShift3Unwrap.h @@ -3,7 +3,7 @@ #include "Codec.h" -class SLALGORITHMS_EXPORT EncoderPhaseShift3Unwrap : public Encoder { +class SLALGORITHM_EXPORT EncoderPhaseShift3Unwrap : public Encoder { public: EncoderPhaseShift3Unwrap(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class SLALGORITHMS_EXPORT EncoderPhaseShift3Unwrap : public Encoder { std::vector patterns; }; -class SLALGORITHMS_EXPORT DecoderPhaseShift3Unwrap : public Decoder { +class SLALGORITHM_EXPORT DecoderPhaseShift3Unwrap : public Decoder { public: DecoderPhaseShift3Unwrap(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShift4.h b/src/codec/CodecPhaseShift4.h index afffefb..5977dfa 100644 --- a/src/codec/CodecPhaseShift4.h +++ b/src/codec/CodecPhaseShift4.h @@ -3,7 +3,7 @@ #include "Codec.h" -class SLALGORITHMS_EXPORT EncoderPhaseShift4 : public Encoder { +class SLALGORITHM_EXPORT EncoderPhaseShift4 : public Encoder { public: EncoderPhaseShift4(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class SLALGORITHMS_EXPORT EncoderPhaseShift4 : public Encoder { std::vector patterns; }; -class SLALGORITHMS_EXPORT DecoderPhaseShift4 : public Decoder { +class SLALGORITHM_EXPORT DecoderPhaseShift4 : public Decoder { public: DecoderPhaseShift4(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShiftDescatter.h b/src/codec/CodecPhaseShiftDescatter.h index 0286e45..85902b3 100644 --- a/src/codec/CodecPhaseShiftDescatter.h +++ b/src/codec/CodecPhaseShiftDescatter.h @@ -3,7 +3,7 @@ #include "Codec.h" -class SLALGORITHMS_EXPORT EncoderPhaseShiftDescatter : public Encoder { +class SLALGORITHM_EXPORT EncoderPhaseShiftDescatter : public Encoder { public: EncoderPhaseShiftDescatter(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class SLALGORITHMS_EXPORT EncoderPhaseShiftDescatter : public Encoder { std::vector patterns; }; -class SLALGORITHMS_EXPORT DecoderPhaseShiftDescatter : public Decoder { +class SLALGORITHM_EXPORT DecoderPhaseShiftDescatter : public Decoder { public: DecoderPhaseShiftDescatter(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShiftMicro.h b/src/codec/CodecPhaseShiftMicro.h index b0ae5d8..2620d3e 100644 --- a/src/codec/CodecPhaseShiftMicro.h +++ b/src/codec/CodecPhaseShiftMicro.h @@ -3,7 +3,7 @@ #include "Codec.h" -class SLALGORITHMS_EXPORT EncoderPhaseShiftMicro : public Encoder { +class SLALGORITHM_EXPORT EncoderPhaseShiftMicro : public Encoder { public: EncoderPhaseShiftMicro(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class SLALGORITHMS_EXPORT EncoderPhaseShiftMicro : public Encoder { std::vector patterns; }; -class SLALGORITHMS_EXPORT DecoderPhaseShiftMicro : public Decoder { +class SLALGORITHM_EXPORT DecoderPhaseShiftMicro : public Decoder { public: DecoderPhaseShiftMicro(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShiftModulated.h b/src/codec/CodecPhaseShiftModulated.h index cff53f1..3cd39cd 100644 --- a/src/codec/CodecPhaseShiftModulated.h +++ b/src/codec/CodecPhaseShiftModulated.h @@ -3,7 +3,7 @@ #include "Codec.h" -class SLALGORITHMS_EXPORT EncoderPhaseShiftModulated : public Encoder { +class SLALGORITHM_EXPORT EncoderPhaseShiftModulated : public Encoder { public: EncoderPhaseShiftModulated(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class SLALGORITHMS_EXPORT EncoderPhaseShiftModulated : public Encoder { std::vector patterns; }; -class SLALGORITHMS_EXPORT DecoderPhaseShiftModulated : public Decoder { +class SLALGORITHM_EXPORT DecoderPhaseShiftModulated : public Decoder { public: DecoderPhaseShiftModulated(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/codec/CodecPhaseShiftNStep.h b/src/codec/CodecPhaseShiftNStep.h index 72780c1..4b6ec4a 100644 --- a/src/codec/CodecPhaseShiftNStep.h +++ b/src/codec/CodecPhaseShiftNStep.h @@ -5,7 +5,7 @@ // 8 step phase shifting codec with phase unwrapping -class SLALGORITHMS_EXPORT EncoderPhaseShiftNStep : public Encoder { +class SLALGORITHM_EXPORT EncoderPhaseShiftNStep : public Encoder { public: EncoderPhaseShiftNStep(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -14,7 +14,7 @@ class SLALGORITHMS_EXPORT EncoderPhaseShiftNStep : public Encoder { std::vector patterns; }; -class SLALGORITHMS_EXPORT DecoderPhaseShiftNStep : public Decoder { +class SLALGORITHM_EXPORT DecoderPhaseShiftNStep : public Decoder { public: DecoderPhaseShiftNStep(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding diff --git a/src/triangulator/Triangulator.h b/src/triangulator/Triangulator.h index 45e1846..cd807f3 100644 --- a/src/triangulator/Triangulator.h +++ b/src/triangulator/Triangulator.h @@ -5,9 +5,9 @@ #include -#include "slalgorithms_export.h" +#include "slalgorithm_export.h" -class SLALGORITHMS_EXPORT Triangulator { +class SLALGORITHM_EXPORT Triangulator { public: Triangulator(CalibrationData _calibration); CalibrationData getCalibration(){return calibration;} From fc0ced9dacbc04d38b78ea0a19ef84c8781646cc Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Fri, 23 Sep 2016 14:02:11 +0200 Subject: [PATCH 19/33] Move projector classes to separate library --- CMakeLists.txt | 14 +++++----- src/CMakeLists.txt | 2 +- src/projector/CMakeLists.txt | 46 +++++++++++++++++++++------------ src/projector/OpenGLContext.h | 4 ++- src/projector/Projector.cpp | 6 +++++ src/projector/Projector.h | 6 ++++- src/projector/ProjectorLC3000.h | 2 +- src/projector/ProjectorLC4500.h | 2 +- src/projector/ProjectorOpenGL.h | 2 +- src/projector/ProjectorQtGL.h | 2 +- 10 files changed, 54 insertions(+), 32 deletions(-) create mode 100644 src/projector/Projector.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index a87954d..9f51674 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ endif(OpenCV_VERSION VERSION_LESS "3") include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src/camera + ${CMAKE_CURRENT_BINARY_DIR}/src/projector ${PCL_INCLUDE_DIRS} ${VTK_DIR} ${OpenCV_INCLUDE_DIRS} ${Boost_INCLUDE_DIR} ${GLEW_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}) include(${VTK_USE_FILE}) @@ -133,7 +134,6 @@ add_subdirectory(${PROJECT_SOURCE_DIR}/src/projector) #Algorithms library add_subdirectory(${PROJECT_SOURCE_DIR}/src) -add_definitions(${CAMERA_DEVICE_DEFS}) add_definitions(${PROJECTOR_DEVICE_DEFS}) if(VTK_QT_VERSION VERSION_GREATER "4") @@ -143,10 +143,9 @@ if(VTK_QT_VERSION VERSION_GREATER "4") add_executable(slstudio ${CPP_FILES} ${UISrcs} ${H_FILES} ${RCC_SRCS}) qt5_use_modules(slstudio Core Gui Widgets Test OpenGL) add_definitions(${COMPILER_DEFINES}) - target_link_libraries(slstudio slalgorithms slcameras + target_link_libraries(slstudio slalgorithm slcamera slprojector ${VTK_LIBRARIES} ${PCL_LIBRARIES} - ${OpenCV_LIBS} ${Boost_LIBRARIES} - ${PROJECTOR_DEVICE_LIBS}) + ${OpenCV_LIBS} ${Boost_LIBRARIES}) else(VTK_QT_VERSION VERSION_GREATER "4") #Legacy qt4 support @@ -155,10 +154,9 @@ else(VTK_QT_VERSION VERSION_GREATER "4") qt4_add_resources(RCC_SRCS ${RC_FILES}) add_executable(slstudio ${CPP_FILES} ${UISrcs} ${MOCSrcs} ${RCC_SRCS}) - target_link_libraries(slstudio slalgorithm slcamera - Qt4::QtTest Qt4::QtOpenGL ${VTK_LIBRARIES} ${PCL_LIBRARIES} - ${OpenCV_LIBS} ${Boost_LIBRARIES} - ${PROJECTOR_DEVICE_LIBS} ) + target_link_libraries(slstudio slalgorithm slcamera slprojector + Qt4::QtTest ${VTK_LIBRARIES} ${PCL_LIBRARIES} + ${OpenCV_LIBS} ${Boost_LIBRARIES}) endif(VTK_QT_VERSION VERSION_GREATER "4") if(MSVC) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ede6864..d95774b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -57,5 +57,5 @@ add_library(slalgorithm SHARED ${HEADERS} ${SOURCES}) generate_export_header(slalgorithm) target_link_libraries(slalgorithm ${OpenCV_LIBS} - ${Boost_LIBRARIES} + ${Boost_LIBRARIES} ) diff --git a/src/projector/CMakeLists.txt b/src/projector/CMakeLists.txt index 2e9df2e..1e822ff 100644 --- a/src/projector/CMakeLists.txt +++ b/src/projector/CMakeLists.txt @@ -2,31 +2,30 @@ include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/projector) set(DEVICE_LIBS) set(DEVICE_DEFS) +set(H_FILES Projector.h) +set(CPP_FILES Projector.cpp) if(WITH_LC4500API) - list(APPEND LC4500_SRC ProjectorLC4500.cpp LC4500API/API.cpp LC4500API/usb.cpp) + set(CPP_FILES ${CPP_FILES} ProjectorLC4500.cpp LC4500API/API.cpp LC4500API/usb.cpp) if(APPLE) - list(APPEND LC4500_SRC LC4500API/hid.Mac.c) + set(CPP_FILES ${CPP_FILES} LC4500API/hid.Mac.c) elseif(WIN32) - list(APPEND LC4500_SRC LC4500API/hid.Win.c) + set(CPP_FILES ${CPP_FILES} LC4500API/hid.Win.c) else() - list(APPEND LC4500_SRC LC4500API/hid.Libusb.c) + set(CPP_FILES ${CPP_FILES} LC4500API/hid.Libusb.c) endif() - add_library(LC4500Projector STATIC ${LC4500_SRC} LC4500API/API.h) + set(H_FILES ${H_FILES} LC4500API/API.h) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_LC4500API) if(WIN32) - set(PROJ4500_LIBS LC4500Projector setupapi) - else(WIN32) - set(PROJ4500_LIBS LC4500Projector) + set(PROJ4500_LIBS setupapi) endif(WIN32) endif(WITH_LC4500API) if(WITH_LC3000API) - list(APPEND LC3000_SRC ProjectorLC3000.cpp LC3000API/lcr_cmd.cpp + set(CPP_FILES ${CPP_FILES} ProjectorLC3000.cpp LC3000API/lcr_cmd.cpp LC3000API/lcr_packetizer.cpp LC3000API/tcp_client.cpp) - add_library(LC3000Projector STATIC ${LC3000_SRC} LC3000API/lcr_cmd.h) - set(PROJ3000_LIBS LC3000Projector) + set(H_FILES ${H_FILES} LC3000API/lcr_cmd.h) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_LC3000API) endif(WITH_LC3000API) @@ -42,18 +41,31 @@ if(WITH_PROJECTOROPENGL) else() set(OPENGL_CONTEXT_CPP OpenGLContext.Unix.cpp) endif() - - add_library(OpenGlProjector STATIC ProjectorOpenGL.cpp ${OPENGL_CONTEXT_CPP} ProjectorOpenGL.h OpenGLContext.h) - set(DEVICE_LIBS ${DEVICE_LIBS} OpenGlProjector ${OPENGL_LIBRARIES} ${GLEW_LIBRARY}) + + set(CPP_FILES ${CPP_FILES} ProjectorOpenGL.cpp ${OPENGL_CONTEXT_CPP}) + set(H_FILES ${H_FILES} ProjectorOpenGL.h OpenGLContext.h) + set(DEVICE_LIBS ${DEVICE_LIBS} ${OPENGL_LIBRARIES} ${GLEW_LIBRARY}) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_PROJECTOROPENGL) endif(WITH_PROJECTOROPENGL) if(WITH_PROJECTORQT) qt4_wrap_cpp(MOCSrcs ProjectorQtGL.h) - add_library(QtProjector STATIC ProjectorQtGL.cpp ProjectorQtGL.h OpenGLContext.h ${MOCSrcs}) - set(DEVICE_LIBS ${DEVICE_LIBS} QtProjector) + set(CPP_FILES ${CPP_FILES} ProjectorQtGL.cpp ${MOCSrcs}) + set(H_FILES ${H_FILES} ProjectorQtGL.h OpenGLContext.h) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_PROJECTORQT) endif(WITH_PROJECTORQT) set(PROJECTOR_DEVICE_LIBS ${DEVICE_LIBS} PARENT_SCOPE) -set(PROJECTOR_DEVICE_DEFS ${DEVICE_DEFS} PARENT_SCOPE) \ No newline at end of file +set(PROJECTOR_DEVICE_DEFS ${DEVICE_DEFS} PARENT_SCOPE) + +add_compiler_export_flags() +add_definitions(${DEVICE_DEFS}) +add_library(slprojector SHARED ${H_FILES} ${CPP_FILES}) +generate_export_header(slprojector) +target_link_libraries(slprojector ${DEVICE_LIBS}) + +if(VTK_QT_VERSION VERSION_GREATER "4") + qt5_use_modules(slprojector Core OpenGL) +else(VTK_QT_VERSION VERSION_GREATER "4") + target_link_libraries(slprojector Qt4::QtCore Qt4::QtOpenGL) +endif(VTK_QT_VERSION VERSION_GREATER "4") diff --git a/src/projector/OpenGLContext.h b/src/projector/OpenGLContext.h index 5019b25..6fd092b 100644 --- a/src/projector/OpenGLContext.h +++ b/src/projector/OpenGLContext.h @@ -13,6 +13,8 @@ #include #include +#include "slprojector_export.h" + struct ScreenInfo { unsigned int resX, resY; unsigned int posX, posY; @@ -21,7 +23,7 @@ struct ScreenInfo { }; // Platform dependent OpenGLContext class -class OpenGLContext{ +class SLPROJECTOR_EXPORT OpenGLContext{ public: // Static "class" methods static std::vector GetScreenInfo(); diff --git a/src/projector/Projector.cpp b/src/projector/Projector.cpp new file mode 100644 index 0000000..a71a4d3 --- /dev/null +++ b/src/projector/Projector.cpp @@ -0,0 +1,6 @@ +#include "Projector.h" + +Projector* Projector::NewProjector() +{ + return 0; +} diff --git a/src/projector/Projector.h b/src/projector/Projector.h index 8b4c700..be99b58 100644 --- a/src/projector/Projector.h +++ b/src/projector/Projector.h @@ -4,9 +4,13 @@ #include #include +#include "slprojector_export.h" + // Abstract Projector base class -class Projector { +class SLPROJECTOR_EXPORT Projector { public: + static Projector* NewProjector(); + // Interface function Projector(){} // Define preset pattern sequence diff --git a/src/projector/ProjectorLC3000.h b/src/projector/ProjectorLC3000.h index db446e1..0cd5992 100644 --- a/src/projector/ProjectorLC3000.h +++ b/src/projector/ProjectorLC3000.h @@ -11,7 +11,7 @@ #include "LC3000API/lcr_cmd.h" // Projector implementation for LightCrafter 3000 USB Api -class ProjectorLC3000 : public Projector { +class SLPROJECTOR_EXPORT ProjectorLC3000 : public Projector { public: // Interface function ProjectorLC3000(unsigned int); diff --git a/src/projector/ProjectorLC4500.h b/src/projector/ProjectorLC4500.h index b0623e3..bb2f1fc 100644 --- a/src/projector/ProjectorLC4500.h +++ b/src/projector/ProjectorLC4500.h @@ -8,7 +8,7 @@ #include "Projector.h" // Projecotr implementation for LightCrafter 4500 USB Api -class ProjectorLC4500 : public Projector { +class SLPROJECTOR_EXPORT ProjectorLC4500 : public Projector { public: // Interface function ProjectorLC4500(unsigned int); diff --git a/src/projector/ProjectorOpenGL.h b/src/projector/ProjectorOpenGL.h index 6f4f99d..56fe55b 100644 --- a/src/projector/ProjectorOpenGL.h +++ b/src/projector/ProjectorOpenGL.h @@ -10,7 +10,7 @@ class OpenGLContext; // ProjectorOpenGL implementations -class ProjectorOpenGL : public Projector { +class SLPROJECTOR_EXPORT ProjectorOpenGL : public Projector { public: // Interface function ProjectorOpenGL(unsigned int _screenNum = 0); diff --git a/src/projector/ProjectorQtGL.h b/src/projector/ProjectorQtGL.h index 53d0662..17ebbb1 100644 --- a/src/projector/ProjectorQtGL.h +++ b/src/projector/ProjectorQtGL.h @@ -141,7 +141,7 @@ public slots: }; // ProjectorOpenGL implementations -class ProjectorQtGL : public Projector +class SLPROJECTOR_EXPORT ProjectorQtGL : public Projector { public: // Interface function From 4f52e5acca16349b0fa8d571fcf70a475a1d85c6 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Fri, 23 Sep 2016 14:02:43 +0200 Subject: [PATCH 20/33] Get rid of projector compile defines in studio --- CMakeLists.txt | 8 +--- src/SLCalibrationDialog.cpp | 34 +++------------ src/SLPreferenceDialog.cpp | 17 ++++---- src/SLScanWorker.cpp | 33 +++------------ src/camera/CMakeLists.txt | 3 -- src/projector/CMakeLists.txt | 23 ++++++----- src/projector/OpenGLContext.h | 11 +---- src/projector/Projector.cpp | 73 ++++++++++++++++++++++++++++++++- src/projector/Projector.h | 45 +++++++++++++------- src/projector/ProjectorLC3000.h | 2 +- src/projector/ProjectorLC4500.h | 2 +- src/projector/ProjectorOpenGL.h | 2 +- src/projector/ProjectorQtGL.h | 2 +- 13 files changed, 138 insertions(+), 117 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f51674..1ff96e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -122,10 +122,6 @@ file(GLOB CPP_FILES src/main.cpp file(GLOB RC_FILES src/SLResources.qrc) -set(PROJECTOR_DEVICE_LIBS) -set(CAMERA_DEVICE_LIBS) -set(PROJECTOR_DEVICE_DEFS) -set(CAMERA_DEVICE_DEFS) #Device Options - camera add_subdirectory(${PROJECT_SOURCE_DIR}/src/camera) #Device Options - projector @@ -134,14 +130,12 @@ add_subdirectory(${PROJECT_SOURCE_DIR}/src/projector) #Algorithms library add_subdirectory(${PROJECT_SOURCE_DIR}/src) -add_definitions(${PROJECTOR_DEVICE_DEFS}) - if(VTK_QT_VERSION VERSION_GREATER "4") qt5_wrap_ui(UISrcs ${UI_FILES}) # CMAKE_AUTOMOC in ON so the MocHdrs will be automatically wrapped. qt5_add_resources(RCC_SRCS ${RC_FILES}) add_executable(slstudio ${CPP_FILES} ${UISrcs} ${H_FILES} ${RCC_SRCS}) - qt5_use_modules(slstudio Core Gui Widgets Test OpenGL) + qt5_use_modules(slstudio Core Gui Widgets Test) add_definitions(${COMPILER_DEFINES}) target_link_libraries(slstudio slalgorithm slcamera slprojector ${VTK_LIBRARIES} ${PCL_LIBRARIES} diff --git a/src/SLCalibrationDialog.cpp b/src/SLCalibrationDialog.cpp index 7a44071..b74db6e 100644 --- a/src/SLCalibrationDialog.cpp +++ b/src/SLCalibrationDialog.cpp @@ -8,22 +8,7 @@ #include "Camera.h" #include "SLProjectorVirtual.h" - -#ifdef WITH_PROJECTOROPENGL -#include "ProjectorOpenGL.h" -#endif - -#ifdef WITH_LC3000API -#include "ProjectorLC3000.h" -#endif - -#ifdef WITH_LC4500API -#include "ProjectorLC4500.h" -#endif - -#ifdef WITH_PROJECTORQT -#include "ProjectorQtGL.h" -#endif +#include "Projector.h" #include "CalibratorLocHom.h" #include "CalibratorRBF.h" @@ -66,23 +51,14 @@ SLCalibrationDialog::SLCalibrationDialog(SLStudio *parent) : QDialog(parent), ui int screenNum = settings.value("projector/screenNumber", -1).toInt(); if(screenNum == -1) projector = new SLProjectorVirtual(screenNum); -#ifdef WITH_PROJECTOROPENGL else if(screenNum >= 0) - projector = new ProjectorOpenGL(screenNum); -#endif -#ifdef WITH_LC3000API + projector = Projector::NewProjector(projectorTypeOpenGL, screenNum); else if(screenNum == -2) - projector = new ProjectorLC3000(0); -#endif -#ifdef WITH_LC4500API + projector = Projector::NewProjector(projectorTypeLC3000); else if(screenNum == -3) - projector = new ProjectorLC4500(0); -#endif -#ifdef WITH_PROJECTORQT + projector = Projector::NewProjector(projectorTypeLC4500); else if(screenNum == -4) - projector = new ProjectorQtGL(); -#endif - + projector = Projector::NewProjector(projectorTypeQtGL); else std::cerr << "SLCalibrationDialog: invalid projector id " << screenNum << std::endl; diff --git a/src/SLPreferenceDialog.cpp b/src/SLPreferenceDialog.cpp index bdc9d67..03d10a5 100644 --- a/src/SLPreferenceDialog.cpp +++ b/src/SLPreferenceDialog.cpp @@ -1,11 +1,9 @@ #include "SLPreferenceDialog.h" #include "ui_SLPreferenceDialog.h" -#ifdef WITH_PROJECTOROPENGL -#include "OpenGLContext.h" -#endif #include "Camera.h" #include "Codec.h" +#include "Projector.h" #include @@ -13,10 +11,11 @@ using namespace std; SLPreferenceDialog::SLPreferenceDialog(QWidget *parent) : QDialog(parent), ui(new Ui::SLPreferenceDialog) { ui->setupUi(this); + std::set availableProjectors = Projector::GetProjectorList(); // Query projectors #ifdef WITH_PROJECTOROPENGL - vector screenList = OpenGLContext::GetScreenInfo(); + vector screenList = Projector::GetScreenInfo(); for(unsigned int i=0; iprojectorComboBox->addItem(screenString, i); @@ -26,16 +25,14 @@ SLPreferenceDialog::SLPreferenceDialog(QWidget *parent) : QDialog(parent), ui(ne // Add virtual projector option ui->projectorComboBox->addItem("SLStudio Virtual Screen", -1); // Add LC3000 option - #ifdef WITH_LC3000API + if (availableProjectors.count(projectorTypeLC3000)) ui->projectorComboBox->addItem("LC3000 API", -2); - #endif // Add LC4500 option - #ifdef WITH_LC4500API + if (availableProjectors.count(projectorTypeLC4500)) ui->projectorComboBox->addItem("LC4500 API", -3); - #endif - #ifdef WITH_PROJECTORQT + + if (availableProjectors.count(projectorTypeQtGL)) ui->projectorComboBox->addItem("Qt GL Window", -4); - #endif // Query cameras vector< vector > interfaceCameraList = Camera::GetInterfaceCameraList(); diff --git a/src/SLScanWorker.cpp b/src/SLScanWorker.cpp index 214945e..f1f9cec 100644 --- a/src/SLScanWorker.cpp +++ b/src/SLScanWorker.cpp @@ -22,22 +22,7 @@ #include "CodecPhaseShiftMicro.h" #include "CodecFastRatio.h" #include "CodecGrayCode.h" - -#ifdef WITH_PROJECTOROPENGL -#include "ProjectorOpenGL.h" -#endif - -#ifdef WITH_LC3000API -#include "ProjectorLC3000.h" -#endif - -#ifdef WITH_LC4500API -#include "ProjectorLC4500.h" -#endif - -#ifdef WITH_PROJECTORQT -#include "ProjectorQtGL.h" -#endif +#include "Projector.h" #include "SLProjectorVirtual.h" #include "SLCameraVirtual.h" @@ -74,22 +59,14 @@ void SLScanWorker::setup(){ int screenNum = settings.value("projector/screenNumber", -1).toInt(); if(screenNum == -1) projector = new SLProjectorVirtual(screenNum); -#ifdef WITH_PROJECTOROPENGL else if(screenNum >= 0) - projector = new ProjectorOpenGL(screenNum); -#endif -#ifdef WITH_LC3000API + projector = Projector::NewProjector(projectorTypeOpenGL, screenNum); else if(screenNum == -2) - projector = new ProjectorLC3000(0); -#endif -#ifdef WITH_LC4500API + projector = Projector::NewProjector(projectorTypeLC3000); else if(screenNum == -3) - projector = new ProjectorLC4500(0); -#endif -#ifdef WITH_PROJECTORQT + projector = Projector::NewProjector(projectorTypeLC4500); else if(screenNum == -4) - projector = new ProjectorQtGL(); -#endif + projector = Projector::NewProjector(projectorTypeQtGL); else std::cerr << "SLScanWorker: invalid projector id " << screenNum << std::endl; diff --git a/src/camera/CMakeLists.txt b/src/camera/CMakeLists.txt index 84e26ec..e8e2402 100644 --- a/src/camera/CMakeLists.txt +++ b/src/camera/CMakeLists.txt @@ -63,9 +63,6 @@ if(WITH_CAMERAOPENCV) set(DEVICE_LIBS ${DEVICE_LIBS} OpenCvCamera) endif(WITH_CAMERAOPENCV) -set(CAMERA_DEVICE_DEFS ${DEVICE_DEFS} PARENT_SCOPE) -set(CAMERA_DEVICE_LIBS ${DEVICE_LIBS} PARENT_SCOPE) - add_compiler_export_flags() add_definitions(${DEVICE_DEFS}) add_library(slcamera SHARED Camera.h Camera.cpp) diff --git a/src/projector/CMakeLists.txt b/src/projector/CMakeLists.txt index 1e822ff..a64d67e 100644 --- a/src/projector/CMakeLists.txt +++ b/src/projector/CMakeLists.txt @@ -14,7 +14,7 @@ if(WITH_LC4500API) else() set(CPP_FILES ${CPP_FILES} LC4500API/hid.Libusb.c) endif() - set(H_FILES ${H_FILES} LC4500API/API.h) + set(H_FILES ${H_FILES} ProjectorLC4500.h LC4500API/API.h) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_LC4500API) if(WIN32) @@ -25,7 +25,7 @@ endif(WITH_LC4500API) if(WITH_LC3000API) set(CPP_FILES ${CPP_FILES} ProjectorLC3000.cpp LC3000API/lcr_cmd.cpp LC3000API/lcr_packetizer.cpp LC3000API/tcp_client.cpp) - set(H_FILES ${H_FILES} LC3000API/lcr_cmd.h) + set(H_FILES ${H_FILES} ProjectorLC3000.h LC3000API/lcr_cmd.h) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_LC3000API) endif(WITH_LC3000API) @@ -49,23 +49,24 @@ if(WITH_PROJECTOROPENGL) endif(WITH_PROJECTOROPENGL) if(WITH_PROJECTORQT) - qt4_wrap_cpp(MOCSrcs ProjectorQtGL.h) + if(VTK_QT_VERSION VERSION_LESS "5") + qt4_wrap_cpp(MOCSrcs ProjectorQtGL.h) + endif(VTK_QT_VERSION VERSION_LESS "5") set(CPP_FILES ${CPP_FILES} ProjectorQtGL.cpp ${MOCSrcs}) set(H_FILES ${H_FILES} ProjectorQtGL.h OpenGLContext.h) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_PROJECTORQT) endif(WITH_PROJECTORQT) -set(PROJECTOR_DEVICE_LIBS ${DEVICE_LIBS} PARENT_SCOPE) -set(PROJECTOR_DEVICE_DEFS ${DEVICE_DEFS} PARENT_SCOPE) - add_compiler_export_flags() add_definitions(${DEVICE_DEFS}) add_library(slprojector SHARED ${H_FILES} ${CPP_FILES}) generate_export_header(slprojector) target_link_libraries(slprojector ${DEVICE_LIBS}) -if(VTK_QT_VERSION VERSION_GREATER "4") - qt5_use_modules(slprojector Core OpenGL) -else(VTK_QT_VERSION VERSION_GREATER "4") - target_link_libraries(slprojector Qt4::QtCore Qt4::QtOpenGL) -endif(VTK_QT_VERSION VERSION_GREATER "4") +if(WITH_PROJECTORQT) + if(VTK_QT_VERSION VERSION_GREATER "4") + qt5_use_modules(slprojector Core OpenGL) + else(VTK_QT_VERSION VERSION_GREATER "4") + target_link_libraries(slprojector Qt4::QtCore Qt4::QtOpenGL) + endif(VTK_QT_VERSION VERSION_GREATER "4") +endif(WITH_PROJECTORQT) diff --git a/src/projector/OpenGLContext.h b/src/projector/OpenGLContext.h index 6fd092b..d7007dc 100644 --- a/src/projector/OpenGLContext.h +++ b/src/projector/OpenGLContext.h @@ -13,17 +13,10 @@ #include #include -#include "slprojector_export.h" - -struct ScreenInfo { - unsigned int resX, resY; - unsigned int posX, posY; - std::string name; - ScreenInfo(): resX(0), resY(0), posX(0), posY(0){} -}; +#include "Projector.h" // Platform dependent OpenGLContext class -class SLPROJECTOR_EXPORT OpenGLContext{ +class OpenGLContext{ public: // Static "class" methods static std::vector GetScreenInfo(); diff --git a/src/projector/Projector.cpp b/src/projector/Projector.cpp index a71a4d3..7dfe8f4 100644 --- a/src/projector/Projector.cpp +++ b/src/projector/Projector.cpp @@ -1,6 +1,75 @@ #include "Projector.h" -Projector* Projector::NewProjector() +#ifdef WITH_PROJECTOROPENGL +#include "OpenGLContext.h" +#include "ProjectorOpenGL.h" +#endif + +#ifdef WITH_LC3000API +#include "ProjectorLC3000.h" +#endif + +#ifdef WITH_LC4500API +#include "ProjectorLC4500.h" +#endif + +#ifdef WITH_PROJECTORQT +#include "ProjectorQtGL.h" +#endif + +Projector* Projector::NewProjector(ProjectorType projector, unsigned int screenNum) +{ + switch(projector) + { +#ifdef WITH_PROJECTOROPENGL + case projectorTypeOpenGL: + return new ProjectorOpenGL(screenNum); +#endif +#ifdef WITH_LC3000API + case projectorTypeLC3000: + return new ProjectorLC3000(0); +#endif +#ifdef WITH_LC4500API + case projectorTypeLC4500: + return new ProjectorLC4500(0); +#endif +#ifdef WITH_PROJECTORQT + case projectorTypeQtGL: + return new ProjectorQtGL(); +#endif + default: + return 0; + } +} + +std::set Projector::GetProjectorList() +{ + std::set projectorList; + +#ifdef WITH_PROJECTOROPENGL + projectorList.insert(projectorTypeOpenGL); +#endif + +#ifdef WITH_LC3000API + projectorList.insert(projectorTypeLC3000); +#endif + +#ifdef WITH_LC4500API + projectorList.insert(projectorTypeLC4500); +#endif + +#ifdef WITH_PROJECTORQT + projectorList.insert(projectorTypeQtGL); +#endif + + return projectorList; +} + +std::vector Projector::GetScreenInfo() { - return 0; +#ifdef WITH_PROJECTOROPENGL + return OpenGLContext::GetScreenInfo(); +#else + return std::vector(); +#endif } diff --git a/src/projector/Projector.h b/src/projector/Projector.h index be99b58..89712dc 100644 --- a/src/projector/Projector.h +++ b/src/projector/Projector.h @@ -2,27 +2,44 @@ #define PROJECTOR_H #include +#include #include #include "slprojector_export.h" +enum ProjectorType { + projectorTypeOpenGL, + projectorTypeLC3000, + projectorTypeLC4500, + projectorTypeQtGL +}; + +struct ScreenInfo { + unsigned int resX, resY; + unsigned int posX, posY; + std::string name; + ScreenInfo(): resX(0), resY(0), posX(0), posY(0){} +}; + // Abstract Projector base class class SLPROJECTOR_EXPORT Projector { - public: - static Projector* NewProjector(); +public: + static std::set GetProjectorList(); + static Projector* NewProjector(ProjectorType projector, unsigned int screenNum = 0); + static std::vector GetScreenInfo(); - // Interface function - Projector(){} - // Define preset pattern sequence - virtual void setPattern(unsigned int patternNumber, const unsigned char *tex, unsigned int texWidth, unsigned int texHeight) = 0; - virtual void displayPattern(unsigned int patternNumber) = 0; - // Upload and display pattern on the fly - virtual void displayTexture(const unsigned char *tex, unsigned int width, unsigned int height) = 0; - // Monochrome color display - virtual void displayBlack() = 0; - virtual void displayWhite() = 0; - virtual void getScreenRes(unsigned int *nx, unsigned int *ny) = 0; - virtual ~Projector(){} + // Interface function + Projector(){} + // Define preset pattern sequence + virtual void setPattern(unsigned int patternNumber, const unsigned char *tex, unsigned int texWidth, unsigned int texHeight) = 0; + virtual void displayPattern(unsigned int patternNumber) = 0; + // Upload and display pattern on the fly + virtual void displayTexture(const unsigned char *tex, unsigned int width, unsigned int height) = 0; + // Monochrome color display + virtual void displayBlack() = 0; + virtual void displayWhite() = 0; + virtual void getScreenRes(unsigned int *nx, unsigned int *ny) = 0; + virtual ~Projector(){} }; #endif diff --git a/src/projector/ProjectorLC3000.h b/src/projector/ProjectorLC3000.h index 0cd5992..db446e1 100644 --- a/src/projector/ProjectorLC3000.h +++ b/src/projector/ProjectorLC3000.h @@ -11,7 +11,7 @@ #include "LC3000API/lcr_cmd.h" // Projector implementation for LightCrafter 3000 USB Api -class SLPROJECTOR_EXPORT ProjectorLC3000 : public Projector { +class ProjectorLC3000 : public Projector { public: // Interface function ProjectorLC3000(unsigned int); diff --git a/src/projector/ProjectorLC4500.h b/src/projector/ProjectorLC4500.h index bb2f1fc..b0623e3 100644 --- a/src/projector/ProjectorLC4500.h +++ b/src/projector/ProjectorLC4500.h @@ -8,7 +8,7 @@ #include "Projector.h" // Projecotr implementation for LightCrafter 4500 USB Api -class SLPROJECTOR_EXPORT ProjectorLC4500 : public Projector { +class ProjectorLC4500 : public Projector { public: // Interface function ProjectorLC4500(unsigned int); diff --git a/src/projector/ProjectorOpenGL.h b/src/projector/ProjectorOpenGL.h index 56fe55b..6f4f99d 100644 --- a/src/projector/ProjectorOpenGL.h +++ b/src/projector/ProjectorOpenGL.h @@ -10,7 +10,7 @@ class OpenGLContext; // ProjectorOpenGL implementations -class SLPROJECTOR_EXPORT ProjectorOpenGL : public Projector { +class ProjectorOpenGL : public Projector { public: // Interface function ProjectorOpenGL(unsigned int _screenNum = 0); diff --git a/src/projector/ProjectorQtGL.h b/src/projector/ProjectorQtGL.h index 17ebbb1..53d0662 100644 --- a/src/projector/ProjectorQtGL.h +++ b/src/projector/ProjectorQtGL.h @@ -141,7 +141,7 @@ public slots: }; // ProjectorOpenGL implementations -class SLPROJECTOR_EXPORT ProjectorQtGL : public Projector +class ProjectorQtGL : public Projector { public: // Interface function From 419c27ae5cf25d76d486c66a5f3d35c94aa3a2d0 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Fri, 23 Sep 2016 14:03:06 +0200 Subject: [PATCH 21/33] Remove static camera libraries --- src/camera/CMakeLists.txt | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/camera/CMakeLists.txt b/src/camera/CMakeLists.txt index e8e2402..fc855e8 100644 --- a/src/camera/CMakeLists.txt +++ b/src/camera/CMakeLists.txt @@ -2,6 +2,8 @@ include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/camera) set(DEVICE_LIBS) set(DEVICE_DEFS) +set(H_FILES Camera.h) +set(CPP_FILES Camera.cpp) if(WITH_CAMERAXIMEA) include("${CMAKE_SOURCE_DIR}/cmake/FindXimea.cmake") @@ -13,8 +15,9 @@ if(WITH_CAMERAXIMEA) set(XIMEA_LIBRARY xiapi64) endif() include_directories(${XIMEA_PATH}) - add_library(XimeaCamera STATIC CameraXIMEA.cpp CameraXIMEA.h) - set(DEVICE_LIBS ${DEVICE_LIBS} XimeaCamera ${IDS_LIBRARY}) + set(H_FILES ${H_FILES} CameraXIMEA.h) + set(CPP_FILES ${CPP_FILES} CameraXIMEA.cpp) + set(DEVICE_LIBS ${DEVICE_LIBS} ${XIMEA_LIBRARY}) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_CAMERAXIMEA) else(XIMEA_FOUND) message(SEND_ERROR "Could not find Ximea camera support.") @@ -25,8 +28,9 @@ if(WITH_CAMERAIDSIMAGING) include("${CMAKE_SOURCE_DIR}/cmake/FindIds.cmake") if(IDS_FOUND) include_directories(${IDS_PATH}) - add_library(IdsCamera STATIC CameraIDSImaging.cpp CameraIDSImaging.h) - set(DEVICE_LIBS ${DEVICE_LIBS} IdsCamera ${IDS_LIBRARY}) + set(H_FILES ${H_FILES} CameraIDSImaging.h) + set(CPP_FILES ${CPP_FILES} CameraIDSImaging.cpp) + set(DEVICE_LIBS ${DEVICE_LIBS} ${IDS_LIBRARY}) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_CAMERAIDSIMAGING) else(IDS_FOUND) message(SEND_ERROR "Could not find IDS uEye camera support.") @@ -34,8 +38,8 @@ if(WITH_CAMERAIDSIMAGING) endif(WITH_CAMERAIDSIMAGING) if(WITH_CAMERAIDC) - add_library(IdcCamera STATIC CameraIIDC.cpp CameraIIDC.h) - set(DEVICE_LIBS ${DEVICE_LIBS} IdcCamera) + set(H_FILES ${H_FILES} CameraIIDC.h) + set(CPP_FILES ${CPP_FILES} CameraIIDC.cpp) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_CAMERAIDC) endif(WITH_CAMERAIDC) @@ -43,8 +47,9 @@ if(WITH_CAMERAPOINTGREY) include("${CMAKE_SOURCE_DIR}/cmake/FindPointGrey.cmake") if(POINTGREY_FOUND) include_directories(${POINTGREY_PATH}) - add_library(PointGreyCamera STATIC CameraPointGrey.cpp CameraPointGrey.h) - set(DEVICE_LIBS ${DEVICE_LIBS} PointGreyCamera ${POINTGREY_LIBRARY}) + set(H_FILES ${H_FILES} CameraPointGrey.h) + set(CPP_FILES ${CPP_FILES} CameraPointGrey.cpp) + set(DEVICE_LIBS ${DEVICE_LIBS} ${POINTGREY_LIBRARY}) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_CAMERAPOINTGREY) else(POINTGREY_FOUND) message(SEND_ERROR "Could not find PointGrey camera camera support.") @@ -52,23 +57,23 @@ if(WITH_CAMERAPOINTGREY) endif(WITH_CAMERAPOINTGREY) if(WITH_CAMERAV4L) - add_library(V4LCamera STATIC CameraV4L.cpp CameraV4L.h) - set(DEVICE_LIBS ${DEVICE_LIBS} V4LCamera) + set(H_FILES ${H_FILES} CameraV4L.h) + set(CPP_FILES ${CPP_FILES} CameraV4L.cpp) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_CAMERAV4L) endif(WITH_CAMERAV4L) if(WITH_CAMERAOPENCV) - add_library(OpenCvCamera STATIC CameraOpenCV.cpp CameraOpenCV.h) + set(H_FILES ${H_FILES} CameraOpenCV.h) + set(CPP_FILES ${CPP_FILES} CameraOpenCV.cpp) + set(DEVICE_LIBS ${DEVICE_LIBS} ${OpenCV_LIBS}) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_CAMERAOPENCV) - set(DEVICE_LIBS ${DEVICE_LIBS} OpenCvCamera) endif(WITH_CAMERAOPENCV) add_compiler_export_flags() add_definitions(${DEVICE_DEFS}) -add_library(slcamera SHARED Camera.h Camera.cpp) +add_library(slcamera SHARED ${H_FILES} ${CPP_FILES}) generate_export_header(slcamera) target_link_libraries(slcamera ${DEVICE_LIBS} - ${OpenCV_LIBS} ${Boost_LIBRARIES} ) From b25f18dec32c5bd7645acaf8921d81b9f1fce72a Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Wed, 28 Sep 2016 21:19:32 +0200 Subject: [PATCH 22/33] Build only libraries if PCL and VTK are not available --- CMakeLists.txt | 112 ++++++++++++++++------------------- cmake/FindGlew.cmake | 17 +++--- src/camera/CMakeLists.txt | 7 +++ src/projector/CMakeLists.txt | 15 +++-- 4 files changed, 79 insertions(+), 72 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ff96e5..01d95b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,33 +6,40 @@ include(GenerateExportHeader) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) project(slstudio) -find_package(PCL REQUIRED) -find_package(VTK REQUIRED) find_package(OpenCV REQUIRED) +if(OpenCV_VERSION VERSION_LESS "3") + add_definitions(-DOPENCV2) +endif(OpenCV_VERSION VERSION_LESS "3") + +find_package(Glew) +find_package(OpenGL) + +find_package(PCL) +find_package(VTK) find_package(Boost 1.47 COMPONENTS chrono filesystem system timer REQUIRED) -find_package(Glew REQUIRED) -find_package(OpenGL REQUIRED) -if(VTK_QT_VERSION VERSION_GREATER "4") +set(USE_QT5 true) +if(VTK_FOUND) + if(VTK_QT_VERSION VERSION_LESS "5") + set(USE_QT5 false) + endif(VTK_QT_VERSION VERSION_LESS "5") +endif(VTK_FOUND) + +if(${USE_QT5}) find_package(Qt5 COMPONENTS Core Gui Test Widgets OpenGL REQUIRED) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) -else(VTK_QT_VERSION VERSION_GREATER "4") +else() #Legacy qt4 support find_package(Qt4 REQUIRED QtCore QtGui QtTest QtOpenGL) include(${QT_USE_FILE}) -endif(VTK_QT_VERSION VERSION_GREATER "4") - -if(OpenCV_VERSION VERSION_LESS "3") - add_definitions(-DOPENCV2) -endif(OpenCV_VERSION VERSION_LESS "3") +endif() include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src/camera ${CMAKE_CURRENT_BINARY_DIR}/src/projector ${PCL_INCLUDE_DIRS} ${VTK_DIR} ${OpenCV_INCLUDE_DIRS} ${Boost_INCLUDE_DIR} ${GLEW_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}) -include(${VTK_USE_FILE}) include_directories(${PROJECT_SOURCE_DIR}/src/camera) include_directories(${PROJECT_SOURCE_DIR}/src/projector) @@ -41,26 +48,17 @@ include_directories(${PROJECT_SOURCE_DIR}/src/triangulator) include_directories(${PROJECT_SOURCE_DIR}/src/calibrator) include_directories(${PROJECT_SOURCE_DIR}/src/tracker) -add_definitions(${PCL_DEFINITIONS}) +add_subdirectory(${PROJECT_SOURCE_DIR}/src) +add_subdirectory(${PROJECT_SOURCE_DIR}/src/camera) +add_subdirectory(${PROJECT_SOURCE_DIR}/src/projector) -set(QT_USE_QTOPENGL TRUE) +include(${VTK_USE_FILE}) +add_definitions(${PCL_DEFINITIONS}) #generate cmake config header file configure_file(${PROJECT_SOURCE_DIR}/slconfig.h.in ${PROJECT_BINARY_DIR}/slconfig.h) -option(WITH_CAMERAXIMEA "Use Ximea camera" OFF) -option(WITH_CAMERAIIDC "Use IIDC camera" OFF) -option(WITH_CAMERAIDSIMAGING "Use IDS camera" OFF) -option(WITH_CAMERAPOINTGREY "Use Pointgrey camera" OFF) -option(WITH_CAMERAV4L "Use V4L camera" OFF) -option(WITH_CAMERAOPENCV "Use OpenCV camera" OFF) - -option(WITH_LC3000API "Use LightCrafter 3000 projector" ON) -option(WITH_LC4500API "Use LightCrafter 4500 projector" ON) -option(WITH_PROJECTOROPENGL "Use OpenGL projector" ON) -option(WITH_PROJECTORQT "Use Qt projector" ON) - #Set source file set file(GLOB UI_FILES src/SLStudio.ui src/SLPreferenceDialog.ui @@ -122,39 +120,33 @@ file(GLOB CPP_FILES src/main.cpp file(GLOB RC_FILES src/SLResources.qrc) -#Device Options - camera -add_subdirectory(${PROJECT_SOURCE_DIR}/src/camera) -#Device Options - projector -add_subdirectory(${PROJECT_SOURCE_DIR}/src/projector) - -#Algorithms library -add_subdirectory(${PROJECT_SOURCE_DIR}/src) - -if(VTK_QT_VERSION VERSION_GREATER "4") - qt5_wrap_ui(UISrcs ${UI_FILES}) - # CMAKE_AUTOMOC in ON so the MocHdrs will be automatically wrapped. - qt5_add_resources(RCC_SRCS ${RC_FILES}) - add_executable(slstudio ${CPP_FILES} ${UISrcs} ${H_FILES} ${RCC_SRCS}) - qt5_use_modules(slstudio Core Gui Widgets Test) - add_definitions(${COMPILER_DEFINES}) - target_link_libraries(slstudio slalgorithm slcamera slprojector - ${VTK_LIBRARIES} ${PCL_LIBRARIES} - ${OpenCV_LIBS} ${Boost_LIBRARIES}) -else(VTK_QT_VERSION VERSION_GREATER "4") - #Legacy qt4 support - - qt4_wrap_ui(UISrcs ${UI_FILES}) - qt4_wrap_cpp(MOCSrcs ${H_FILES}) - qt4_add_resources(RCC_SRCS ${RC_FILES}) - - add_executable(slstudio ${CPP_FILES} ${UISrcs} ${MOCSrcs} ${RCC_SRCS}) - target_link_libraries(slstudio slalgorithm slcamera slprojector - Qt4::QtTest ${VTK_LIBRARIES} ${PCL_LIBRARIES} - ${OpenCV_LIBS} ${Boost_LIBRARIES}) -endif(VTK_QT_VERSION VERSION_GREATER "4") - -if(MSVC) - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/wd4819 /wd4996" ) -endif(MSVC) +if(VTK_FOUND AND PCL_FOUND) + if(USE_QT5) + qt5_wrap_ui(UISrcs ${UI_FILES}) + # CMAKE_AUTOMOC in ON so the MocHdrs will be automatically wrapped. + qt5_add_resources(RCC_SRCS ${RC_FILES}) + add_executable(slstudio ${CPP_FILES} ${UISrcs} ${H_FILES} ${RCC_SRCS}) + qt5_use_modules(slstudio Core Gui Widgets Test) + add_definitions(${COMPILER_DEFINES}) + target_link_libraries(slstudio slalgorithm slcamera slprojector + ${VTK_LIBRARIES} ${PCL_LIBRARIES} + ${OpenCV_LIBS} ${Boost_LIBRARIES}) + else(USE_QT5) + #Legacy qt4 support + + qt4_wrap_ui(UISrcs ${UI_FILES}) + qt4_wrap_cpp(MOCSrcs ${H_FILES}) + qt4_add_resources(RCC_SRCS ${RC_FILES}) + + add_executable(slstudio ${CPP_FILES} ${UISrcs} ${MOCSrcs} ${RCC_SRCS}) + target_link_libraries(slstudio slalgorithm slcamera slprojector + Qt4::QtTest ${VTK_LIBRARIES} ${PCL_LIBRARIES} + ${OpenCV_LIBS} ${Boost_LIBRARIES}) + endif(USE_QT5) + + if(MSVC) + set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/wd4819 /wd4996" ) + endif(MSVC) +endif() diff --git a/cmake/FindGlew.cmake b/cmake/FindGlew.cmake index ca481a2..e51b525 100644 --- a/cmake/FindGlew.cmake +++ b/cmake/FindGlew.cmake @@ -1,15 +1,18 @@ -set(GLEW_FOUND) +set(GLEW_FOUND false) set(GLEW_PATH) set(GLEW_LIBRARY) -if(UNIX) - find_path(GLEW_PATH glew.h) - if(EXISTS ${GLEW_PATH}) - find_library(GLEW_LIBRARY GLEW) +find_path(GLEW_PATH glew.h) + +if(EXISTS ${GLEW_PATH}) + if(UNIX) + find_library(GLEW_LIBRARY GLEW) + else() + find_library(GLEW_LIBRARY glew32.lib) + endif() if(EXISTS ${GLEW_LIBRARY}) - set(GLEW_FOUND 1) + set(GLEW_FOUND 1) endif() - endif() endif() mark_as_advanced(FORCE GLEW_FOUND) diff --git a/src/camera/CMakeLists.txt b/src/camera/CMakeLists.txt index fc855e8..a9d176b 100644 --- a/src/camera/CMakeLists.txt +++ b/src/camera/CMakeLists.txt @@ -5,6 +5,13 @@ set(DEVICE_DEFS) set(H_FILES Camera.h) set(CPP_FILES Camera.cpp) +option(WITH_CAMERAXIMEA "Use Ximea camera" OFF) +option(WITH_CAMERAIIDC "Use IIDC camera" OFF) +option(WITH_CAMERAIDSIMAGING "Use IDS camera" OFF) +option(WITH_CAMERAPOINTGREY "Use Pointgrey camera" OFF) +option(WITH_CAMERAV4L "Use V4L camera" OFF) +option(WITH_CAMERAOPENCV "Use OpenCV camera" OFF) + if(WITH_CAMERAXIMEA) include("${CMAKE_SOURCE_DIR}/cmake/FindXimea.cmake") if(XIMEA_FOUND) diff --git a/src/projector/CMakeLists.txt b/src/projector/CMakeLists.txt index a64d67e..66fa835 100644 --- a/src/projector/CMakeLists.txt +++ b/src/projector/CMakeLists.txt @@ -5,6 +5,11 @@ set(DEVICE_DEFS) set(H_FILES Projector.h) set(CPP_FILES Projector.cpp) +option(WITH_LC3000API "Use LightCrafter 3000 projector" ON) +option(WITH_LC4500API "Use LightCrafter 4500 projector" ON) +option(WITH_PROJECTOROPENGL "Use OpenGL projector" ON) +option(WITH_PROJECTORQT "Use Qt projector" ON) + if(WITH_LC4500API) set(CPP_FILES ${CPP_FILES} ProjectorLC4500.cpp LC4500API/API.cpp LC4500API/usb.cpp) if(APPLE) @@ -49,9 +54,9 @@ if(WITH_PROJECTOROPENGL) endif(WITH_PROJECTOROPENGL) if(WITH_PROJECTORQT) - if(VTK_QT_VERSION VERSION_LESS "5") + if(NOT ${USE_QT5}) qt4_wrap_cpp(MOCSrcs ProjectorQtGL.h) - endif(VTK_QT_VERSION VERSION_LESS "5") + endif() set(CPP_FILES ${CPP_FILES} ProjectorQtGL.cpp ${MOCSrcs}) set(H_FILES ${H_FILES} ProjectorQtGL.h OpenGLContext.h) set(DEVICE_DEFS ${DEVICE_DEFS} -DWITH_PROJECTORQT) @@ -64,9 +69,9 @@ generate_export_header(slprojector) target_link_libraries(slprojector ${DEVICE_LIBS}) if(WITH_PROJECTORQT) - if(VTK_QT_VERSION VERSION_GREATER "4") + if(${USE_QT5}) qt5_use_modules(slprojector Core OpenGL) - else(VTK_QT_VERSION VERSION_GREATER "4") + else() target_link_libraries(slprojector Qt4::QtCore Qt4::QtOpenGL) - endif(VTK_QT_VERSION VERSION_GREATER "4") + endif() endif(WITH_PROJECTORQT) From f6aa3ce0108e7b608d22c2a2d2f822854ba5f58e Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Fri, 21 Oct 2016 21:31:40 +0200 Subject: [PATCH 23/33] Fix build without PCL and VTK --- CMakeLists.txt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 01d95b7..6c295c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,8 +38,8 @@ endif() include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/src/camera ${CMAKE_CURRENT_BINARY_DIR}/src/projector - ${PCL_INCLUDE_DIRS} ${VTK_DIR} ${OpenCV_INCLUDE_DIRS} - ${Boost_INCLUDE_DIR} ${GLEW_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}) + ${OpenCV_INCLUDE_DIRS} ${Boost_INCLUDE_DIR} + ${GLEW_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR}) include_directories(${PROJECT_SOURCE_DIR}/src/camera) include_directories(${PROJECT_SOURCE_DIR}/src/projector) @@ -52,9 +52,6 @@ add_subdirectory(${PROJECT_SOURCE_DIR}/src) add_subdirectory(${PROJECT_SOURCE_DIR}/src/camera) add_subdirectory(${PROJECT_SOURCE_DIR}/src/projector) -include(${VTK_USE_FILE}) -add_definitions(${PCL_DEFINITIONS}) - #generate cmake config header file configure_file(${PROJECT_SOURCE_DIR}/slconfig.h.in ${PROJECT_BINARY_DIR}/slconfig.h) @@ -121,6 +118,12 @@ file(GLOB CPP_FILES src/main.cpp file(GLOB RC_FILES src/SLResources.qrc) if(VTK_FOUND AND PCL_FOUND) + include(${VTK_USE_FILE}) + add_definitions(${PCL_DEFINITIONS}) + + + include_directories(${PCL_INCLUDE_DIRS} ${VTK_DIR}) + if(USE_QT5) qt5_wrap_ui(UISrcs ${UI_FILES}) # CMAKE_AUTOMOC in ON so the MocHdrs will be automatically wrapped. From 46cf2c627155dc3158521d85dc932284ae05a88f Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Fri, 21 Oct 2016 21:43:43 +0200 Subject: [PATCH 24/33] Disable lightcrafter support per default --- src/projector/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/projector/CMakeLists.txt b/src/projector/CMakeLists.txt index 66fa835..46db044 100644 --- a/src/projector/CMakeLists.txt +++ b/src/projector/CMakeLists.txt @@ -5,8 +5,8 @@ set(DEVICE_DEFS) set(H_FILES Projector.h) set(CPP_FILES Projector.cpp) -option(WITH_LC3000API "Use LightCrafter 3000 projector" ON) -option(WITH_LC4500API "Use LightCrafter 4500 projector" ON) +option(WITH_LC3000API "Use LightCrafter 3000 projector" OFF) +option(WITH_LC4500API "Use LightCrafter 4500 projector" OFF) option(WITH_PROJECTOROPENGL "Use OpenGL projector" ON) option(WITH_PROJECTORQT "Use Qt projector" ON) From 2698d4cf6ed251a7503c8c80034ec68414d601ad Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Wed, 26 Oct 2016 22:08:17 +0200 Subject: [PATCH 25/33] Add (empty) factory functions for codecs --- src/CMakeLists.txt | 1 + src/codec/Codec.cpp | 11 +++++++++++ src/codec/Codec.h | 21 +++++++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 src/codec/Codec.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d95774b..7e64109 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -28,6 +28,7 @@ set(HEADERS set(SOURCES cvtools.cpp + codec/Codec.cpp codec/phaseunwrap.cpp codec/phasecorr.cpp codec/CodecCalibration.cpp diff --git a/src/codec/Codec.cpp b/src/codec/Codec.cpp new file mode 100644 index 0000000..95986aa --- /dev/null +++ b/src/codec/Codec.cpp @@ -0,0 +1,11 @@ +#include "Codec.h" + +Encoder* Encoder::NewEncoder(CodecType codec, unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir) +{ + return 0; +} + +Decoder* Decoder::NewDecoder(CodecType codec, unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir) +{ + return 0; +} diff --git a/src/codec/Codec.h b/src/codec/Codec.h index 17b61b8..64fac2f 100644 --- a/src/codec/Codec.h +++ b/src/codec/Codec.h @@ -6,6 +6,23 @@ #include "slalgorithm_export.h" +enum CodecType { + codecTypeGrayCode, + codecTypeFastRatio, + codecTypePhaseShift2p1, + codecTypePhaseShift2x3, + codecTypePhaseShift3, + codecPhaseShift3FastWrap, + codecPhaseShift3Unwrap, + codecPhaseShift4, + codecGrayCode, + codecPhaseShift2p1, + codecFastRatio, + codecPhaseShiftModulated, + codecPhaseShiftMicro, + codecPhaseShiftNStep +}; + enum CodecDir {CodecDirNone = 0, CodecDirHorizontal = 1 << 0, CodecDirVertical = 1 << 1, @@ -14,6 +31,8 @@ enum CodecDir {CodecDirNone = 0, // Base class for all encoders class SLALGORITHM_EXPORT Encoder { public: + static Encoder* NewEncoder(CodecType codec, unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir = CodecDirHorizontal); + Encoder(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir = CodecDirHorizontal) : N(0),screenCols(_screenCols), screenRows(_screenRows), dir(_dir){} unsigned int getNPatterns(){return N;} CodecDir getDir(){return dir;} @@ -28,6 +47,8 @@ class SLALGORITHM_EXPORT Encoder { class SLALGORITHM_EXPORT Decoder { public: + static Decoder* NewDecoder(CodecType codec, unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir = CodecDirHorizontal); + Decoder(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir = CodecDirHorizontal) : N(0), screenCols(_screenCols), screenRows(_screenRows), dir(_dir){} unsigned int getNPatterns(){return N;} CodecDir getDir(){return dir;} From acd939697b9f396d9c8ed6a31f091deda2d6157c Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Thu, 27 Oct 2016 20:57:45 +0200 Subject: [PATCH 26/33] Implement factory function for codecs --- src/codec/Codec.cpp | 69 ++++++++++++++++++++++++++++++++++--- src/codec/Codec.h | 21 +++++------ src/projector/Projector.cpp | 12 +++---- 3 files changed, 78 insertions(+), 24 deletions(-) diff --git a/src/codec/Codec.cpp b/src/codec/Codec.cpp index 95986aa..84ba72b 100644 --- a/src/codec/Codec.cpp +++ b/src/codec/Codec.cpp @@ -1,11 +1,72 @@ #include "Codec.h" -Encoder* Encoder::NewEncoder(CodecType codec, unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir) -{ - return 0; +#include "CodecPhaseShift2x3.h" +#include "CodecPhaseShift3.h" +#include "CodecPhaseShift3FastWrap.h" +#include "CodecPhaseShift3Unwrap.h" +#include "CodecPhaseShift4.h" +#include "CodecPhaseShift2p1.h" +#include "CodecFastRatio.h" +#include "CodecGrayCode.h" +#include "CodecPhaseShiftModulated.h" +#include "CodecPhaseShiftMicro.h" +#include "CodecPhaseShiftNStep.h" + +Encoder* Encoder::NewEncoder(CodecType codec, unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir){ + switch (codec){ + case codecTypePhaseShift2x3: + return new EncoderPhaseShift2x3(_screenCols, _screenRows, _dir); + case codecTypePhaseShift3: + return new EncoderPhaseShift3(_screenCols, _screenRows, _dir); + case codecTypePhaseShift3FastWrap: + return new EncoderPhaseShift3FastWrap(_screenCols, _screenRows, _dir); + case codecTypePhaseShift3Unwrap: + return new EncoderPhaseShift3FastWrap(_screenCols, _screenRows, _dir); + case codecTypePhaseShift4: + return new EncoderPhaseShift4(_screenCols, _screenRows, _dir); + case codecTypeGrayCode: + return new EncoderGrayCode(_screenCols, _screenRows, _dir); + case codecTypePhaseShift2p1: + return new EncoderPhaseShift2p1(_screenCols, _screenRows, _dir); + case codecTypeFastRatio: + return new EncoderFastRatio(_screenCols, _screenRows, _dir); + case codecTypePhaseShiftModulated: + return new EncoderPhaseShiftModulated(_screenCols, _screenRows, _dir); + case codecTypePhaseShiftMicro: + return new EncoderPhaseShiftMicro(_screenCols, _screenRows, _dir); + case codecTypePhaseShiftNStep: + return new EncoderPhaseShiftNStep(_screenCols, _screenRows, _dir); + default: + return 0; + } } Decoder* Decoder::NewDecoder(CodecType codec, unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir) { - return 0; + switch (codec){ + case codecTypePhaseShift2x3: + return new DecoderPhaseShift2x3(_screenCols, _screenRows, _dir); + case codecTypePhaseShift3: + return new DecoderPhaseShift3(_screenCols, _screenRows, _dir); + case codecTypePhaseShift3FastWrap: + return new DecoderPhaseShift3FastWrap(_screenCols, _screenRows, _dir); + case codecTypePhaseShift3Unwrap: + return new DecoderPhaseShift3FastWrap(_screenCols, _screenRows, _dir); + case codecTypePhaseShift4: + return new DecoderPhaseShift4(_screenCols, _screenRows, _dir); + case codecTypeGrayCode: + return new DecoderGrayCode(_screenCols, _screenRows, _dir); + case codecTypePhaseShift2p1: + return new DecoderPhaseShift2p1(_screenCols, _screenRows, _dir); + case codecTypeFastRatio: + return new DecoderFastRatio(_screenCols, _screenRows, _dir); + case codecTypePhaseShiftModulated: + return new DecoderPhaseShiftModulated(_screenCols, _screenRows, _dir); + case codecTypePhaseShiftMicro: + return new DecoderPhaseShiftMicro(_screenCols, _screenRows, _dir); + case codecTypePhaseShiftNStep: + return new DecoderPhaseShiftNStep(_screenCols, _screenRows, _dir); + default: + return 0; + } } diff --git a/src/codec/Codec.h b/src/codec/Codec.h index 64fac2f..eae0929 100644 --- a/src/codec/Codec.h +++ b/src/codec/Codec.h @@ -7,20 +7,17 @@ #include "slalgorithm_export.h" enum CodecType { - codecTypeGrayCode, - codecTypeFastRatio, - codecTypePhaseShift2p1, codecTypePhaseShift2x3, codecTypePhaseShift3, - codecPhaseShift3FastWrap, - codecPhaseShift3Unwrap, - codecPhaseShift4, - codecGrayCode, - codecPhaseShift2p1, - codecFastRatio, - codecPhaseShiftModulated, - codecPhaseShiftMicro, - codecPhaseShiftNStep + codecTypePhaseShift3FastWrap, + codecTypePhaseShift3Unwrap, + codecTypePhaseShift4, + codecTypeGrayCode, + codecTypePhaseShift2p1, + codecTypeFastRatio, + codecTypePhaseShiftModulated, + codecTypePhaseShiftMicro, + codecTypePhaseShiftNStep }; enum CodecDir {CodecDirNone = 0, diff --git a/src/projector/Projector.cpp b/src/projector/Projector.cpp index 7dfe8f4..401a7ba 100644 --- a/src/projector/Projector.cpp +++ b/src/projector/Projector.cpp @@ -17,10 +17,8 @@ #include "ProjectorQtGL.h" #endif -Projector* Projector::NewProjector(ProjectorType projector, unsigned int screenNum) -{ - switch(projector) - { +Projector* Projector::NewProjector(ProjectorType projector, unsigned int screenNum){ + switch(projector){ #ifdef WITH_PROJECTOROPENGL case projectorTypeOpenGL: return new ProjectorOpenGL(screenNum); @@ -42,8 +40,7 @@ Projector* Projector::NewProjector(ProjectorType projector, unsigned int screenN } } -std::set Projector::GetProjectorList() -{ +std::set Projector::GetProjectorList(){ std::set projectorList; #ifdef WITH_PROJECTOROPENGL @@ -65,8 +62,7 @@ std::set Projector::GetProjectorList() return projectorList; } -std::vector Projector::GetScreenInfo() -{ +std::vector Projector::GetScreenInfo(){ #ifdef WITH_PROJECTOROPENGL return OpenGLContext::GetScreenInfo(); #else From 402fdbb20e479d03563408b98e3d9b42702d62e7 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Wed, 2 Nov 2016 20:59:02 +0100 Subject: [PATCH 27/33] Fix finding GLEW --- CMakeLists.txt | 6 +++--- cmake/FindGlew.cmake | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6c295c7..bf38447 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,8 +11,8 @@ if(OpenCV_VERSION VERSION_LESS "3") add_definitions(-DOPENCV2) endif(OpenCV_VERSION VERSION_LESS "3") -find_package(Glew) -find_package(OpenGL) +find_package(Glew REQUIRED) +find_package(OpenGL REQUIRED) find_package(PCL) find_package(VTK) @@ -31,7 +31,7 @@ if(${USE_QT5}) set(CMAKE_AUTOMOC ON) else() #Legacy qt4 support - find_package(Qt4 REQUIRED QtCore QtGui QtTest QtOpenGL) + find_package(Qt4 REQUIRED QtCore QtGui QtTest QtOpenGL REQUIRED) include(${QT_USE_FILE}) endif() diff --git a/cmake/FindGlew.cmake b/cmake/FindGlew.cmake index e51b525..ff0f520 100644 --- a/cmake/FindGlew.cmake +++ b/cmake/FindGlew.cmake @@ -2,7 +2,7 @@ set(GLEW_FOUND false) set(GLEW_PATH) set(GLEW_LIBRARY) -find_path(GLEW_PATH glew.h) +find_path(GLEW_PATH GL/glew.h) if(EXISTS ${GLEW_PATH}) if(UNIX) From aa313142cc49ffd3b0cb6fb361a09feaab10a486 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Fri, 4 Nov 2016 21:15:09 +0100 Subject: [PATCH 28/33] Do not build Qt projector per default --- CMakeLists.txt | 4 ++-- src/projector/CMakeLists.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bf38447..579ad5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,12 +26,12 @@ if(VTK_FOUND) endif(VTK_FOUND) if(${USE_QT5}) - find_package(Qt5 COMPONENTS Core Gui Test Widgets OpenGL REQUIRED) + find_package(Qt5 COMPONENTS Core Gui Test Widgets OpenGL) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) else() #Legacy qt4 support - find_package(Qt4 REQUIRED QtCore QtGui QtTest QtOpenGL REQUIRED) + find_package(Qt4 REQUIRED QtCore QtGui QtTest QtOpenGL) include(${QT_USE_FILE}) endif() diff --git a/src/projector/CMakeLists.txt b/src/projector/CMakeLists.txt index 46db044..74e2797 100644 --- a/src/projector/CMakeLists.txt +++ b/src/projector/CMakeLists.txt @@ -8,7 +8,7 @@ set(CPP_FILES Projector.cpp) option(WITH_LC3000API "Use LightCrafter 3000 projector" OFF) option(WITH_LC4500API "Use LightCrafter 4500 projector" OFF) option(WITH_PROJECTOROPENGL "Use OpenGL projector" ON) -option(WITH_PROJECTORQT "Use Qt projector" ON) +option(WITH_PROJECTORQT "Use Qt projector" OFF) if(WITH_LC4500API) set(CPP_FILES ${CPP_FILES} ProjectorLC4500.cpp LC4500API/API.cpp LC4500API/usb.cpp) From 98541978e54cb32965b82d779115655f61d96705 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Mon, 14 Nov 2016 21:11:04 +0100 Subject: [PATCH 29/33] Install libraries --- src/CMakeLists.txt | 1 + src/camera/CMakeLists.txt | 1 + src/projector/CMakeLists.txt | 1 + 3 files changed, 3 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7e64109..52bb552 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -60,3 +60,4 @@ target_link_libraries(slalgorithm ${OpenCV_LIBS} ${Boost_LIBRARIES} ) +install(TARGETS slalgorithm LIBRARY DESTINATION lib) diff --git a/src/camera/CMakeLists.txt b/src/camera/CMakeLists.txt index a9d176b..44a0be7 100644 --- a/src/camera/CMakeLists.txt +++ b/src/camera/CMakeLists.txt @@ -84,3 +84,4 @@ target_link_libraries(slcamera ${DEVICE_LIBS} ${Boost_LIBRARIES} ) +install(TARGETS slcamera LIBRARY DESTINATION lib) diff --git a/src/projector/CMakeLists.txt b/src/projector/CMakeLists.txt index 74e2797..b95ea9f 100644 --- a/src/projector/CMakeLists.txt +++ b/src/projector/CMakeLists.txt @@ -67,6 +67,7 @@ add_definitions(${DEVICE_DEFS}) add_library(slprojector SHARED ${H_FILES} ${CPP_FILES}) generate_export_header(slprojector) target_link_libraries(slprojector ${DEVICE_LIBS}) +install(TARGETS slprojector LIBRARY DESTINATION lib) if(WITH_PROJECTORQT) if(${USE_QT5}) From 16df99b8620f68db16e5494980726816b5dfa042 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Wed, 16 Nov 2016 21:54:05 +0100 Subject: [PATCH 30/33] Fix loop in gray code codec --- src/codec/CodecGrayCode.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/codec/CodecGrayCode.cpp b/src/codec/CodecGrayCode.cpp index 8d170ad..d48bedb 100644 --- a/src/codec/CodecGrayCode.cpp +++ b/src/codec/CodecGrayCode.cpp @@ -193,7 +193,8 @@ void DecoderGrayCode::decodeFrames(cv::Mat &up, cv::Mat &vp, cv::Mat &mask, cv:: for(int i = 0; i < up.rows; i++){ for(int j = 0; j < up.cols; j++){ unsigned int enc = 0; - for(unsigned int f=0; f(i,j); } @@ -214,7 +215,8 @@ void DecoderGrayCode::decodeFrames(cv::Mat &up, cv::Mat &vp, cv::Mat &mask, cv:: for(int i = 0; i < vp.rows; i++){ for(int j = 0; j < vp.cols; j++){ unsigned int enc = 0; - for(unsigned int f=0; f(i,j); } From edb7c174fd9dd1e931c299b500d994d1dfff3847 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Sat, 31 Dec 2016 22:41:49 +0100 Subject: [PATCH 31/33] Export calibration codecs --- src/codec/CodecCalibration.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/codec/CodecCalibration.h b/src/codec/CodecCalibration.h index e6721be..478aee5 100644 --- a/src/codec/CodecCalibration.h +++ b/src/codec/CodecCalibration.h @@ -3,7 +3,7 @@ #include "Codec.h" -class EncoderCalibration : public Encoder { +class SLALGORITHM_EXPORT EncoderCalibration : public Encoder { public: EncoderCalibration(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Encoding @@ -12,7 +12,7 @@ class EncoderCalibration : public Encoder { std::vector patterns; }; -class DecoderCalibration : public Decoder { +class SLALGORITHM_EXPORT DecoderCalibration : public Decoder { public: DecoderCalibration(unsigned int _screenCols, unsigned int _screenRows, CodecDir _dir); // Decoding From ca06ab18b429cd48338889ac52a5f15e5648b9d4 Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Wed, 1 Mar 2017 21:43:13 +0100 Subject: [PATCH 32/33] Convert to cv::Mat to output to stream --- src/calibrator/CalibrationData.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/calibrator/CalibrationData.cpp b/src/calibrator/CalibrationData.cpp index 5d8a9cd..a08b70b 100644 --- a/src/calibrator/CalibrationData.cpp +++ b/src/calibrator/CalibrationData.cpp @@ -130,12 +130,12 @@ bool CalibrationData::saveMatlab(const std::string& filename){ return false; file << "%%SLStudio calibration" << std::endl; - file << "Kc = " << Kc << ";" << std::endl; - file << "kc = " << kc << ";" << std::endl; - file << "Kp = " << Kp << ";" << std::endl; - file << "kp = " << kp << ";" << std::endl; - file << "Rp = " << Rp << ";" << std::endl; - file << "Tp = " << Tp << ";" << std::endl; + file << "Kc = " << cv::Mat(Kc) << ";" << std::endl; + file << "kc = " << cv::Mat(kc) << ";" << std::endl; + file << "Kp = " << cv::Mat(Kp) << ";" << std::endl; + file << "kp = " << cv::Mat(kp) << ";" << std::endl; + file << "Rp = " << cv::Mat(Rp) << ";" << std::endl; + file << "Tp = " << cv::Mat(Tp) << ";" << std::endl; file.close(); @@ -149,14 +149,14 @@ void CalibrationData::print(std::ostream &stream){ << "========================================\n" << "Camera Calibration: \n" << "- cam_error:\n" << cam_error << "\n" - << "- Kc:\n" << Kc << "\n" - << "- kc:\n" << kc << "\n" + << "- Kc:\n" << cv::Mat(Kc) << "\n" + << "- kc:\n" << cv::Mat(kc) << "\n" << "Projector Calibration: " << "\n" << "- proj_error: \n" << proj_error << "\n" - << "- Kp: \n" << Kp << "\n" - << "- kp: \n" << kp << "\n" + << "- Kp: \n" << cv::Mat(Kp) << "\n" + << "- kp: \n" << cv::Mat(kp) << "\n" << "Stereo Calibration: \n" << "- stereo_error:\n" << stereo_error << "\n" - << "- Rp:\n" << Rp << "\n" - << "- Tp:\n" << Tp << std::endl; + << "- Rp:\n" << cv::Mat(Rp) << "\n" + << "- Tp:\n" << cv::Mat(Tp) << std::endl; } From 50e19ea6c09961cd8f203af486583ecd5d46e6ae Mon Sep 17 00:00:00 2001 From: Matthias Fuchs Date: Thu, 2 Mar 2017 20:18:43 +0100 Subject: [PATCH 33/33] Remove unused include --- src/projector/OpenGLContext.Unix.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/projector/OpenGLContext.Unix.cpp b/src/projector/OpenGLContext.Unix.cpp index 1333bc9..72a1479 100644 --- a/src/projector/OpenGLContext.Unix.cpp +++ b/src/projector/OpenGLContext.Unix.cpp @@ -9,7 +9,7 @@ #include // vmode extension for mode settings, gamma control, etc. -#include +//#include // XRandR extension for virtual screens, mode setting, etc. //#include