leon 1 місяць тому
батько
коміт
0688d2695b
1 змінених файлів з 37 додано та 15 видалено
  1. 37 15
      src/nodes/httpPush/httpPush.cpp

+ 37 - 15
src/nodes/httpPush/httpPush.cpp

@@ -5,27 +5,49 @@
 namespace Node
 {
 
-static cv::Mat get_color_depth(cv::Mat inverse_depth)
-{
-    double min_val, max_val;
-    cv::minMaxLoc(inverse_depth, &min_val, &max_val);
+static cv::Mat get_color_depth(const cv::Mat& depth, float min_range = 0.0f, float max_range = 0.0f) {
+    // 检查输入数据类型
+    CV_Assert(depth.type() == CV_32FC1 || depth.type() == CV_16UC1);
+
+    cv::Mat validMask;
+    cv::Mat depthFloat;
+
+    // 转换为浮点类型并处理无效值
+    if (depth.type() == CV_16UC1) {
+        // 假设无效值为0(如Kinect深度图)
+        validMask = (depth > 0);
+        depth.convertTo(depthFloat, CV_32FC1, 1.0 / 1000.0); // 16UC1毫米转浮点米
+    } else {
+        validMask = (depth > 0);
+        depthFloat = depth.clone();
+    }
 
-    float max_invdepth_vizu = std::min(static_cast<float>(max_val), 1.0f / 0.1f);
-    float min_invdepth_vizu = std::max(static_cast<float>(1.0 / 250.0), static_cast<float>(min_val));
+    // 自动计算有效范围(若未指定)
+    if (min_range == 0.0f && max_range == 0.0f) {
+        cv::minMaxLoc(depthFloat, &min_range, &max_range, 0, 0, validMask);
+    }
+
+    // 归一化到0~255
+    cv::Mat normalized;
+    cv::Mat maskInv = ~validMask;
+    if (max_range > min_range) {
+        depthFloat.setTo(0, maskInv); // 屏蔽无效值
+        depthFloat.convertTo(normalized, CV_8UC1, 255.0 / (max_range - min_range), -min_range * 255.0 / (max_range - min_range));
+    } else {
+        normalized = cv::Mat::zeros(depth.size(), CV_8UC1);
+    }
 
-    cv::Mat inverse_depth_normalized = (inverse_depth - min_invdepth_vizu) / (max_invdepth_vizu - min_invdepth_vizu);
-    
-    cv::Mat inverse_depth_normalized_8u;
-    inverse_depth_normalized.convertTo(inverse_depth_normalized_8u, CV_8UC1, 255);
+    // 应用伪彩色映射(JET)
+    cv::Mat colorized;
+    cv::applyColorMap(normalized, colorized, cv::COLORMAP_JET);
 
-    cv::Mat color_depth;
-    cv::applyColorMap(inverse_depth_normalized_8u, color_depth, cv::COLORMAP_JET);
+    // 标记无效区域为红色
+    colorized.setTo(cv::Scalar(0, 0, 255), maskInv);
 
-    cv::Mat color_depth_bgr;
-    cv::cvtColor(color_depth, color_depth_bgr, cv::COLOR_BGR2RGB);
-    return color_depth_bgr;
+    return colorized;
 }
 
+
 void HttpPushNode::work()
 {
     printf("HttpPush %s\n", name_.c_str());