Browse Source

1、添加本地ip获取功能;
2、grpc服务启动自动监听本地端口;
3、四个图像合并识别;

LiuZe 1 year ago
parent
commit
af2663a913
3 changed files with 220 additions and 93 deletions
  1. 125 0
      include/pcl/point3D_tool.cpp
  2. 28 93
      include/pcl/point3D_tool.h
  3. 67 0
      include/tool/ip.hpp

+ 125 - 0
include/pcl/point3D_tool.cpp

@@ -3,3 +3,128 @@
 //
 
 #include "point3D_tool.h"
+
+bool Point3D_tool::WriteTxtCloud(const std::string &file, pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud) {
+    DLOG(INFO) << "begain push point data to " << file;
+    std::fstream fileTxtCloud;
+    fileTxtCloud.open(file, std::ios_base::trunc | std::ios::in | std::ios::out);
+    for (auto &point: *cloud) {
+        fileTxtCloud << point.x << " " << point.y << " " << point.z << std::endl;
+    }
+    fileTxtCloud.close();
+    DLOG(INFO) << "Push point complete, push point number: " << cloud->size();
+    return true;
+}
+
+bool Point3D_tool::WriteTxtCloud(const std::string &file, pcl::PointCloud<pcl::PointXYZI>::Ptr &cloud) {
+    DLOG(INFO) << "begain push point data to " << file;
+    std::fstream fileTxtCloud;
+    fileTxtCloud.open(file, std::ios_base::trunc | std::ios::in | std::ios::out);
+    for (auto &point: *cloud) {
+        fileTxtCloud << point.x << " " << point.y << " " << point.z << std::endl;
+    }
+    fileTxtCloud.close();
+    DLOG(INFO) << "Push point complete, push point number: " << cloud->size();
+    return true;
+}
+
+bool Point3D_tool::ReadTxtCloud(const std::string &file, pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud) {
+    DLOG(INFO) << "Load point data form file: " << file;
+    std::ifstream fin(file.c_str());
+    if (fin.bad()) {
+        LOG(WARNING) << "File " << file << " don't exist.";
+        return false;
+    }
+    const int line_length = 64;
+    char str[line_length] = {0};
+    while (fin.getline(str, line_length)) {
+        pcl::PointXYZ point{};
+        if (string2PointXYZ(str, point)) {
+            cloud->push_back(point);
+        }
+    }
+    DLOG(INFO) << "Load point complete, get point number: " << cloud->size();
+    return true;
+}
+
+template <typename PclPoint>
+int Point3D_tool::getMinRect(cv::RotatedRect &rect, pcl::shared_ptr<pcl::PointCloud<PclPoint>> &clouds) {
+    if (clouds->points.size() < 4) {
+        DLOG(ERROR) << "points to little.";
+        return false;
+    }
+    std::vector<cv::Point2f> cv_clouds;
+    for (auto &point: clouds->points) {
+        cv_clouds.emplace_back(point.x, point.y);
+    }
+    rect = cv::minAreaRect(cv_clouds);
+    return true;
+}
+
+int Point3D_tool::getRectCloud(cv::RotatedRect &rect, pcl::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> &points, float z_value, int numbers) {
+    cv::Point2f cv_points[4];
+    rect.points(cv_points);
+    // PclPoint point;
+    pcl::PointXYZ point;
+    // 左侧点
+    double step_x = (cv_points[1].x - cv_points[0].x) / numbers;
+    double step_y = (cv_points[1].y - cv_points[0].y) / numbers;
+    for (int i = 0; i < numbers; i++) {
+        point.x = cv_points[0].x + i * step_x;
+        point.y = cv_points[0].y + i * step_y;
+        point.z = z_value;
+        points->points.emplace_back(point);
+    }
+
+    // 上侧点
+    step_x = (cv_points[2].x - cv_points[1].x) / numbers;
+    step_y = (cv_points[2].y - cv_points[1].y) / numbers;
+    for (int i = 0; i < numbers; i++) {
+        point.x = cv_points[1].x + i * step_x;
+        point.y = cv_points[1].y + i * step_y;
+        point.z = z_value;
+        points->points.emplace_back(point);
+    }
+
+    // 右侧点
+    step_x = (cv_points[3].x - cv_points[2].x) / numbers;
+    step_y = (cv_points[3].y - cv_points[2].y) / numbers;
+    for (int i = 0; i < numbers; i++) {
+        point.x = cv_points[2].x + i * step_x;
+        point.y = cv_points[2].y + i * step_y;
+        point.z = z_value;
+        points->points.emplace_back(point);
+    }
+
+
+    // 下侧点
+    step_x = (cv_points[0].x - cv_points[3].x) / numbers;
+    step_y = (cv_points[0].y - cv_points[3].y) / numbers;
+    for (int i = 0; i < numbers; i++) {
+        point.x = cv_points[3].x + i * step_x;
+        point.y = cv_points[3].y + i * step_y;
+        point.z = z_value;
+        points->points.emplace_back(point);
+    }
+
+    return points->size();
+}
+
+template <typename PclPoint>
+int Point3D_tool::getRectCloud(pcl::shared_ptr<pcl::PointCloud<PclPoint>> &clouds, pcl::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> &points, float z_value, int numbers) {
+    cv::RotatedRect rect = getMinRect(clouds);
+    getRectCloud(rect, points, z_value, numbers);
+    return points->size();
+}
+
+void Point3D_tool::getRectWidthlength(cv::RotatedRect &rect, double &width, double &length) {
+    cv::Point2f points[4];
+    rect.points(points);
+
+    double a = sqrt((points[1].x - points[0].x) * (points[1].x - points[0].x) + (points[1].y - points[0].y) * (points[1].y - points[0].y));
+    double b = sqrt((points[2].x - points[1].x) * (points[2].x - points[1].x) + (points[2].y - points[1].y) * (points[2].y - points[1].y));
+
+    width = MIN(a, b);
+    length = MAX(a, b);
+}
+

