Add get stream data tutorials
This commit is contained in:
parent
1fec1300a8
commit
40dc61d2b6
|
@ -1,5 +1,9 @@
|
||||||
get_filename_component(DIR_NAME ${CMAKE_CURRENT_LIST_DIR} NAME)
|
get_filename_component(DIR_NAME ${CMAKE_CURRENT_LIST_DIR} NAME)
|
||||||
|
|
||||||
|
include_directories(
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
set_outdir(
|
set_outdir(
|
||||||
"${OUT_DIR}/lib/${DIR_NAME}"
|
"${OUT_DIR}/lib/${DIR_NAME}"
|
||||||
"${OUT_DIR}/lib/${DIR_NAME}"
|
"${OUT_DIR}/lib/${DIR_NAME}"
|
||||||
|
@ -8,9 +12,10 @@ set_outdir(
|
||||||
|
|
||||||
# make_executable(NAME
|
# make_executable(NAME
|
||||||
# [SRCS src1 src2 ...])
|
# [SRCS src1 src2 ...])
|
||||||
# [WITH_OPENCV])
|
# [WITH_OPENCV]
|
||||||
|
# [WITH_PCL])
|
||||||
macro(make_executable NAME)
|
macro(make_executable NAME)
|
||||||
set(options WITH_OPENCV)
|
set(options WITH_OPENCV WITH_PCL)
|
||||||
set(oneValueArgs)
|
set(oneValueArgs)
|
||||||
set(multiValueArgs SRCS)
|
set(multiValueArgs SRCS)
|
||||||
cmake_parse_arguments(THIS "${options}" "${oneValueArgs}"
|
cmake_parse_arguments(THIS "${options}" "${oneValueArgs}"
|
||||||
|
@ -22,11 +27,21 @@ macro(make_executable NAME)
|
||||||
list(APPEND __link_libs ${OpenCV_LIBS})
|
list(APPEND __link_libs ${OpenCV_LIBS})
|
||||||
list(APPEND __dll_search_paths ${OpenCV_LIB_SEARCH_PATH})
|
list(APPEND __dll_search_paths ${OpenCV_LIB_SEARCH_PATH})
|
||||||
endif()
|
endif()
|
||||||
|
if(THIS_WITH_PCL)
|
||||||
|
list(APPEND __link_libs ${PCL_LIBRARIES})
|
||||||
|
#list(APPEND __link_libs pcl::pcl)
|
||||||
|
list(APPEND __dll_search_paths ${PCL_LIB_SEARCH_PATH})
|
||||||
|
endif()
|
||||||
|
|
||||||
add_executable(${NAME} ${THIS_SRCS})
|
add_executable(${NAME} ${THIS_SRCS})
|
||||||
target_link_libraries(${NAME} ${__link_libs})
|
target_link_libraries(${NAME} ${__link_libs})
|
||||||
target_create_scripts(${NAME} DLL_SEARCH_PATHS ${__dll_search_paths})
|
target_create_scripts(${NAME} DLL_SEARCH_PATHS ${__dll_search_paths})
|
||||||
|
|
||||||
|
if(THIS_WITH_PCL)
|
||||||
|
target_include_directories(${NAME} PRIVATE ${PCL_INCLUDE_DIRS})
|
||||||
|
#target_compile_definitions(${NAME} PRIVATE ${PCL_DEFINITIONS})
|
||||||
|
#target_compile_options(${NAME} PRIVATE ${PCL_COMPILE_OPTIONS})
|
||||||
|
endif()
|
||||||
if(OS_WIN)
|
if(OS_WIN)
|
||||||
target_compile_definitions(${NAME}
|
target_compile_definitions(${NAME}
|
||||||
PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES
|
PUBLIC GLOG_NO_ABBREVIATED_SEVERITIES
|
||||||
|
@ -36,8 +51,46 @@ endmacro()
|
||||||
|
|
||||||
if(WITH_API)
|
if(WITH_API)
|
||||||
|
|
||||||
|
# If you install PCL to different directory, please set CMAKE_PREFIX_PATH to find it.
|
||||||
|
#LIST(APPEND CMAKE_PREFIX_PATH /usr/local/share)
|
||||||
|
find_package(PCL)
|
||||||
|
if(PCL_FOUND)
|
||||||
|
message(STATUS "Found PCL: ${PCL_VERSION}")
|
||||||
|
|
||||||
|
#message(STATUS "PCL_LIBRARIES: ${PCL_LIBRARIES}")
|
||||||
|
#message(STATUS "PCL_INCLUDE_DIRS: ${PCL_INCLUDE_DIRS}")
|
||||||
|
#message(STATUS "PCL_LIBRARY_DIRS: ${PCL_LIBRARY_DIRS}")
|
||||||
|
#message(STATUS "PCL_DEFINITIONS: ${PCL_DEFINITIONS}")
|
||||||
|
#message(STATUS "PCL_COMPILE_OPTIONS: ${PCL_COMPILE_OPTIONS}")
|
||||||
|
|
||||||
|
if(OS_WIN)
|
||||||
|
get_filename_component(PCL_LIB_SEARCH_PATH "${PCL_LIBRARY_DIRS}/../bin" ABSOLUTE)
|
||||||
|
else()
|
||||||
|
set(PCL_LIB_SEARCH_PATH "${PCL_LIBRARY_DIRS}")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(WARNING "PCL not found :(")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# data
|
||||||
|
|
||||||
make_executable(get_device_info SRCS data/get_device_info.cc)
|
make_executable(get_device_info SRCS data/get_device_info.cc)
|
||||||
make_executable(get_with_plugin SRCS data/get_with_plugin.cc)
|
make_executable(get_img_params SRCS data/get_img_params.cc)
|
||||||
|
make_executable(get_imu_params SRCS data/get_imu_params.cc)
|
||||||
|
|
||||||
|
make_executable(get_stereo SRCS data/get_stereo.cc WITH_OPENCV)
|
||||||
|
make_executable(get_stereo_rectified SRCS data/get_stereo_rectified.cc WITH_OPENCV)
|
||||||
|
make_executable(get_disparity SRCS data/get_disparity.cc WITH_OPENCV)
|
||||||
|
make_executable(get_depth SRCS data/get_depth.cc WITH_OPENCV)
|
||||||
|
if(PCL_FOUND)
|
||||||
|
make_executable(get_points
|
||||||
|
SRCS data/get_points.cc data/pcviewer.cc
|
||||||
|
WITH_OPENCV WITH_PCL
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
make_executable(get_with_plugin SRCS data/get_with_plugin.cc WITH_OPENCV)
|
||||||
|
|
||||||
|
# control
|
||||||
|
|
||||||
make_executable(ctrl_infrared SRCS control/infrared.cc WITH_OPENCV)
|
make_executable(ctrl_infrared SRCS control/infrared.cc WITH_OPENCV)
|
||||||
|
|
||||||
|
|
42
samples/tutorials/data/get_depth.cc
Normal file
42
samples/tutorials/data/get_depth.cc
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#include <opencv2/highgui/highgui.hpp>
|
||||||
|
|
||||||
|
#include <glog/logging.h>
|
||||||
|
|
||||||
|
#include "mynteye/api.h"
|
||||||
|
|
||||||
|
MYNTEYE_USE_NAMESPACE
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
auto &&api = API::Create(argc, argv);
|
||||||
|
|
||||||
|
api->EnableStreamData(Stream::DEPTH);
|
||||||
|
|
||||||
|
api->Start(Source::VIDEO_STREAMING);
|
||||||
|
|
||||||
|
cv::namedWindow("frame");
|
||||||
|
cv::namedWindow("depth");
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
api->WaitForStreams();
|
||||||
|
|
||||||
|
auto &&left_data = api->GetStreamData(Stream::LEFT);
|
||||||
|
auto &&right_data = api->GetStreamData(Stream::RIGHT);
|
||||||
|
|
||||||
|
cv::Mat img;
|
||||||
|
cv::hconcat(left_data.frame, right_data.frame, img);
|
||||||
|
cv::imshow("frame", img);
|
||||||
|
|
||||||
|
auto &&depth_data = api->GetStreamData(Stream::DEPTH);
|
||||||
|
if (!depth_data.frame.empty()) {
|
||||||
|
cv::imshow("depth", depth_data.frame); // CV_16UC1
|
||||||
|
}
|
||||||
|
|
||||||
|
char key = static_cast<char>(cv::waitKey(1));
|
||||||
|
if (key == 27 || key == 'q' || key == 'Q') { // ESC/Q
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
api->Stop(Source::VIDEO_STREAMING);
|
||||||
|
return 0;
|
||||||
|
}
|
49
samples/tutorials/data/get_disparity.cc
Normal file
49
samples/tutorials/data/get_disparity.cc
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
#include <opencv2/highgui/highgui.hpp>
|
||||||
|
|
||||||
|
#include <glog/logging.h>
|
||||||
|
|
||||||
|
#include "mynteye/api.h"
|
||||||
|
|
||||||
|
MYNTEYE_USE_NAMESPACE
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
auto &&api = API::Create(argc, argv);
|
||||||
|
|
||||||
|
// api->EnableStreamData(Stream::DISPARITY);
|
||||||
|
api->EnableStreamData(Stream::DISPARITY_NORMALIZED);
|
||||||
|
|
||||||
|
api->Start(Source::VIDEO_STREAMING);
|
||||||
|
|
||||||
|
cv::namedWindow("frame");
|
||||||
|
// cv::namedWindow("disparity");
|
||||||
|
cv::namedWindow("disparity_normalized");
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
api->WaitForStreams();
|
||||||
|
|
||||||
|
auto &&left_data = api->GetStreamData(Stream::LEFT);
|
||||||
|
auto &&right_data = api->GetStreamData(Stream::RIGHT);
|
||||||
|
|
||||||
|
cv::Mat img;
|
||||||
|
cv::hconcat(left_data.frame, right_data.frame, img);
|
||||||
|
cv::imshow("frame", img);
|
||||||
|
|
||||||
|
// auto &&disp_data = api->GetStreamData(Stream::DISPARITY);
|
||||||
|
// if (!disp_data.frame.empty()) {
|
||||||
|
// cv::imshow("disparity", disp_data.frame);
|
||||||
|
// }
|
||||||
|
|
||||||
|
auto &&disp_norm_data = api->GetStreamData(Stream::DISPARITY_NORMALIZED);
|
||||||
|
if (!disp_norm_data.frame.empty()) {
|
||||||
|
cv::imshow("disparity_normalized", disp_norm_data.frame); // CV_8UC1
|
||||||
|
}
|
||||||
|
|
||||||
|
char key = static_cast<char>(cv::waitKey(1));
|
||||||
|
if (key == 27 || key == 'q' || key == 'Q') { // ESC/Q
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
api->Stop(Source::VIDEO_STREAMING);
|
||||||
|
return 0;
|
||||||
|
}
|
17
samples/tutorials/data/get_img_params.cc
Normal file
17
samples/tutorials/data/get_img_params.cc
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
#include <glog/logging.h>
|
||||||
|
|
||||||
|
#include "mynteye/api.h"
|
||||||
|
|
||||||
|
MYNTEYE_USE_NAMESPACE
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
auto &&api = API::Create(argc, argv);
|
||||||
|
|
||||||
|
LOG(INFO) << "Intrinsics left: {" << api->GetIntrinsics(Stream::LEFT) << "}";
|
||||||
|
LOG(INFO) << "Intrinsics right: {" << api->GetIntrinsics(Stream::RIGHT)
|
||||||
|
<< "}";
|
||||||
|
LOG(INFO) << "Extrinsics left to right: {"
|
||||||
|
<< api->GetExtrinsics(Stream::LEFT, Stream::RIGHT) << "}";
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
15
samples/tutorials/data/get_imu_params.cc
Normal file
15
samples/tutorials/data/get_imu_params.cc
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#include <glog/logging.h>
|
||||||
|
|
||||||
|
#include "mynteye/api.h"
|
||||||
|
|
||||||
|
MYNTEYE_USE_NAMESPACE
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
auto &&api = API::Create(argc, argv);
|
||||||
|
|
||||||
|
LOG(INFO) << "Motion intrinsics: {" << api->GetMotionIntrinsics() << "}";
|
||||||
|
LOG(INFO) << "Motion extrinsics left to imu: {"
|
||||||
|
<< api->GetMotionExtrinsics(Stream::LEFT) << "}";
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
47
samples/tutorials/data/get_points.cc
Normal file
47
samples/tutorials/data/get_points.cc
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#include <opencv2/highgui/highgui.hpp>
|
||||||
|
|
||||||
|
#include <glog/logging.h>
|
||||||
|
|
||||||
|
#include "mynteye/api.h"
|
||||||
|
|
||||||
|
#include "data/pcviewer.h"
|
||||||
|
|
||||||
|
MYNTEYE_USE_NAMESPACE
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
auto &&api = API::Create(argc, argv);
|
||||||
|
|
||||||
|
api->EnableStreamData(Stream::POINTS);
|
||||||
|
|
||||||
|
api->Start(Source::VIDEO_STREAMING);
|
||||||
|
|
||||||
|
cv::namedWindow("frame");
|
||||||
|
PCViewer pcviewer;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
api->WaitForStreams();
|
||||||
|
|
||||||
|
auto &&left_data = api->GetStreamData(Stream::LEFT);
|
||||||
|
auto &&right_data = api->GetStreamData(Stream::RIGHT);
|
||||||
|
|
||||||
|
cv::Mat img;
|
||||||
|
cv::hconcat(left_data.frame, right_data.frame, img);
|
||||||
|
cv::imshow("frame", img);
|
||||||
|
|
||||||
|
auto &&points_data = api->GetStreamData(Stream::POINTS);
|
||||||
|
if (!points_data.frame.empty()) {
|
||||||
|
pcviewer.Draw(points_data.frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
char key = static_cast<char>(cv::waitKey(1));
|
||||||
|
if (key == 27 || key == 'q' || key == 'Q') { // ESC/Q
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (pcviewer.WasDrew() && pcviewer.WasStopped()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
api->Stop(Source::VIDEO_STREAMING);
|
||||||
|
return 0;
|
||||||
|
}
|
34
samples/tutorials/data/get_stereo.cc
Normal file
34
samples/tutorials/data/get_stereo.cc
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
#include <opencv2/highgui/highgui.hpp>
|
||||||
|
|
||||||
|
#include <glog/logging.h>
|
||||||
|
|
||||||
|
#include "mynteye/api.h"
|
||||||
|
|
||||||
|
MYNTEYE_USE_NAMESPACE
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
auto &&api = API::Create(argc, argv);
|
||||||
|
|
||||||
|
api->Start(Source::VIDEO_STREAMING);
|
||||||
|
|
||||||
|
cv::namedWindow("frame");
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
api->WaitForStreams();
|
||||||
|
|
||||||
|
auto &&left_data = api->GetStreamData(Stream::LEFT);
|
||||||
|
auto &&right_data = api->GetStreamData(Stream::RIGHT);
|
||||||
|
|
||||||
|
cv::Mat img;
|
||||||
|
cv::hconcat(left_data.frame, right_data.frame, img);
|
||||||
|
cv::imshow("frame", img);
|
||||||
|
|
||||||
|
char key = static_cast<char>(cv::waitKey(1));
|
||||||
|
if (key == 27 || key == 'q' || key == 'Q') { // ESC/Q
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
api->Stop(Source::VIDEO_STREAMING);
|
||||||
|
return 0;
|
||||||
|
}
|
39
samples/tutorials/data/get_stereo_rectified.cc
Normal file
39
samples/tutorials/data/get_stereo_rectified.cc
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
#include <opencv2/highgui/highgui.hpp>
|
||||||
|
|
||||||
|
#include <glog/logging.h>
|
||||||
|
|
||||||
|
#include "mynteye/api.h"
|
||||||
|
|
||||||
|
MYNTEYE_USE_NAMESPACE
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
auto &&api = API::Create(argc, argv);
|
||||||
|
|
||||||
|
api->EnableStreamData(Stream::LEFT_RECTIFIED);
|
||||||
|
api->EnableStreamData(Stream::RIGHT_RECTIFIED);
|
||||||
|
|
||||||
|
api->Start(Source::VIDEO_STREAMING);
|
||||||
|
|
||||||
|
cv::namedWindow("frame");
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
api->WaitForStreams();
|
||||||
|
|
||||||
|
auto &&left_data = api->GetStreamData(Stream::LEFT_RECTIFIED);
|
||||||
|
auto &&right_data = api->GetStreamData(Stream::RIGHT_RECTIFIED);
|
||||||
|
|
||||||
|
if (!left_data.frame.empty() && !right_data.frame.empty()) {
|
||||||
|
cv::Mat img;
|
||||||
|
cv::hconcat(left_data.frame, right_data.frame, img);
|
||||||
|
cv::imshow("frame", img);
|
||||||
|
}
|
||||||
|
|
||||||
|
char key = static_cast<char>(cv::waitKey(1));
|
||||||
|
if (key == 27 || key == 'q' || key == 'Q') { // ESC/Q
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
api->Stop(Source::VIDEO_STREAMING);
|
||||||
|
return 0;
|
||||||
|
}
|
89
samples/tutorials/data/pcviewer.cc
Normal file
89
samples/tutorials/data/pcviewer.cc
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
#include "data/pcviewer.h"
|
||||||
|
|
||||||
|
#include <glog/logging.h>
|
||||||
|
|
||||||
|
// #include <pcl/common/common_headers.h>
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
std::shared_ptr<pcl::visualization::PCLVisualizer> CustomColorVis(
|
||||||
|
pcl::PointCloud<pcl::PointXYZ>::ConstPtr pc) {
|
||||||
|
// --------------------------------------------
|
||||||
|
// -----Open 3D viewer and add point cloud-----
|
||||||
|
// --------------------------------------------
|
||||||
|
std::shared_ptr<pcl::visualization::PCLVisualizer> viewer(
|
||||||
|
new pcl::visualization::PCLVisualizer("PointCloud Viewer"));
|
||||||
|
viewer->setBackgroundColor(0, 0, 0);
|
||||||
|
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(
|
||||||
|
pc, 255, 255, 255);
|
||||||
|
viewer->addPointCloud<pcl::PointXYZ>(pc, single_color, "point cloud");
|
||||||
|
viewer->setPointCloudRenderingProperties(
|
||||||
|
pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "point cloud");
|
||||||
|
// viewer->addCoordinateSystem(1.0);
|
||||||
|
viewer->addCoordinateSystem(1000.0);
|
||||||
|
viewer->initCameraParameters();
|
||||||
|
viewer->setCameraPosition(0, 0, -150, 0, 1, 0);
|
||||||
|
return (viewer);
|
||||||
|
}
|
||||||
|
|
||||||
|
PCViewer::PCViewer() : viewer_(nullptr) {
|
||||||
|
VLOG(2) << __func__;
|
||||||
|
}
|
||||||
|
|
||||||
|
PCViewer::~PCViewer() {
|
||||||
|
VLOG(2) << __func__;
|
||||||
|
if (viewer_) {
|
||||||
|
// viewer_->saveCameraParameters("pcl_camera_params.txt");
|
||||||
|
viewer_->close();
|
||||||
|
viewer_ == nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PCViewer::Draw(const cv::Mat &xyz) {
|
||||||
|
pcl::PointCloud<pcl::PointXYZ>::Ptr pc(new pcl::PointCloud<pcl::PointXYZ>);
|
||||||
|
ConvertMatToPointCloud(xyz, pc);
|
||||||
|
Draw(pc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PCViewer::Draw(pcl::PointCloud<pcl::PointXYZ>::ConstPtr pc) {
|
||||||
|
if (viewer_ == nullptr) {
|
||||||
|
viewer_ = CustomColorVis(pc);
|
||||||
|
}
|
||||||
|
viewer_->updatePointCloud(pc, "point cloud");
|
||||||
|
viewer_->spinOnce();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PCViewer::WasDrew() const {
|
||||||
|
return viewer_ != nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PCViewer::WasStopped() const {
|
||||||
|
return viewer_ == nullptr || viewer_->wasStopped();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PCViewer::ConvertMatToPointCloud(
|
||||||
|
const cv::Mat &xyz, pcl::PointCloud<pcl::PointXYZ>::Ptr pc) {
|
||||||
|
// cv::Mat channels[3];
|
||||||
|
// cv::split(xyz, channels);
|
||||||
|
// double min, max;
|
||||||
|
// cv::minMaxLoc(channels[2], &min, &max);
|
||||||
|
|
||||||
|
for (int i = 0; i < xyz.rows; i++) {
|
||||||
|
for (int j = 0; j < xyz.cols; j++) {
|
||||||
|
auto &&p = xyz.at<cv::Point3f>(i, j);
|
||||||
|
if (std::isfinite(p.x) && std::isfinite(p.y) && std::isfinite(p.z)) {
|
||||||
|
// LOG(INFO) << "[" << i << "," << j << "] x: " << p.x << ", y: " << p.y
|
||||||
|
// << ", z: " << p.z;
|
||||||
|
pcl::PointXYZ point;
|
||||||
|
point.x = p.x;
|
||||||
|
point.y = p.y;
|
||||||
|
point.z = p.z;
|
||||||
|
// point.z = p.z - min;
|
||||||
|
pc->points.push_back(point);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pc->width = static_cast<int>(pc->points.size());
|
||||||
|
pc->height = 1;
|
||||||
|
}
|
30
samples/tutorials/data/pcviewer.h
Normal file
30
samples/tutorials/data/pcviewer.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#ifndef MYNTEYE_TUTORIALS_PCVIEWER_H_ // NOLINT
|
||||||
|
#define MYNTEYE_TUTORIALS_PCVIEWER_H_
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <opencv2/core/core.hpp>
|
||||||
|
|
||||||
|
#include <pcl/visualization/pcl_visualizer.h>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
class PCViewer {
|
||||||
|
public:
|
||||||
|
PCViewer();
|
||||||
|
~PCViewer();
|
||||||
|
|
||||||
|
void Draw(const cv::Mat &xyz);
|
||||||
|
|
||||||
|
void Draw(pcl::PointCloud<pcl::PointXYZ>::ConstPtr pc);
|
||||||
|
|
||||||
|
bool WasDrew() const;
|
||||||
|
bool WasStopped() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void ConvertMatToPointCloud(
|
||||||
|
const cv::Mat &xyz, pcl::PointCloud<pcl::PointXYZ>::Ptr pc);
|
||||||
|
|
||||||
|
std::shared_ptr<pcl::visualization::PCLVisualizer> viewer_;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MYNTEYE_TUTORIALS_PCVIEWER_H_ NOLINT
|
Loading…
Reference in New Issue
Block a user