#ifndef SEND_H #define SEND_H #include #include #include #include #include //socket #include //inet_addr #include //write #include #include #include "gdal.h" #include #include #include "gdal/gdal_priv.h" #include "gdal/cpl_conv.h" #include "serialize.hpp" struct obj_coords { double LAT; double LONG; float cl; }; void readTiff(char *filename, double *adfGeoTransform) { GDALDataset *poDataset; GDALAllRegister(); poDataset = (GDALDataset *)GDALOpen(filename, GA_ReadOnly); if (poDataset != NULL) { //int colms = poDataset->GetRasterXSize(); //int rows = poDataset->GetRasterYSize(); poDataset->GetGeoTransform(adfGeoTransform); } } void pixel2coord(int x, int y, double &lat, double &lon, double *adfGeoTransform) { //Returns global coordinates from pixel x, y coordinates double xoff, a, b, yoff, d, e; xoff = adfGeoTransform[0]; a = adfGeoTransform[1]; b = adfGeoTransform[2]; yoff = adfGeoTransform[3]; d = adfGeoTransform[4]; e = adfGeoTransform[5]; //printf("%f %f %f %f %f %f\n",xoff, a, b, yoff, d, e ); lon = a * x + b * y + xoff; lat = d * x + e * y + yoff; } void coord2pixel(double lat, double lon, int &x, int &y, double *adfGeoTransform) { x = int(round((lon - adfGeoTransform[0]) / adfGeoTransform[1])); y = int(round((lat - adfGeoTransform[3]) / adfGeoTransform[5])); } void fillMatrix(cv::Mat &H, float *matrix, bool show = false) { double *vals = (double *)H.data; for (int i = 0; i < 9; i++) { vals[i] = matrix[i]; } if (show) std::cout << H << "\n"; } void serialize_coords(struct obj_coords *c, int obj_n, int CAM_IDX, std::stringbuf *buf) { std::ostream os(buf); cereal::PortableBinaryOutputArchive archive(os); struct timeval tv; gettimeofday(&tv, NULL); unsigned long long t_stamp_ms = (unsigned long long)(tv.tv_sec) * 1000 + (unsigned long long)(tv.tv_usec) / 1000; std::vector ruv; int i; for (i = 0; i < obj_n; i++) { Road_User r{c[i].LAT, c[i].LONG, 0, 0, (int)c[i].cl}; ruv.push_back(r); } Message m{CAM_IDX, t_stamp_ms, ruv.size(), ruv}; archive(m); //std::cout<str()< x_y, ll; x_y.push_back(cv::Point2f(x, y)); //transform camera pixel to map pixel cv::perspectiveTransform(x_y, ll, H); //tranform to map pixel to map gps pixel2coord(ll[0].x, ll[0].y, latitude, longitude, adfGeoTransform); //printf("lat: %f, long:%f \n", latitude, longitude); coords[i].LAT = latitude; coords[i].LONG = longitude; coords[i].cl = map_class_coco_to_voc(detected_class); if (detected_class == 0) { struct timeval tv; gettimeofday(&tv, NULL); unsigned long long t_stamp_ms = (unsigned long long)(tv.tv_sec) * 1000 + (unsigned long long)(tv.tv_usec) / 1000; //fprintf(out_file, "%d %lld %d %d\n",frame_nbr, t_stamp_ms, int(ll[0].x), int(ll[0].y)); fprintf(out_file, "%d %lld %f %f\n", frame_nbr, t_stamp_ms, coords[i].LAT, coords[i].LONG); } } void read_projection_matrix(cv::Mat &H, int &proj_matrix_read, char *path) { FILE *fp; char *line = NULL; size_t len = 0; ssize_t read; float *proj_matrix = (float *)malloc(9 * sizeof(float)); fp = fopen(path, "r"); if (fp == NULL) exit(EXIT_FAILURE); int i = 0; while ((read = getline(&line, &len, fp)) != -1) { if (3 == sscanf(line, "%f %f %f", &proj_matrix[i * 3 + 0], &proj_matrix[i * 3 + 1], &proj_matrix[i * 3 + 2])) { i++; proj_matrix_read = 1; } } free(line); fclose(fp); fillMatrix(H, proj_matrix); free(proj_matrix); } int open_socket(char *ip, int &sock, int &socket_opened) { struct sockaddr_in server; sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == -1) { printf("Could not create socket"); } puts("Socket created"); server.sin_addr.s_addr = inet_addr(ip); server.sin_family = AF_INET; server.sin_port = htons(8888); /*connect to remote server*/ if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) { perror("connect failed. Error"); socket_opened = 0; return 0; } puts("Connected\n"); socket_opened = 1; return 1; } int send_client_dummy(struct obj_coords *coords, int n_coords, int &sock, int &socket_opened, int CAM_IDX) { /*serialize coords*/ std::stringbuf *message = new std::stringbuf(); serialize_coords(coords, n_coords, CAM_IDX, message); //std::cout<str().length()<str().data(), message->str().length(), 0) < 0) { puts("Send failed"); socket_opened = 0; } delete message; //free(message); //close(sock); return 1; } #endif /*SEND_H*/