+ 28 - 93
include/pcl/point3D_tool.h

@@ -14,107 +14,42 @@
 class Point3D_tool
 {
 public:
-	//坐标
-	struct Point3D
-	{
-		float x=0;				//x轴
-		float y=0;				//y轴
-		float z=0;				//z轴
-	};
+    static bool WriteTxtCloud(const std::string &file, pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud);
 
-	//平面坐标的限定范围
-	struct Point3D_box
-	{
-		float x_min=0;				//x轴最小值
-		float x_max=0;				//x轴最大值
-		float y_min=0;				//y轴最小值
-		float y_max=0;				//y轴最大值
-		float z_min=0;				//z轴最小值
-		float z_max=0;				//z轴最大值
-	};
+    static bool WriteTxtCloud(const std::string &file, pcl::PointCloud<pcl::PointXYZI>::Ptr &cloud);
+
+    static bool ReadTxtCloud(const std::string &file, pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud);
 
 	template <typename PclPoint>
-	static int getMinRect(cv::RotatedRect &rect, pcl::shared_ptr<pcl::PointCloud<PclPoint>> &clouds) {
-		if (clouds->points.size() < 4) {
-			DLOG(ERROR) << "points to little.";
-			return false;
-		}
-		std::vector<cv::Point2f> cv_clouds;
-		for (auto &point: clouds->points) {
-			cv_clouds.emplace_back(point.x, point.y);
-		}
-		rect = cv::minAreaRect(cv_clouds);
-		return true;
-	}
+	static int getMinRect(cv::RotatedRect &rect, pcl::shared_ptr<pcl::PointCloud<PclPoint>> &clouds);
 
 	// template <typename PclPoint>
 	// static int getMinRect(cv::RotatedRect &rect, pcl::shared_ptr<pcl::PointCloud<PclPoint>> &points) {
-	static int getRectCloud(cv::RotatedRect &rect, pcl::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> &points, float z_value = 0, int numbers = 100) {
-		cv::Point2f cv_points[4];
-		rect.points(cv_points);
-		// PclPoint point;
-		pcl::PointXYZ point;
-		// 左侧点
-		double step_x = (cv_points[1].x - cv_points[0].x) / numbers;
-		double step_y = (cv_points[1].y - cv_points[0].y) / numbers;
-		for (int i = 0; i < numbers; i++) {
-			point.x = cv_points[0].x + i * step_x;
-			point.y = cv_points[0].y + i * step_y;
-			point.z = z_value;
-			points->points.emplace_back(point);
-		}
-
-		// 上侧点
-		step_x = (cv_points[2].x - cv_points[1].x) / numbers;
-		step_y = (cv_points[2].y - cv_points[1].y) / numbers;
-		for (int i = 0; i < numbers; i++) {
-			point.x = cv_points[1].x + i * step_x;
-			point.y = cv_points[1].y + i * step_y;
-			point.z = z_value;
-			points->points.emplace_back(point);
-		}
-
-		// 右侧点
-		step_x = (cv_points[3].x - cv_points[2].x) / numbers;
-		step_y = (cv_points[3].y - cv_points[2].y) / numbers;
-		for (int i = 0; i < numbers; i++) {
-			point.x = cv_points[2].x + i * step_x;
-			point.y = cv_points[2].y + i * step_y;
-			point.z = z_value;
-			points->points.emplace_back(point);
-		}
-
-
-		// 下侧点
-		step_x = (cv_points[0].x - cv_points[3].x) / numbers;
-		step_y = (cv_points[0].y - cv_points[3].y) / numbers;
-		for (int i = 0; i < numbers; i++) {
-			point.x = cv_points[3].x + i * step_x;
-			point.y = cv_points[3].y + i * step_y;
-			point.z = z_value;
-			points->points.emplace_back(point);
-		}
-
-		return points->size();
-	}
+	static int getRectCloud(cv::RotatedRect &rect, pcl::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> &points, float z_value = 0, int numbers = 100);
 
 	template <typename PclPoint>
-	static int getRectCloud(pcl::shared_ptr<pcl::PointCloud<PclPoint>> &clouds, pcl::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> &points, float z_value = 0, int numbers = 100) {
-		cv::RotatedRect rect = getMinRect(clouds);
-        getRectCloud(rect, points, z_value, numbers);
-		return points->size();
-	}
-
-	static void getRectWidthlength(cv::RotatedRect &rect, double &width, double &length) {
-		cv::Point2f points[4];
-		rect.points(points);
-
-		double a = sqrt((points[1].x - points[0].x) * (points[1].x - points[0].x) + (points[1].y - points[0].y) * (points[1].y - points[0].y));
-		double b = sqrt((points[2].x - points[1].x) * (points[2].x - points[1].x) + (points[2].y - points[1].y) * (points[2].y - points[1].y));
-
-		width = MIN(a, b);
-		length = MAX(a, b);
-	}
+	static int getRectCloud(pcl::shared_ptr<pcl::PointCloud<PclPoint>> &clouds, pcl::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> &points, float z_value = 0, int numbers = 100);
+
+	static void getRectWidthlength(cv::RotatedRect &rect, double &width, double &length);
+
+private:
+    static bool string2PointXYZ(const std::string &str, pcl::PointXYZ &point) {
+        std::istringstream iss;
+        iss.str(str);
+        float value;
+        float data[3];
+        for (int i = 0; i < 3; ++i) {
+            if (iss >> value) {
+                data[i] = value;
+            } else {
+                return false;
+            }
+        }
+        point.x = data[0];
+        point.y = data[1];
+        point.z = data[2];
+        return true;
+    }
 };
 
 

