You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I'm new to this device and C++ and have a quite basic question. I was trying to compile and run the sample program Sample-PointCloud in Visual Studio.
I've added directories through Project -> Properties:
VC++ Directories
Many errors popped out when I tried debugging and built the project:
Severity Code Description Project File Line Suppression State Details
Error (active) E0020 identifier "kbhit" is undefined PointCloudTest C:\Users\mchang\source\repos\PointCloudTest\PointCloudTest\Source.cpp 152
Error (active) E0020 identifier "getch" is undefined PointCloudTest C:\Users\mchang\source\repos\PointCloudTest\PointCloudTest\Source.cpp 153
Warning C4251 'ob::Context::impl_': 'std::unique_ptr<ContextImpl,std::default_delete<ContextImpl>>' needs to have dll-interface to be used by clients of 'ob::Context' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Context.hpp 23
Warning C4251 'std::enable_shared_from_this<ob::Filter>::_Wptr': 'std::weak_ptr<_Ty>' needs to have dll-interface to be used by clients of 'std::enable_shared_from_this<ob::Filter>'
with
[
_Ty=ob::Filter
] PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Filter.hpp 27
Warning C4251 'ob::Filter::impl_': 'std::shared_ptr<FilterImpl>' needs to have dll-interface to be used by clients of 'ob::Filter' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Filter.hpp 103
Warning C4251 'ob::Filter::type_': 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>' needs to have dll-interface to be used by clients of 'ob::Filter' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Filter.hpp 104
Warning C4251 'ob::Device::impl_': 'std::unique_ptr<DeviceImpl,std::default_delete<DeviceImpl>>' needs to have dll-interface to be used by clients of 'ob::Device' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Device.hpp 31
Warning C4251 'ob::DeviceInfo::impl_': 'std::unique_ptr<DeviceInfoImpl,std::default_delete<DeviceInfoImpl>>' needs to have dll-interface to be used by clients of 'ob::DeviceInfo' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Device.hpp 642
Warning C4251 'ob::DeviceList::impl_': 'std::unique_ptr<DeviceListImpl,std::default_delete<DeviceListImpl>>' needs to have dll-interface to be used by clients of 'ob::DeviceList' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Device.hpp 759
Warning C4251 'ob::CameraParamList::impl_': 'std::unique_ptr<CameraParamListImpl,std::default_delete<CameraParamListImpl>>' needs to have dll-interface to be used by clients of 'ob::CameraParamList' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Device.hpp 869
Warning C4251 'ob::OBDepthWorkModeList::impl_': 'std::unique_ptr<OBDepthWorkModeListImpl,std::default_delete<OBDepthWorkModeListImpl>>' needs to have dll-interface to be used by clients of 'ob::OBDepthWorkModeList' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Device.hpp 896
Warning C4251 'ob::DevicePresetList::impl_': 'std::unique_ptr<DevicePresetListImpl,std::default_delete<DevicePresetListImpl>>' needs to have dll-interface to be used by clients of 'ob::DevicePresetList' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Device.hpp 940
Warning C4251 'ob::Error::impl_': 'std::unique_ptr<ErrorImpl,std::default_delete<ErrorImpl>>' needs to have dll-interface to be used by clients of 'ob::Error' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Error.hpp 16
Warning C4251 'std::enable_shared_from_this<ob::Frame>::_Wptr': 'std::weak_ptr<_Ty>' needs to have dll-interface to be used by clients of 'std::enable_shared_from_this<ob::Frame>'
with
[
_Ty=ob::Frame
] PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Frame.hpp 42
Warning C4251 'ob::Frame::impl_': 'std::unique_ptr<FrameImpl,std::default_delete<FrameImpl>>' needs to have dll-interface to be used by clients of 'ob::Frame' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Frame.hpp 44
Warning C4251 'ob::Pipeline::impl_': 'std::unique_ptr<PipelineImpl,std::default_delete<PipelineImpl>>' needs to have dll-interface to be used by clients of 'ob::Pipeline' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Pipeline.hpp 30
Warning C4251 'ob::Config::impl_': 'std::unique_ptr<ConfigImpl,std::default_delete<ConfigImpl>>' needs to have dll-interface to be used by clients of 'ob::Config' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Pipeline.hpp 212
Warning C4251 'ob::Recorder::impl_': 'std::unique_ptr<RecorderImpl,std::default_delete<RecorderImpl>>' needs to have dll-interface to be used by clients of 'ob::Recorder' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\RecordPlayback.hpp 25
Warning C4251 'ob::Playback::impl_': 'std::unique_ptr<PlaybackImpl,std::default_delete<PlaybackImpl>>' needs to have dll-interface to be used by clients of 'ob::Playback' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\RecordPlayback.hpp 65
Warning C4251 'ob::Sensor::impl_': 'std::unique_ptr<SensorImpl,std::default_delete<SensorImpl>>' needs to have dll-interface to be used by clients of 'ob::Sensor' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Sensor.hpp 33
Warning C4251 'ob::SensorList::impl_': 'std::unique_ptr<SensorListImpl,std::default_delete<SensorListImpl>>' needs to have dll-interface to be used by clients of 'ob::SensorList' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Sensor.hpp 82
Warning C4251 'ob::OBFilterList::impl_': 'std::unique_ptr<OBFilterListImpl,std::default_delete<OBFilterListImpl>>' needs to have dll-interface to be used by clients of 'ob::OBFilterList' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\Sensor.hpp 127
Warning C4251 'std::enable_shared_from_this<ob::StreamProfile>::_Wptr': 'std::weak_ptr<_Ty>' needs to have dll-interface to be used by clients of 'std::enable_shared_from_this<ob::StreamProfile>'
with
[
_Ty=ob::StreamProfile
] PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\StreamProfile.hpp 22
Warning C4251 'ob::StreamProfile::impl_': 'std::unique_ptr<StreamProfileImpl,std::default_delete<StreamProfileImpl>>' needs to have dll-interface to be used by clients of 'ob::StreamProfile' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\StreamProfile.hpp 24
Warning C4251 'ob::StreamProfileList::impl_': 'std::unique_ptr<StreamProfileListImpl,std::default_delete<StreamProfileListImpl>>' needs to have dll-interface to be used by clients of 'ob::StreamProfileList' PointCloudTest C:\OrbbecSDK_v1.10.12\SDK\include\libobsensor\hpp\StreamProfile.hpp 214
Error C4996 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. PointCloudTest C:\Users\mchang\source\repos\PointCloudTest\PointCloudTest\Source.cpp 15
Error C4996 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. PointCloudTest C:\Users\mchang\source\repos\PointCloudTest\PointCloudTest\Source.cpp 37
Error C3861 'kbhit': identifier not found PointCloudTest C:\Users\mchang\source\repos\PointCloudTest\PointCloudTest\Source.cpp 152
Error C3861 'getch': identifier not found PointCloudTest C:\Users\mchang\source\repos\PointCloudTest\PointCloudTest\Source.cpp 153
And here's the original code in the sample folder:
#include "libobsensor/ObSensor.hpp"
// #include "opencv2/opencv.hpp"
#include <fstream>
#include <iostream>
// #include "utils.hpp"
#include "libobsensor/hpp/Utils.hpp"
#define KEY_ESC 27
#define KEY_R 82
#define KEY_r 114
// Save point cloud data to ply
void savePointsToPly(std::shared_ptr<ob::Frame> frame, std::string fileName) {
int pointsSize = frame->dataSize() / sizeof(OBPoint);
FILE* fp = fopen(fileName.c_str(), "wb+");
fprintf(fp, "ply\n");
fprintf(fp, "format ascii 1.0\n");
fprintf(fp, "element vertex %d\n", pointsSize);
fprintf(fp, "property float x\n");
fprintf(fp, "property float y\n");
fprintf(fp, "property float z\n");
fprintf(fp, "end_header\n");
OBPoint* point = (OBPoint*)frame->data();
for (int i = 0; i < pointsSize; i++) {
fprintf(fp, "%.3f %.3f %.3f\n", point->x, point->y, point->z);
point++;
}
fflush(fp);
fclose(fp);
}
// Save colored point cloud data to ply
void saveRGBPointsToPly(std::shared_ptr<ob::Frame> frame, std::string fileName) {
int pointsSize = frame->dataSize() / sizeof(OBColorPoint);
FILE* fp = fopen(fileName.c_str(), "wb+");
fprintf(fp, "ply\n");
fprintf(fp, "format ascii 1.0\n");
fprintf(fp, "element vertex %d\n", pointsSize);
fprintf(fp, "property float x\n");
fprintf(fp, "property float y\n");
fprintf(fp, "property float z\n");
fprintf(fp, "property uchar red\n");
fprintf(fp, "property uchar green\n");
fprintf(fp, "property uchar blue\n");
fprintf(fp, "end_header\n");
OBColorPoint* point = (OBColorPoint*)frame->data();
for (int i = 0; i < pointsSize; i++) {
fprintf(fp, "%.3f %.3f %.3f %d %d %d\n", point->x, point->y, point->z, (int)point->r, (int)point->g, (int)point->b);
point++;
}
fflush(fp);
fclose(fp);
}
int main(int argc, char** argv) try {
ob::Context::setLoggerSeverity(OB_LOG_SEVERITY_WARN);
// create pipeline
ob::Pipeline pipeline;
// Configure which streams to enable or disable for the Pipeline by creating a Config
std::shared_ptr<ob::Config> config = std::make_shared<ob::Config>();
// Turn on D2C alignment, which needs to be turned on when generating RGBD point clouds
std::shared_ptr<ob::VideoStreamProfile> colorProfile = nullptr;
try {
// Get all stream profiles of the color camera, including stream resolution, frame rate, and frame format
auto colorProfiles = pipeline.getStreamProfileList(OB_SENSOR_COLOR);
if (colorProfiles) {
auto profile = colorProfiles->getProfile(OB_PROFILE_DEFAULT);
colorProfile = profile->as<ob::VideoStreamProfile>();
}
config->enableStream(colorProfile);
}
catch (ob::Error& e) {
config->setAlignMode(ALIGN_DISABLE);
std::cerr << "Current device is not support color sensor!" << std::endl;
}
// Get all stream profiles of the depth camera, including stream resolution, frame rate, and frame format
std::shared_ptr<ob::StreamProfileList> depthProfileList;
OBAlignMode alignMode = ALIGN_DISABLE;
if (colorProfile) {
// Try find supported depth to color align hardware mode profile
depthProfileList = pipeline.getD2CDepthProfileList(colorProfile, ALIGN_D2C_HW_MODE);
if (depthProfileList->count() > 0) {
alignMode = ALIGN_D2C_HW_MODE;
}
else {
// Try find supported depth to color align software mode profile
depthProfileList = pipeline.getD2CDepthProfileList(colorProfile, ALIGN_D2C_SW_MODE);
if (depthProfileList->count() > 0) {
alignMode = ALIGN_D2C_SW_MODE;
}
}
try {
// Enable frame synchronization
pipeline.enableFrameSync();
}
catch (ob::Error& e) {
std::cerr << "Current device is not support frame sync!" << std::endl;
}
}
else {
depthProfileList = pipeline.getStreamProfileList(OB_SENSOR_DEPTH);
}
if (depthProfileList->count() > 0) {
std::shared_ptr<ob::StreamProfile> depthProfile;
try {
// Select the profile with the same frame rate as color.
if (colorProfile) {
depthProfile = depthProfileList->getVideoStreamProfile(OB_WIDTH_ANY, OB_HEIGHT_ANY, OB_FORMAT_ANY, colorProfile->fps());
}
}
catch (...) {
depthProfile = nullptr;
}
if (!depthProfile) {
// If no matching profile is found, select the default profile.
depthProfile = depthProfileList->getProfile(OB_PROFILE_DEFAULT);
}
config->enableStream(depthProfile);
}
config->setAlignMode(alignMode);
// start pipeline with config
pipeline.start(config);
// Create a point cloud Filter object (the device parameters will be obtained inside the Pipeline when the point cloud filter is created, so try to
// configure the device before creating the filter)
ob::PointCloudFilter pointCloud;
// get camera intrinsic and extrinsic parameters form pipeline and set to point cloud filter
auto cameraParam = pipeline.getCameraParam();
pointCloud.setCameraParam(cameraParam);
// operation prompt
std::cout << "Press R or r to create RGBD PointCloud and save to ply file! " << std::endl;
std::cout << "Press D or d to create Depth PointCloud and save to ply file! " << std::endl;
std::cout << "Press ESC to exit! " << std::endl;
int count = 0;
while (true) {
auto frameset = pipeline.waitForFrames(100);
if (kbhit()) {
int key = getch();
// Press the ESC key to exit
if (key == KEY_ESC) {
break;
}
if (key == 'R' || key == 'r') {
count = 0;
// Limit up to 10 repetitions
while (count++ < 10) {
// Wait for a frame of data, the timeout is 100ms
auto frameset = pipeline.waitForFrames(100);
if (frameset != nullptr && frameset->depthFrame() != nullptr && frameset->colorFrame() != nullptr) {
// point position value multiply depth value scale to convert uint to millimeter (for some devices, the default depth value uint is not
// millimeter)
auto depthValueScale = frameset->depthFrame()->getValueScale();
pointCloud.setPositionDataScaled(depthValueScale);
try {
// Generate a colored point cloud and save it
std::cout << "Save RGBD PointCloud ply file..." << std::endl;
pointCloud.setCreatePointFormat(OB_FORMAT_RGB_POINT);
std::shared_ptr<ob::Frame> frame = pointCloud.process(frameset);
saveRGBPointsToPly(frame, "RGBPoints.ply");
std::cout << "RGBPoints.ply Saved" << std::endl;
}
catch (std::exception& e) {
std::cout << "Get point cloud failed" << std::endl;
}
break;
}
else {
std::cout << "Get color frame or depth frame failed!" << std::endl;
}
}
}
else if (key == 'D' || key == 'd') {
count = 0;
// Limit up to 10 repetitions
while (count++ < 10) {
// Wait for up to 100ms for a frameset in blocking mode.
auto frameset = pipeline.waitForFrames(100);
if (frameset != nullptr && frameset->depthFrame() != nullptr) {
// point position value multiply depth value scale to convert uint to millimeter (for some devices, the default depth value uint is not
// millimeter)
auto depthValueScale = frameset->depthFrame()->getValueScale();
pointCloud.setPositionDataScaled(depthValueScale);
try {
// generate point cloud and save
std::cout << "Save Depth PointCloud to ply file..." << std::endl;
pointCloud.setCreatePointFormat(OB_FORMAT_POINT);
std::shared_ptr<ob::Frame> frame = pointCloud.process(frameset);
savePointsToPly(frame, "DepthPoints.ply");
std::cout << "DepthPoints.ply Saved" << std::endl;
}
catch (std::exception& e) {
std::cout << "Get point cloud failed" << std::endl;
}
break;
}
}
}
}
}
// stop the pipeline
pipeline.stop();
return 0;
}
catch (ob::Error& e) {
std::cerr << "function:" << e.getName() << "\nargs:" << e.getArgs() << "\nmessage:" << e.getMessage() << "\ntype:" << e.getExceptionType() << std::endl;
exit(EXIT_FAILURE);
}
Could anyone help me with this? Thank you very much!
The text was updated successfully, but these errors were encountered:
Hi,
I'm new to this device and C++ and have a quite basic question. I was trying to compile and run the sample program
Sample-PointCloud
in Visual Studio.I've added directories through Project -> Properties:
VC++ Directories
Linker -> Input
Many errors popped out when I tried debugging and built the project:
And here's the original code in the sample folder:
Could anyone help me with this? Thank you very much!
The text was updated successfully, but these errors were encountered: