}
#ifdef MV_3D_POINTCLOUD_IS_AVAILABLE
-void Mv3d::GetPointcloudFromSource(DfsInputData &input, DfsOutputData &depthData, mv_3d_pointcloud_s &pointcloud)
+PointCloudPtr Mv3d::GetPointcloudFromSource(DfsInputData &input, DfsOutputData &depthData)
{
camera::PinholeCameraIntrinsic intrinsic;
io::ReadIJsonConvertible(mIntrinsicPath, intrinsic);
std::tie(pcd, pt_map) = pcd->RemoveRadiusOutliers(mOutlierRemovalPoints, mOutlierRemovalRadius, true);
}
- pointcloud.pointcloud = static_cast<void *>(new std::shared_ptr<open3d::geometry::PointCloud>(std::move(pcd)));
+ return pcd;
}
#endif
mDepthUserData);
#ifdef MV_3D_POINTCLOUD_IS_AVAILABLE
if (mPointcloudCallback) {
- mv_3d_pointcloud_s p = { .type = MV_3D_POINTCLOUD_TYPE_PCD_BIN, .pointcloud = NULL };
- GetPointcloudFromSource(input, depthData, p);
-
- mv_3d_pointcloud_h pcd = &p;
- mPointcloudCallback(baseSource, pcd, mPointcloudUserData);
- auto pPcd = static_cast<std::shared_ptr<open3d::geometry::PointCloud> *>(p.pointcloud);
- auto _pcd = std::move(pPcd);
- delete _pcd;
+ mv_3d_pointcloud_s p { .type = MV_3D_POINTCLOUD_TYPE_PCD_BIN,
+ .pointcloud = GetPointcloudFromSource(input, depthData) };
+
+ mPointcloudCallback(baseSource, static_cast<mv_3d_pointcloud_h>(&p), mPointcloudUserData);
}
#endif
delete[] static_cast<unsigned char *>(input.data);
handle->mDepthUserData);
#ifdef MV_3D_POINTCLOUD_IS_AVAILABLE
if (handle->mPointcloudCallback) {
- mv_3d_pointcloud_s p = { .type = MV_3D_POINTCLOUD_TYPE_PCD_BIN, .pointcloud = NULL };
- //mPointcloudThread = g_thread_new("pointcloud_thread",
- // &Mv3d::PointcloudThreadLoop,
- // static_cast<gpointer>(this));
- handle->GetPointcloudFromSource(*pInput, depthData, p);
-
- mv_3d_pointcloud_h pcd = &p;
- handle->mPointcloudCallback(static_cast<mv_source_h>(handle->mInternalSource), pcd,
+ mv_3d_pointcloud_s p { .type = MV_3D_POINTCLOUD_TYPE_PCD_BIN,
+ .pointcloud = handle->GetPointcloudFromSource(*pInput, depthData) };
+
+ handle->mPointcloudCallback(handle->mInternalSource, static_cast<mv_3d_pointcloud_h>(&p),
handle->mPointcloudUserData);
- auto pPcd = static_cast<std::shared_ptr<open3d::geometry::PointCloud> *>(p.pointcloud);
- auto _pcd = std::move(pPcd);
- delete _pcd;
}
#endif
delete[] static_cast<unsigned char *>(pInput->data);
int Mv3d::WritePointcloudFile(mv_3d_pointcloud_h pointcloud, mv_3d_pointcloud_type_e type, char *fileName)
{
#ifdef MV_3D_POINTCLOUD_IS_AVAILABLE
- mv_3d_pointcloud_s *s = (mv_3d_pointcloud_s *) pointcloud;
- if (s == NULL) {
+ auto s = static_cast<mv_3d_pointcloud_s *>(pointcloud);
+ if (!s) {
LOGE("Pointcloud data is NULL");
return MEDIA_VISION_ERROR_INVALID_PARAMETER;
}
if (errno == EACCES || errno == EPERM) {
utility::LogInfo("Fail to access path[%s]: Permission Denied", mPointcloudOutputPath.c_str());
return MEDIA_VISION_ERROR_PERMISSION_DENIED;
- ;
- } else {
- utility::LogInfo("Fail to access path[%s]: Invalid Path", mPointcloudOutputPath.c_str());
- return MEDIA_VISION_ERROR_INVALID_PARAMETER;
}
- }
- bool bText = false;
- if (type == MV_3D_POINTCLOUD_TYPE_PCD_TXT || type == MV_3D_POINTCLOUD_TYPE_PLY_TXT)
- bText = true;
- else
- bText = false;
+ utility::LogInfo("Fail to access path[%s]: Invalid Path", mPointcloudOutputPath.c_str());
+ return MEDIA_VISION_ERROR_INVALID_PARAMETER;
+ }
- auto pPcd = static_cast<std::shared_ptr<open3d::geometry::PointCloud> *>(s->pointcloud);
- open3d::geometry::PointCloud p;
- p += **pPcd;
+ bool bText = (type == MV_3D_POINTCLOUD_TYPE_PCD_TXT || type == MV_3D_POINTCLOUD_TYPE_PLY_TXT);
std::string fullPath = mPointcloudOutputPath + std::string("/") + std::string(fileName);
- if (io::WritePointCloud(fullPath.c_str(), p, { bText, false, false, {} })) {
- utility::LogInfo("Successfully wrote {}", fullPath.c_str());
- } else {
+ if (!io::WritePointCloud(fullPath.c_str(), *(s->pointcloud), { bText, false, false, {} })) {
utility::LogError("Failed to write {}", fullPath.c_str());
return MEDIA_VISION_ERROR_INTERNAL;
}
+
+ utility::LogInfo("Successfully wrote {}", fullPath.c_str());
+
+ return MEDIA_VISION_ERROR_NONE;
#else
return MEDIA_VISION_ERROR_NOT_SUPPORTED;
#endif
- return MEDIA_VISION_ERROR_NONE;
-}
-}
}
+} // namespace mv3d
+} // namespace mediavision
MEDIA_VISION_NULL_ARG_CHECK(inlier);
MEDIA_VISION_FUNCTION_ENTER();
- mv_3d_pointcloud_s *s = (mv_3d_pointcloud_s *) pointcloud;
+ auto s = static_cast<mv_3d_pointcloud_s *>(pointcloud);
+
Eigen::Vector4d *best_plane_model = new Eigen::Vector4d;
std::vector<size_t> *plane_inlier = new std::vector<size_t>;
- auto pPcd = static_cast<std::shared_ptr<open3d::geometry::PointCloud> *>(s->pointcloud);
- open3d::geometry::PointCloud p;
- p += **pPcd;
- std::tie(*best_plane_model, *plane_inlier) = p.SegmentPlane(DISTANCE_THRESHOLD, RANSAC_NUMBER, NUM_ITERATIONS);
+ std::tie(*best_plane_model, *plane_inlier) =
+ s->pointcloud->SegmentPlane(DISTANCE_THRESHOLD, RANSAC_NUMBER, NUM_ITERATIONS);
+
*model = (mv_3d_pointcloud_plane_model_h) best_plane_model;
*inlier = (mv_3d_pointcloud_plane_inlier_h) plane_inlier;
MEDIA_VISION_NULL_ARG_CHECK(inlier);
MEDIA_VISION_FUNCTION_ENTER();
- mv_3d_pointcloud_s *s = (mv_3d_pointcloud_s *) pointcloud;
- std::vector<size_t> *plane_inlier = (std::vector<size_t> *) inlier;
- auto pPcd = static_cast<std::shared_ptr<open3d::geometry::PointCloud> *>(s->pointcloud);
- open3d::geometry::PointCloud p;
- p += **pPcd;
+ auto plane_inlier = static_cast<std::vector<size_t> *>(inlier);
+ auto s = static_cast<mv_3d_pointcloud_s *>(pointcloud);
- std::shared_ptr<geometry::PointCloud> plane = p.SelectByIndex(*plane_inlier);
- mv_3d_pointcloud_s _pcd = { .type = MV_3D_POINTCLOUD_TYPE_PCD_BIN, .pointcloud = NULL };
- _pcd.pointcloud = static_cast<void *>(new std::shared_ptr<open3d::geometry::PointCloud>(std::move(plane)));
- mv_3d_pointcloud_h pcd = &_pcd;
+ mv_3d_pointcloud_s _pcd { .type = MV_3D_POINTCLOUD_TYPE_PCD_BIN,
+ .pointcloud = s->pointcloud->SelectByIndex(*plane_inlier) };
auto pMv3d = static_cast<Mv3d *>(mv3d);
- int ret = pMv3d->WritePointcloudFile(pcd, type, filename);
+ int ret = pMv3d->WritePointcloudFile(static_cast<mv_3d_pointcloud_h>(&_pcd), type, filename);
if (ret != MEDIA_VISION_ERROR_NONE) {
LOGE("Failed to write pointcloud plane file");
ret = MEDIA_VISION_ERROR_INTERNAL;