+ 67 - 0
include/tool/ip.hpp

@@ -0,0 +1,67 @@
+#pragma once
+
+#include <sys/types.h>
+#include <ifaddrs.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <string.h>
+#include <iostream>
+#include <vector>
+
+class INetInfo {
+public:
+    static std::vector<std::string> getIpv4List() {
+        return getIpList();
+    }
+
+    static std::vector<std::string> getIpv6List() {
+        return getIpList(AF_INET6);
+    }
+private:
+    static std::vector<std::string> getIpList(int ipv4_6 = AF_INET) {
+        int ret_val = 0;
+        std::vector<std::string> ip_list;
+
+        struct ifaddrs * ifAddrStruct 	= NULL;
+        void * tmpAddrPtr 				= NULL;
+
+        // 1.
+        ret_val 						= getifaddrs(&ifAddrStruct);
+        if (0 != ret_val) {
+            ret_val = errno;
+            return ip_list;
+        }
+
+        // 2.
+        std::string str_ipvX;
+
+        int padress_buf_len = 0;
+        char addressBuffer[INET6_ADDRSTRLEN] = {0};
+
+        if (AF_INET6 == ipv4_6)
+            padress_buf_len = INET6_ADDRSTRLEN;
+        else
+            padress_buf_len = INET_ADDRSTRLEN;
+
+
+        while (NULL != ifAddrStruct )
+        {
+            if (ipv4_6 == ifAddrStruct->ifa_addr->sa_family )
+            {
+                // is a valid IP4 Address
+                tmpAddrPtr = &((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
+
+                inet_ntop(ipv4_6, tmpAddrPtr, addressBuffer, padress_buf_len);
+                str_ipvX = std::string(addressBuffer);
+
+                ip_list.push_back(str_ipvX);
+
+                memset(addressBuffer, 0, padress_buf_len);
+            }
+
+            ifAddrStruct=ifAddrStruct->ifa_next;
+        }
+
+        return ip_list;
+    }
+};