Last active
July 26, 2018 06:45
-
-
Save graugans/21ec5d5d2ffc382d12dbda076ced8ef0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/simpleimage/example/ex-simpleImage_ppm_io.cpp b/simpleimage/example/ex-simpleImage_ppm_io.cpp | |
index 081617f..c2f6123 100644 | |
--- a/simpleimage/example/ex-simpleImage_ppm_io.cpp | |
+++ b/simpleimage/example/ex-simpleImage_ppm_io.cpp | |
@@ -32,12 +32,8 @@ | |
#include <ifm3d/fg.h> | |
#include <ifm3d/simpleimage.h> | |
- | |
- | |
using namespace std; | |
- | |
- | |
bool writePPMFile(ifm3d::SimpleImageBuffer::Img &img, std::string const& filename) | |
{ | |
auto const write_width = (size_t)img.width; | |
@@ -106,9 +102,31 @@ void findMinAndMax(ifm3d::SimpleImageBuffer::Img &input, ifm3d::SimpleImageBuffe | |
} | |
} | |
+ | |
+void seprateXYZImages(ifm3d::SimpleImageBuffer::Img &input, ifm3d::SimpleImageBuffer::Img &X, ifm3d::SimpleImageBuffer::Img &Y, ifm3d::SimpleImageBuffer::Img &Z) | |
+{ | |
+ X.width =Y.width =Z.width = input.width; | |
+ X.height =Y.height =Z.height = input.height; | |
+ X.format = Y.format = ifm3d::pixel_format::FORMAT_16S; | |
+ Z.format = ifm3d::pixel_format::FORMAT_16U; | |
+ X.data.resize(input.width*input.height * sizeof(int16_t)); | |
+ Y.data.resize(input.width*input.height * sizeof(int16_t)); | |
+ Z.data.resize(input.width*input.height * sizeof(uint16_t)); | |
+ | |
+ for (int index = 0; index < input.width * input.height; index++ ) | |
+ { | |
+ *((int16_t*)(X.data.data()) + index) = *((int16_t*)(input.data.data()) + (index*3)); | |
+ *((int16_t*)(Y.data.data()) + index) = *((int16_t*)(input.data.data()) + (index*3 + 1)); | |
+ *((uint16_t*)(Z.data.data()) + index) = *((uint16_t*)(input.data.data()) + (index*3 + 2)); | |
+ | |
+ } | |
+} | |
+ | |
+ | |
+ | |
int main(int argc, const char **argv) | |
{ | |
- auto cam = ifm3d::Camera::MakeShared(); | |
+ auto cam = ifm3d::Camera::MakeShared(""); | |
ifm3d::SimpleImageBuffer::Ptr img = std::make_shared<ifm3d::SimpleImageBuffer>(); | |
ifm3d::FrameGrabber::Ptr fg = | |
@@ -120,11 +138,13 @@ int main(int argc, const char **argv) | |
std::cerr << "Timeout waiting for camera!" << std::endl; | |
return -1; | |
} | |
+ | |
// acquiring data from the device | |
ifm3d::SimpleImageBuffer::Img confidence = img->ConfidenceImage(); | |
+ | |
ifm3d::SimpleImageBuffer::Img amplitude = img->AmplitudeImage(); | |
ifm3d::SimpleImageBuffer::Img distance = img->DistanceImage(); | |
- | |
+ | |
// for storing scaled output | |
ifm3d::SimpleImageBuffer::Img distance_scaled; | |
ifm3d::SimpleImageBuffer::Img amplitude_scaled; | |
@@ -144,9 +164,9 @@ int main(int argc, const char **argv) | |
//for 16u data O3D camera | |
else if(distance.format == ifm3d::pixel_format::FORMAT_16U) | |
{ //if data format is 16U then distances are in millimeters, Hence max distance is multiplied by 1000. | |
- scaleImageToRGB<unsigned short>(distance, confidence, distance_scaled, min_distance, max_distance * 1000); | |
- findMinAndMax<unsigned short>(amplitude, confidence, min, max); | |
- scaleImageToRGB<unsigned short>(amplitude, confidence, amplitude_scaled, min, max); | |
+ scaleImageToRGB<uint16_t>(distance, confidence, distance_scaled, min_distance, max_distance * 1000); | |
+ findMinAndMax<uint16_t>(amplitude, confidence, min, max); | |
+ scaleImageToRGB<uint16_t>(amplitude, confidence, amplitude_scaled, min, max); | |
} | |
else | |
{ | |
@@ -166,6 +186,42 @@ int main(int argc, const char **argv) | |
return -1; | |
} | |
+/* additional code for XYZ assuming O3D camera*/ | |
+ | |
+ ifm3d::SimpleImageBuffer::Img xyz = img->XYZImage(); | |
+ | |
+ ifm3d::SimpleImageBuffer::Img X_image; | |
+ ifm3d::SimpleImageBuffer::Img Y_image; | |
+ ifm3d::SimpleImageBuffer::Img Z_image; | |
+ | |
+ ifm3d::SimpleImageBuffer::Img X_image_scaled; | |
+ ifm3d::SimpleImageBuffer::Img Y_image_scaled; | |
+ ifm3d::SimpleImageBuffer::Img Z_image_scaled; | |
+ | |
+ seprateXYZImages(xyz, Z_image, X_image, Y_image); | |
+ | |
+ scaleImageToRGB< int16_t>(X_image, confidence, X_image_scaled, -max_distance*1000, max_distance * 1000); | |
+ scaleImageToRGB< int16_t>(Y_image, confidence, Y_image_scaled, -max_distance*1000, max_distance * 1000); | |
+ scaleImageToRGB<uint16_t>(Z_image, confidence, Z_image_scaled, min_distance, max_distance * 1000); | |
+ | |
+ if (!writePPMFile(X_image_scaled, "xImage.ppm")) | |
+ { | |
+ std::cerr << "Not able to write the x data in ppm format" << std::endl; | |
+ return -1; | |
+ } | |
+ if (!writePPMFile(Y_image_scaled, "yImage.ppm")) | |
+ { | |
+ std::cerr << "Not able to write the y data in ppm format" << std::endl; | |
+ return -1; | |
+ } | |
+ | |
+ if (!writePPMFile(Z_image_scaled, "zImage.ppm")) | |
+ { | |
+ std::cerr << "Not able to write the z data in ppm format" << std::endl; | |
+ return -1; | |
+ } | |
+ | |
+ | |
std::cout << "Done with simpleimage ppmio example" << std::endl; | |
return 0; | |
} |
Author
graugans
commented
Jul 26, 2018
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment