17 #include <reconstructionRoutine.h> 27 ReconstructionRoutine::ReconstructionRoutine() :
28 cloud(new
pcl::PointCloud<
pcl::PointXYZRGB>),
29 cloudComplete(new
pcl::PointCloud<
pcl::PointXYZRGB>)
35 bool ReconstructionRoutine::open(
const Property &options)
37 Property &opt=
const_cast<Property&
>(options);
39 string configFileDisparity=opt.check(
"ConfigDisparity",Value(
"icubEyes.ini")).asString().c_str();
40 string cameraContext=opt.check(
"CameraContext",Value(
"cameraCalibration")).asString().c_str();
41 string name=opt.check(
"name",Value(
"object-reconstruction")).asString().c_str();
42 disparityOut.open(
"/"+name+
"/depth:o");
44 ResourceFinder cameraFinder;
45 cameraFinder.setDefaultContext(cameraContext.c_str());
46 cameraFinder.setDefaultConfigFile(configFileDisparity.c_str());
47 cameraFinder.setVerbose();
48 cameraFinder.configure(0,NULL);
50 disp=
new DisparityThread(name,cameraFinder,
false,
false,
true);
57 void ReconstructionRoutine::close()
64 void ReconstructionRoutine::filter(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_in,pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_in_filtered)
66 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_downsampled (
new pcl::PointCloud<pcl::PointXYZRGB>);
67 pcl::VoxelGrid<pcl::PointXYZRGB> voxfilter;
68 voxfilter.setInputCloud (cloud_in);
69 voxfilter.setLeafSize (0.01f, 0.01f, 0.01f);
70 voxfilter.filter (*cloud_downsampled);
71 pcl::StatisticalOutlierRemoval<pcl::PointXYZRGB> sor;
72 sor.setInputCloud (cloud_downsampled);
73 sor.setMeanK (cloud_downsampled->size()/2);
74 sor.setStddevMulThresh (1.0);
75 sor.filter (*cloud_in_filtered);
79 pcl::PointCloud<pcl::PointXYZRGB>::Ptr ReconstructionRoutine::getPointCloud()
85 pcl::PointCloud<pcl::PointXYZRGB>::Ptr ReconstructionRoutine::getPointCloudComplete()
87 return this->cloudComplete;
91 void ReconstructionRoutine::resetClouds()
94 cloudComplete->clear();
98 bool ReconstructionRoutine::triangulateSinglePoint(IplImage* imgL, IplImage* imgR,
99 yarp::sig::Vector &point2D,
100 yarp::sig::Vector &point3D)
102 point3D.resize(3,0.0);
103 Mat leftIm=cvarrToMat(imgL);
104 Mat rightIm=cvarrToMat(imgR);
105 disp->setImages(leftIm,rightIm);
106 while(!disp->checkDone())
107 yarp::os::Time::delay(0.1);
109 Point2f pixel(point2D[0],point2D[1]);
112 disp->triangulate(pixel,point);
124 bool ReconstructionRoutine::reconstruct(IplImage* imgL, IplImage* imgR, Bottle& pixelList)
126 Mat leftIm=cvarrToMat(imgL);
127 Mat rightIm=cvarrToMat(imgR);
128 disp->setImages(leftIm,rightIm);
129 while(!disp->checkDone())
130 yarp::os::Time::delay(0.1);
132 triangulation(imgL,cloudComplete,pixelList);
133 filter(cloudComplete,cloud);
139 bool ReconstructionRoutine::updateDisparity(IplImage* imgL, IplImage* imgR)
141 Mat leftIm=cvarrToMat(imgL);
142 Mat rightIm=cvarrToMat(imgR);
143 disp->setImages(leftIm,rightIm);
144 while(!disp->checkDone())
145 yarp::os::Time::delay(0.1);
148 disp->getDisparity(disparity);
149 IplImage disparityImg=disparity;
150 ImageOf<PixelMono> depthToDisplay;
151 depthToDisplay.wrapIplImage(&disparityImg);
152 disparityOut.prepare()=depthToDisplay;
153 disparityOut.write();
159 void ReconstructionRoutine::triangulation(IplImage* imgL, pcl::PointCloud<pcl::PointXYZRGB>::Ptr input, yarp::os::Bottle& pixelList)
161 Bottle* listOfPoints=pixelList.get(0).asList();
163 for (
int i=0; i<listOfPoints->size(); i++)
166 Bottle* point=listOfPoints->get(i).asList();
167 point2D.x=point->get(0).asDouble();
168 point2D.y=point->get(1).asDouble();
171 disp->triangulate(point2D,point3D);
175 CvScalar color=cvGet2D(imgL,point2D.y,point2D.x);
177 pcl::PointXYZRGB newPoint;
178 newPoint.x=point3D.x;
179 newPoint.y=point3D.y;
180 newPoint.z=point3D.z;
182 newPoint.r=color.val[0];
183 newPoint.g=color.val[1];
184 newPoint.b=color.val[2];
186 uint8_t r=color.val[0];
187 uint8_t g=color.val[1];
188 uint8_t b=color.val[2];
190 newPoint.rgba = ((uint32_t)r << 16 | (uint32_t)g << 8 | (uint32_t)b);
192 input->push_back(newPoint);