tracking integrated

This commit is contained in:
Micaela Verucchi
2019-04-20 15:48:52 +02:00
parent 9a4a65a3c3
commit 9b413b77ab
5 changed files with 139 additions and 142 deletions
+51 -60
View File
@@ -17,8 +17,6 @@
#include "gdal/gdal_priv.h"
#include "gdal/cpl_conv.h"
#include "serialize.hpp"
struct obj_coords
@@ -28,78 +26,74 @@ struct obj_coords
float cl;
};
void readTiff(char*filename, double *adfGeoTransform)
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 );
}
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];
//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 );
//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)
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]));
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)
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";
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)
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<Road_User> 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};
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};
Message m{CAM_IDX, t_stamp_ms, ruv.size(), ruv};
archive(m);
//std::cout<<buf->str()<<std::endl;
//return buf;
@@ -153,43 +147,41 @@ int map_class_coco_to_voc(int coco_class)
FILE *out_file = fopen("prova_pixel.txt", "w");
void convert_coords(struct obj_coords *coords, int i, int x, int y, int detected_class,cv::Mat H, double *adfGeoTransform, int frame_nbr)
void convert_coords(struct obj_coords *coords, int i, int x, int y, int detected_class, cv::Mat H, double *adfGeoTransform, int frame_nbr)
{
double latitude, longitude;
std::vector<cv::Point2f> x_y, ll;
std::vector<cv::Point2f> x_y, ll;
x_y.push_back(cv::Point2f(x, y));
//transform camera pixel to map pixel
cv::perspectiveTransform( x_y, ll, H);
cv::perspectiveTransform(x_y, ll, H);
//tranform to map pixel to map gps
pixel2coord(ll[0].x, ll[0].y, latitude,longitude, adfGeoTransform);
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)
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);
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)
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));
float *proj_matrix = (float *)malloc(9 * sizeof(float));
fp = fopen(path, "r");
if (fp == NULL)
@@ -198,7 +190,7 @@ void read_projection_matrix(cv::Mat &H, int &proj_matrix_read, char* path)
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]))
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;
@@ -206,7 +198,9 @@ void read_projection_matrix(cv::Mat &H, int &proj_matrix_read, char* path)
}
free(line);
fclose(fp);
fillMatrix(H, proj_matrix);
fillMatrix(H, proj_matrix);
free(proj_matrix);
}
@@ -219,7 +213,7 @@ int open_socket(char *ip, int &sock, int &socket_opened)
{
printf("Could not create socket");
}
puts("Socket created");
puts("Socket created");
server.sin_addr.s_addr = inet_addr(ip);
server.sin_family = AF_INET;
@@ -243,14 +237,13 @@ int send_client_dummy(struct obj_coords *coords, int n_coords, int &sock, int &s
std::stringbuf *message = new std::stringbuf();
serialize_coords(coords, n_coords, CAM_IDX, message);
//std::cout<<message->str().length()<<std::endl;
/*open socket if not already opened*/
if (socket_opened == 0)
{
int res = open_socket("127.0.0.1",sock, socket_opened);
if(res)
int res = open_socket("127.0.0.1", sock, socket_opened);
if (res)
printf("Socket opened!\n");
else
{
@@ -259,8 +252,6 @@ int send_client_dummy(struct obj_coords *coords, int n_coords, int &sock, int &s
}
}
/*send message to server*/
if (send(sock, message->str().data(), message->str().length(), 0) < 0)
{