2020-11-18 03:05:29 -03:00
{
"cells": [
{
"cell_type": "code",
2020-12-28 18:25:12 -03:00
"execution_count": 12,
2020-11-18 03:05:29 -03:00
"metadata": {},
2020-12-23 21:33:22 -03:00
"outputs": [],
2020-11-18 03:05:29 -03:00
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"from matplotlib import path\n",
"import matplotlib.patches as patches\n",
"from skimage import draw\n",
"import scipy.ndimage as ndimage\n",
"import Utils\n",
"import georasters as gr\n",
"import cv2\n",
"from Utils import doubleMADsfromMedian\n",
"from skimage.transform import resize\n",
"import pickle\n",
"import simplekml\n",
2020-12-23 21:33:22 -03:00
"import geopandas\n",
2020-11-18 03:05:29 -03:00
"\n",
"def order_rect(List_P_strings, top_bottom = False):\n",
" #If top_bottom is false then sort right left\n",
" if not top_bottom:\n",
" List_P_strings = [[(List_P[0][1],List_P[0][0]),\n",
" (List_P[1][1],List_P[1][0]),\n",
" (List_P[2][1],List_P[2][0]),\n",
" (List_P[3][1],List_P[3][0])] for List_P in List_P_strings]\n",
" \n",
" bboxes=sorted(List_P_strings, key=lambda x: x[0][0])\n",
" bboxes = [(P[0][0], P[0][1], P[2][0]-P[0][0], P[2][1]-P[0][1]) for P in bboxes]\n",
" df=pd.DataFrame(bboxes, columns=['x','y','w', 'h'], dtype=int)\n",
" \n",
"\n",
" df[\"x2\"] = df[\"x\"]+df[\"w\"] # adding column for x on the right side\n",
" df = df.sort_values([\"x\",\"y\", \"x2\"]) # sorting\n",
"\n",
"\n",
" for i in range(2): # change rows between each other by their coordinates several times \n",
" # to sort them completely \n",
" for ind in range(len(df)-1):\n",
" # print(ind, df.iloc[ind][4] > df.iloc[ind+1][0])\n",
" if df.iloc[ind][4] > df.iloc[ind+1][0] and df.iloc[ind][1]> df.iloc[ind+1][1]:\n",
" df.iloc[ind], df.iloc[ind+1] = df.iloc[ind+1].copy(), df.iloc[ind].copy()\n",
" \n",
" L_F = [np.array([[box[0], box[1]], \n",
" [box[0] + box[2], box[1]], \n",
" [box[0] + box[2], box[1] + box[3]], \n",
" [box[0], box[1] + box[3]]]) for box in df.values.tolist()]\n",
" \n",
" if not top_bottom:\n",
" L_F = [[(List_P[0][1],List_P[0][0]),\n",
" (List_P[1][1],List_P[1][0]),\n",
" (List_P[2][1],List_P[2][0]),\n",
" (List_P[3][1],List_P[3][0])] for List_P in L_F]\n",
2020-12-23 21:33:22 -03:00
" return np.array(L_F) \n",
"\n",
"\n",
"\n",
2020-12-28 18:25:12 -03:00
"def order_rect2(List_P_strings, factor_diameter, top_bottom = False):\n",
2020-12-23 21:33:22 -03:00
" #If top_bottom is false then sort right left\n",
" if top_bottom:\n",
" List_P_strings = [[(List_P[0][1],List_P[0][0]),\n",
" (List_P[1][1],List_P[1][0]),\n",
" (List_P[2][1],List_P[2][0]),\n",
" (List_P[3][1],List_P[3][0])] for List_P in List_P_strings]\n",
" \n",
" L_F = []\n",
" keypoints_to_search = List_P_strings[:]\n",
" while len(keypoints_to_search) > 0:\n",
" a = sorted(keypoints_to_search, key=lambda p: (p[0][0]) + (p[0][1]))[0] # find upper left point\n",
" b = sorted(keypoints_to_search, key=lambda p: (p[0][0]) - (p[0][1]))[-1] # find upper right point\n",
"\n",
" # convert opencv keypoint to numpy 3d point\n",
" a = np.array([a[0][0], a[0][1], 0])\n",
" b = np.array([b[0][0], b[0][1], 0])\n",
"\n",
" row_points = []\n",
" remaining_points = []\n",
" for k in keypoints_to_search:\n",
" p = np.array([k[0][0], k[0][1], 0])\n",
2020-12-28 18:25:12 -03:00
" d = factor_diameter * (k[2][1]-k[0][1])#k.size # diameter of the keypoint (might be a theshold)\n",
2020-12-23 21:33:22 -03:00
" dist = np.linalg.norm(np.cross(np.subtract(p, a), np.subtract(b, a))) / np.linalg.norm(b) # distance between keypoint and line a->b\n",
" if d/2 > dist:\n",
" row_points.append(k)\n",
" else:\n",
" remaining_points.append(k)\n",
"\n",
" L_F.extend(sorted(row_points, key=lambda h: h[0][0]))\n",
" keypoints_to_search = remaining_points\n",
"\n",
" \n",
" \n",
" if top_bottom:\n",
" L_F = [[(List_P[0][1],List_P[0][0]),\n",
" (List_P[1][1],List_P[1][0]),\n",
" (List_P[2][1],List_P[2][0]),\n",
" (List_P[3][1],List_P[3][0])] for List_P in L_F]\n",
2020-11-18 03:05:29 -03:00
" return np.array(L_F) "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Parameters"
]
},
{
"cell_type": "code",
2020-12-28 18:25:12 -03:00
"execution_count": 13,
2020-11-18 03:05:29 -03:00
"metadata": {},
"outputs": [],
"source": [
"#path_T = \"Thermo.tif\"\n",
"#path_String = \"Thermo_String_PV01.tif\"\n",
"\n",
2020-12-23 21:33:22 -03:00
"path_T = \"Los_Loros/TH_02_index_thermal_ir.tif\"\n",
"path_Mesa_shape = \"Los_Loros/Mesas.shp\"\n",
"#path_String = \"Los_Loros/Raster_Test.tif\"\n",
"ZonaPV = 'Test'\n",
"path_kml_panel = 'Los_Loros/KML/Paneles_' + ZonaPV +'.kml'\n",
"path_kml_mesa ='Los_Loros/KML/Mesa_' + ZonaPV +'.kml'\n",
"path_dict = 'Los_Loros/KML/Mesa_' + ZonaPV + '.pickle'\n",
2020-11-18 03:05:29 -03:00
"\n",
2020-12-23 21:33:22 -03:00
"#panel_size = (11 , 21)\n",
2020-11-18 03:05:29 -03:00
"#panel_size = (37 , 17) #weight, height size#\n",
"#panel_size = (20 , 35)\n",
2020-12-23 21:33:22 -03:00
"\n",
"split_Weight, split_Height = (10,2)\n",
2020-11-18 03:05:29 -03:00
"overlap = 0\n",
"order_top_bottom = False # order top bottom or right left\n",
2020-12-28 18:25:12 -03:00
"factor_diameter = 2 # Paremeter for enumeration try change\n",
2020-11-18 03:05:29 -03:00
"\n",
"\n",
2020-12-23 21:33:22 -03:00
"GR_T = gr.from_file(path_T)\n",
"geot = GR_T.geot\n",
"GR_T.raster.data[GR_T.raster.data == -10000] = 0"
2020-11-18 03:05:29 -03:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Enumerate Tables and Panels"
]
},
{
"cell_type": "code",
2020-12-28 18:25:12 -03:00
"execution_count": 14,
2020-11-18 03:05:29 -03:00
"metadata": {},
2020-12-23 21:33:22 -03:00
"outputs": [
{
"data": {
"text/plain": [
"'\"\\nlabel_im, nb_labels = ndimage.label(GR_String.raster.data > 0)#, structure= np.ones((2,2))) ## Label each connect region\\n\\n \\nL_strings = {} # {name: \\'001\\', points:(top-left, top-right, bottom-right, bottom-left) (x,y), \\'panels\\' : }\\n\\nepsilon = 0\\n\\nList_P_strings = []\\nfor i in range(1, nb_labels + 1):\\n \\n countours, hierarchy = cv2.findContours(np.uint8(label_im == i), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)\\n x_max = np.max(countours[0][:, 0, 0]) + epsilon\\n y_max = np.max(countours[0][:, 0, 1]) + epsilon\\n x_min = np.min(countours[0][:, 0, 0]) - epsilon\\n y_min = np.min(countours[0][:, 0, 1]) - epsilon\\n \\n List_P_strings.append([(x_min, y_min), (x_max, y_min), (x_max, y_max), (x_min, y_max)])\\n \\n'"
]
},
2020-12-28 18:25:12 -03:00
"execution_count": 14,
2020-12-23 21:33:22 -03:00
"metadata": {},
"output_type": "execute_result"
}
],
2020-11-18 03:05:29 -03:00
"source": [
2020-12-23 21:33:22 -03:00
"# If Mesas is Raster\n",
"\"\"\"\"\n",
2020-11-18 03:05:29 -03:00
"label_im, nb_labels = ndimage.label(GR_String.raster.data > 0)#, structure= np.ones((2,2))) ## Label each connect region\n",
"\n",
" \n",
"L_strings = {} # {name: '001', points:(top-left, top-right, bottom-right, bottom-left) (x,y), 'panels' : }\n",
"\n",
"epsilon = 0\n",
"\n",
"List_P_strings = []\n",
"for i in range(1, nb_labels + 1):\n",
" \n",
" countours, hierarchy = cv2.findContours(np.uint8(label_im == i), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)\n",
" x_max = np.max(countours[0][:, 0, 0]) + epsilon\n",
" y_max = np.max(countours[0][:, 0, 1]) + epsilon\n",
" x_min = np.min(countours[0][:, 0, 0]) - epsilon\n",
" y_min = np.min(countours[0][:, 0, 1]) - epsilon\n",
" \n",
" List_P_strings.append([(x_min, y_min), (x_max, y_min), (x_max, y_max), (x_min, y_max)])\n",
2020-12-23 21:33:22 -03:00
" \n",
"\"\"\""
]
},
{
"cell_type": "code",
2020-12-28 18:25:12 -03:00
"execution_count": 15,
2020-12-23 21:33:22 -03:00
"metadata": {},
"outputs": [],
"source": [
"## If mesas is Shape\n",
"\n",
"df = geopandas.read_file(path_Mesa_shape)\n",
"G = [i for i in df.geometry]\n",
"List_P_strings = []\n",
"\n",
"for g in G: \n",
" x,y = g.exterior.coords.xy\n",
" coords = np.dstack((x,y)).tolist()[0][:-1]\n",
" List_P_strings.append(Utils.gps2pixel(np.array(coords), geot))"
]
},
{
"cell_type": "code",
2020-12-28 18:25:12 -03:00
"execution_count": 16,
2020-12-23 21:33:22 -03:00
"metadata": {},
"outputs": [],
"source": [
2020-11-18 03:05:29 -03:00
"\n",
2020-12-23 21:33:22 -03:00
"L_strings = {}\n",
2020-11-18 03:05:29 -03:00
" \n",
2020-12-28 18:25:12 -03:00
"for i,List_P in enumerate(order_rect2(List_P_strings, factor_diameter, top_bottom=order_top_bottom), 1):\n",
2020-11-18 03:05:29 -03:00
" \n",
" L_strings[str(i)] = {'id': i, \n",
" 'points' : List_P, \n",
" 'panels' : {}, \n",
" 'status': 'default', \n",
2020-12-23 21:33:22 -03:00
" 'T': np.mean(GR_T.raster.data[List_P[0][1]:List_P[2][1],List_P[0][0]:List_P[2][0]])}\n",
2020-11-18 03:05:29 -03:00
"\n",
"for string_key in L_strings.keys():\n",
" \n",
" string = L_strings[string_key]\n",
" string['panels'] = {}\n",
" Points = Utils.order_points_rect(string['points']).astype(np.int)\n",
" \n",
" ## If strings is vertical or horizontal\n",
2020-12-23 21:33:22 -03:00
" #if (Points[2][0] - Points[0][0]) > (Points[2][1] - Points[0][1]):\n",
" # split_Weight, split_Height = np.int((Points[2][0] - Points[0][0]) / panel_size[0]) , np.int((Points[2][1] - Points[0][1]) / panel_size[1])\n",
" #else:\n",
" # split_Weight, split_Height = np.int((Points[2][0] - Points[0][0]) / panel_size[1]) , np.int((Points[2][1] - Points[0][1]) / panel_size[0])\n",
2020-11-18 03:05:29 -03:00
"\n",
2020-12-23 21:33:22 -03:00
" #split_Weight = max(split_Weight, 1)\n",
" #split_Height = max(split_Height, 1)\n",
2020-11-18 03:05:29 -03:00
" M, maxWidth, maxHeight = Utils.perspectiveTransform(Points)\n",
" sub_division = Utils.subdivision_rect([split_Weight, split_Height], maxWidth, maxHeight, overlap)\n",
" sub_division_origin = np.uint(cv2.perspectiveTransform(np.array(sub_division), np.linalg.inv(M)))\n",
" \n",
" for i,panels_coord in enumerate(order_rect(sub_division_origin, order_top_bottom),1):\n",
" string['panels'][str(i)] = {'id' : i,\n",
" 'points' : panels_coord,\n",
" 'status': 'default', \n",
2020-12-23 21:33:22 -03:00
" 'T' : np.mean(GR_T.raster.data[panels_coord[0][1]:panels_coord[2][1], panels_coord[0][0]:panels_coord[2][0]]),\n",
2020-11-18 03:05:29 -03:00
" 'severidad': 'default'} \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Save dictionary with gps data"
]
},
{
"cell_type": "code",
2020-12-28 18:25:12 -03:00
"execution_count": 17,
2020-11-18 03:05:29 -03:00
"metadata": {},
"outputs": [],
"source": [
"## Save List in coordinate latitud and longitude ###\n",
2020-12-23 21:33:22 -03:00
"\n",
2020-11-18 03:05:29 -03:00
"L_strings_coord = {}\n",
" \n",
"for string_key in L_strings.keys():\n",
" \n",
" string = L_strings[string_key]\n",
" points = string['points']\n",
" string_coord = {'id': 'Mesa_' + str(string['id']).zfill(3), \n",
" 'points': Utils.pixel2gps(points, geot), \n",
" 'panels': {}, \n",
" 'status': string['status'], \n",
" 'T' : string['T']}\n",
" \n",
" for panel_key in string['panels'].keys():\n",
" \n",
" panel = string['panels'][panel_key]\n",
" points = panel['points']\n",
" panel_coord = {'id': panel['id'],\n",
" 'points': Utils.pixel2gps(points, geot), \n",
" 'status': panel['status'], \n",
" 'prob': 0.0, \n",
2020-12-23 21:33:22 -03:00
" 'T': panel['T'], \n",
2020-11-18 03:05:29 -03:00
" 'severidad': 'default'}\n",
" \n",
" string_coord['panels'][panel_key] = panel_coord\n",
" \n",
" L_strings_coord[string_key] = string_coord\n",
2020-12-23 21:33:22 -03:00
"\n"
2020-11-18 03:05:29 -03:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Display image"
]
},
{
"cell_type": "code",
2020-12-28 18:25:12 -03:00
"execution_count": 18,
2020-12-23 21:33:22 -03:00
"metadata": {
"scrolled": true
},
2020-11-18 03:05:29 -03:00
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 432x288 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2020-12-24 00:32:16 -03:00
"image/png": "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
2020-11-18 03:05:29 -03:00
"text/plain": [
"<Figure size 1152x1152 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
2020-12-24 00:32:16 -03:00
"image/png": "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
2020-11-18 03:05:29 -03:00
"text/plain": [
"<Figure size 1152x1152 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"## Load List in coordinate latitud and longitude to pixels ###\n",
2020-12-24 00:32:16 -03:00
"string = L_strings_coord['13']\n",
2020-11-18 03:05:29 -03:00
"panels = string['panels']\n",
"\n",
"\n",
"epsilon = 0\n",
"matrix_expand_bounds = [[-epsilon, -epsilon],[+epsilon, -epsilon], [+epsilon, +epsilon], [-epsilon, +epsilon]]\n",
"\n",
"#geot = GR_RGB.geot\n",
"geot = GR_T.geot\n",
2020-12-23 21:33:22 -03:00
"\n",
2020-11-18 03:05:29 -03:00
"\n",
"\n",
"Points = Utils.gps2pixel(string['points'], geot) + matrix_expand_bounds\n",
"\n",
"\n",
"\n",
"plt.figure(0)\n",
"plt.figure(figsize=(16, 16))\n",
2020-12-23 21:33:22 -03:00
"plt.imshow(GR_T.raster.data)\n",
2020-11-18 03:05:29 -03:00
"plt.title('Origin Image')\n",
"ax = plt.gca()\n",
"\n",
"for Poly_key in L_strings_coord.keys():\n",
" \n",
" Poly = L_strings_coord[Poly_key]\n",
2020-12-23 21:33:22 -03:00
" poly = patches.Polygon(Utils.gps2pixel(Poly['points'],geot),\n",
2020-11-18 03:05:29 -03:00
" linewidth=2,\n",
" edgecolor='red',\n",
" alpha=0.5,\n",
" fill = True)\n",
2020-12-23 21:33:22 -03:00
" plt.text(np.mean([x[0] for x in Utils.gps2pixel(Poly['points'],geot)]), \n",
" np.mean([y[1] for y in Utils.gps2pixel(Poly['points'],geot)]) , \n",
2020-11-18 03:05:29 -03:00
" str(Poly['id']).split('_')[-1], bbox=dict(facecolor='red', alpha=0.8), fontsize=10)\n",
"\n",
" ax.add_patch(poly)\n",
" \n",
"plt.figure(1)\n",
"plt.figure(figsize=(16, 16))\n",
2020-12-23 21:33:22 -03:00
"#plt.imshow(GR_T.raster[0,Points[0][1] : Points[2][1], Points[0][0]: Points[2][0]])\n",
"plt.imshow(GR_T.raster[Points[0][1] : Points[2][1], Points[0][0]: Points[2][0]])\n",
2020-11-18 03:05:29 -03:00
"#plt.imshow((GR_RGB.raster[:3,:,:]).transpose((1, 2, 0))[Points[0][1] : Points[2][1], Points[0][0]: Points[2][0],:])\n",
"\n",
"plt.title('Subdive Origin Image')\n",
"ax = plt.gca()\n",
"\n",
"for Poly_key in panels.keys():\n",
" \n",
" Poly = panels[Poly_key]\n",
" poly = patches.Polygon(Utils.gps2pixel(Poly['points'],geot) - (Points[0][0], Points[0][1]),\n",
" linewidth=2,\n",
" edgecolor='red',\n",
" fill = False)\n",
" plt.text(np.mean([x[0] for x in Utils.gps2pixel(Poly['points'],geot) - (Points[0][0], Points[0][1])]), np.mean([y[1] for y in Utils.gps2pixel(Poly['points'],geot) - (Points[0][0], Points[0][1])]) , \n",
" str(Poly['id']), bbox=dict(facecolor='red', alpha=0.0), fontsize=8)\n",
"\n",
" ax.add_patch(poly)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Save KML"
]
},
{
"cell_type": "code",
2020-12-24 00:32:16 -03:00
"execution_count": 52,
2020-11-18 03:05:29 -03:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Listo\n"
]
}
],
"source": [
2020-12-23 21:33:22 -03:00
"\n",
"## Save List in coordinate latitud and longitude ###\n",
"with open(path_dict, 'wb') as handle:\n",
" pickle.dump(L_strings_coord, handle, protocol=pickle.HIGHEST_PROTOCOL)\n",
2020-11-18 03:05:29 -03:00
"\n",
"## Load List in coordinate latitud and longitude ###\n",
"with open(path_dict, \"rb\") as fp:\n",
" L_strings_coord = pickle.load(fp)\n",
"\n",
"kml=simplekml.Kml()\n",
"\n",
"\n",
"for string_key in L_strings_coord.keys():\n",
" \n",
" string = L_strings_coord[string_key]\n",
" points = string['points']\n",
" \n",
2020-12-23 21:33:22 -03:00
" pmt = kml.newpolygon(name= string['id'], \n",
" outerboundaryis = points)\n",
2020-11-18 03:05:29 -03:00
" pmt.extendeddata.newdata(name='Mesa', value=string['id'])\n",
2020-12-23 21:33:22 -03:00
" pmt.extendeddata.newdata(name= 'T°', value= string['T'])\n",
" \n",
2020-11-18 03:05:29 -03:00
"kml.save(path_kml_mesa)\n",
"\n",
"\n",
"kml=simplekml.Kml()\n",
"\n",
"\n",
"for string_key in L_strings_coord.keys():\n",
" \n",
" string = L_strings_coord[string_key]\n",
" points = string['points']\n",
" \n",
" for panel_key in string['panels'].keys():\n",
" panel = string['panels'][panel_key]\n",
" points = panel['points']\n",
" \n",
" pmt = kml.newpolygon(outerboundaryis = points)\n",
" pmt.extendeddata.newdata(name= 'Id integer', value= str(string_key).zfill(3) + '_' + str(panel['id']).zfill(3))\n",
" pmt.extendeddata.newdata(name= 'Id panel', value= str(panel['id']).zfill(3))\n",
" pmt.extendeddata.newdata(name='Zona PV', value= ZonaPV)\n",
" pmt.extendeddata.newdata(name='Cód. Fall', value= 0)\n",
" pmt.extendeddata.newdata(name= 'Tipo falla', value= panel['status'])\n",
" pmt.extendeddata.newdata(name= 'Mesa', value= string['id'])\n",
2020-12-23 21:33:22 -03:00
" pmt.extendeddata.newdata(name= 'T°', value= panel['T'])\n",
2020-11-18 03:05:29 -03:00
" \n",
"kml.save(path_kml_panel)\n",
"print('Listo')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
2020-12-28 18:25:12 -03:00
"execution_count": 27,
2020-11-18 03:05:29 -03:00
"metadata": {},
2020-12-23 21:33:22 -03:00
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 432x288 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2020-12-28 18:25:12 -03:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA54AAAG9CAYAAAB9KKlWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdebhkV13v/8+q4Uzdfbo7Q3e6k+40EIYAoiI4AkYmGYWrgIyCF56QIKCCF3C64gUVvaJIBDQEQ1SQoEThAnLhBwbFC0IAhYQMEOiMPSTp9HimGtbvj6pzuk71/n5P7dV7V53Teb+eJ0+nhr33qrXX3rvWqarPN8QYBQAAAABAWSqjbgAAAAAA4NTGxBMAAAAAUComngAAAACAUjHxBAAAAACUioknAAAAAKBUTDwBAAAAAKVi4gkAWJVCCFeHEF6R4/m7QwhP7P7/b4QQLiuvdfmEEF4UQvh00c8FAGCtYOIJAChNCOExIYT/F0I4FEI4EEL49xDCo8vebozx92OMA09a8wghPCOE8OUQwrEQwj0hhA+EEM5ZoT0fiDE+eZD153luRtveHEL425RlAQAoExNPAEApQgjTkj4u6RJJp0k6W9LvSpofZbtORgjhOZI+KOnPJJ0h6WHqvJ4vhBA2G8vUhtdCAABWJyaeAICyPEiSYox/F2NsxRhnY4yfjjF+Qzrx07kQwq4QQuybqD2g++nioRDCR0MIp/U8/yUhhFu6nzr+Zu+Ge9cdQvhUCOHVfY//VwjhZ7v//5AQwme6n8jeGEJ4XtaLCSEESW+X9Nbup5KzMca9kl4h6aikX+0+72XdT3b/NIRwQNKbu/d9oWddT+5u61AI4d0hhM8vfq0447kxhHBRCOHbIYR7Qwjv6rZlRd1lX9Vd9kgI4S0hhAeEEL4YQjgcQvhwCGGs+9zNIYSPhxDu6m7n472f5IYQ7hdC+Nfuev6/bjt699+Pdj/dPtjt3wsGaSMA4L6BiScAoCw3SWqFEK4IITzV+kRwBb8g6b9L2i6pKemdkhRCeKik90h6Sfex0yVZX3f9oKQXLN7oLnuupE+EENZJ+kz3OVu6z3t3COFhGet5sKSdkv6+984YY1vSRyQ9qefuH5H03e46f6/3+SGEMyT9g6Rf77b7Rkk/bneBJOkZkh4t6fslPU/ST6/w/F5PkfRDkn5U0hskXSrpRZJ2SHq4jvdNRdLl6vTNTkmzkv68Zz0flPTlbpvfrE7fL76msyV9QtJb1fl0+9ckfSSEcGaOdgIATmFMPAEApYgxHpb0GElR0nsl3RVC+FgIYWuO1fxNjPHaGOMxSb8t6XkhhKqk50j6eIzxX2OM893H2sY6/lHSD4QQzu3efpGkq7rLPUPS7hjj5THGZozxa+pMIp+TsZ4zuv/uyXhsT8/jknRnjPGS7jpn+577NEnXxRivijEuTqb3On0gSW+LMR6MMd4q6V8k/cAKz+/1hzHGwzHG6yRdK+nTMcbvxhgPSfpnST8oSTHGe2KMH4kxzsQYj6gzYf5JSQoh7FRn4vs/Y4wLMcYvSPpYzzZeLOmTMcZPxhjbMcbPSLqm+1oBAGDiCQAoT4zx+hjjy2KM56jz6dp2Se/IsYrbev7/Fkl1dSZ423sf605M7zHacESdT+Oe373r+ZI+0P3/cyX9SPfroQdDCAfVmZielbGqu7v/bst4bFvP4/3t7tff9ijpduf50vKJ6Yyk9Ss8v9e+nv+fzbi9XpJCCFMhhL/sfn35sKR/lbSpO9HfLulAjHGmZ9ne13iupOf29eNjlN1XAID7ICaeAIChiDHeIOn96kxAJemYpKmep2RN9nb0/P9OSQ11Jnh7eh8LIUyp8xVQy99JekEI4cckTarzqaHUmTx9Psa4qee/9THGizPWcaM6E8Tn9t4ZQqhI+jlJn+25Ozpt2aOerwV3f6/ppuIOyevV+Trxj8QYpyU9rnt/UKfNp3X7eVHvvrlNnU+ne/txXYzxbUNpOQBg1WPiCQAoRTe05/WLATUhhB3q/J7wS92n/Kekx4UQdoYQNqrzm8d+Lw4hPLQ74flfkv4hxthS5zeSzwidci1j3ce8a9on1flU7n9JurL7u0ypk7r7oG5QUb3736NDCOf3r6D7yeSvSfqtEMILQwiTIYSzJF0maVrSnw7YNZ+Q9H0hhGd3g5R+SdmT7mHboM4noAe7IU6/s/hAjPEWdb46++YQwlh3Av/MnmX/VtIzQwg/HUKohhAmQggXhBXKzAAA7juYeAIAynJEnZCd/wghHFNnwnmtOp+sqfs7wCslfUPSV9WZBPb7G3U+Jd0raULSa7vLXqfOhO2D6nwad6+cr6t2f895laQndpdZvP+IpCer8/XbO7vb+UNJ48Z6rlQnVOdX1fnk9VvqfIL6EzHGzK/6ZqzjbnU+Nf0jdb4e/FB1JnWjLjPzDnVey93q7KtP9T3+Ikk/pk6b36rOvpuXpBjjbZKeJek3JN2lzieg/0O8zwAAdIXOH3ABAMAodL+qe7ukF8UY/2Wl568WIYQrJd0QY/ydFZ8MALjP4y+RAAAMWfcrqZtCCOPqfEoYdPwryKtS9yvIDwghVEIIT1HnE85/GnW7AABrQ23lpwAAgIL9mDpf+R1T5+u6z84ou7LanKXO15VPV+cT2otjjF8fbZMAAGsFX7UFAAAAAJSKr9oCAAAAAEp1UhPPEMJTQgg3hhC+E0J4U1GNAgAAAACcOpK/ahtCqEq6SdKT1Pmtx1ckvSDG+C1rmYlNE3H9tvVJ2ztx+/nbHWOwHzPubxvLtKI9Z7cea7ft7Vu8Nlusvqk4fWY+5mzeGjrRW8hcmXG/t6qUZcxFslcWnHVVjGXW4pfXvbFhdUHKMWhJOTa9Y9A6blNY+9kbZ9Z4KpI3NquhnXm/+VqS25Bvfd5esfZZ21nKXMbZ/9Zj1nlrGPtS8vdn3jakrMvbRtXYz9Y4W+mxLN51w2pb0ePZYrXN23rKddB6nda6vHNgo101lkl4H+K+Ech1t98rBV67UyS9dzGktMvbft636in9XGRfeucgS8t5j2yetwu81q9Fae/DUuYi+bcyd/Oeu2OMZ/bffzLhQj8s6Tsxxu9KUgjhQ+ok3JkTz/Xb1uvpV/zMCfd7Fw/rDXHFveBlLzPfsl9uwziBz7XqmfcfXpgw13VoPvuxY/Nj5jKtljVZzT+JrddbmfdPjS+Yy0zVG5n3e4O6ZbRtoZV9wfNYJxVvQpSyjKVayR5PE7Wmucx4NfuxIic9Kbw3I9axNu68zrFK9mM1o89SNI2x1Hksezwdco7BuWZxuWnj1ezjyRozklQzzk/eJMpi7bO60S5JWl/PLgc5Wc0+zr3teGoVo2+s87azjVnjXGvdL0lzxjn9SMMeGzON7PVZ5zNvP1uvM4U7nozHrMmdd2xaY3PMOJ9J0rpa9rVjY93OQtpYy37MGgONaF83rNc5VbGvaUWyzqlem73HLNbrtLZ/sDFlrmvv3IbM+482MsvTSrLfxDe9P7Rb71ESrs/eMWBJud5bY9B7nbm3kdAu771Dw3hfZS3jnQOs93XeMnn/kJTy/uCw8d5Zko4tZJ+3mwnvN609kzKJdf9oXuDfxWpV41zvvA+w2pbyOr2xab3M6571lluy7j+Zo+xsdQpEL7q9ex8AAAAAAEtOZuKZNf09YeIbQrgwhHBNCOGauYNzJ7E5AAAAAMBadDITz9sl7ei5fY6kO/ufFGO8NMb4qBjjoyY22R+jAwAAAABOTSfzQ6ivSHpgCOF+ku6Q9HxJL/QWaCtk/s7S+y583fgNkdfw9ojTXazfPHjfqq5UrHAbIyTE+ZOB9f39RtP+LvycFR7h/U4g5/Y9Kb+Vspbxvr9uhpEk/E7A+s2FxxrrXp/l/a2I911863cXKb/LrQTn94I5f+PnB19lt9n6ja1k/8ZzwTkGLEX+9i8p4CvBTMj+Pbn3W1pr+954spaxttN0fvdmjQ3rd6SeyZo9Nq3jdsEYM9b+l/zf11jMfnaOQa8NmetK2Gfeb4Znatnj6VjTzi04Vs/+LeG48ZtxL7ehHrLbVqnZx8xEJXs
2020-12-23 21:33:22 -03:00
"text/plain": [
"<Figure size 1152x1152 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
2020-11-18 03:05:29 -03:00
"source": [
2020-12-28 18:25:12 -03:00
"string = L_strings_coord['130']\n",
2020-12-23 21:33:22 -03:00
"panels = string['panels']\n",
"\n",
"\n",
2020-12-28 18:25:12 -03:00
"epsilon = 10\n",
2020-12-23 21:33:22 -03:00
"matrix_expand_bounds = [[-epsilon, -epsilon],[+epsilon, -epsilon], [+epsilon, +epsilon], [-epsilon, +epsilon]]\n",
"Points = Utils.gps2pixel(string['points'], geot) + matrix_expand_bounds\n",
"\n",
"\n",
"\n",
"plt.figure(1)\n",
"plt.figure(figsize=(16, 16))\n",
"#plt.imshow(GR_T.raster[0,Points[0][1] : Points[2][1], Points[0][0]: Points[2][0]])\n",
"plt.imshow(GR_T.raster[Points[0][1] : Points[2][1], Points[0][0]: Points[2][0]])\n",
"#plt.imshow((GR_RGB.raster[:3,:,:]).transpose((1, 2, 0))[Points[0][1] : Points[2][1], Points[0][0]: Points[2][0],:])\n",
"\n",
"plt.title('Subdive Origin Image')\n",
"ax = plt.gca()\n",
"\n",
"for Poly_key in panels.keys():\n",
" \n",
" Poly = panels[Poly_key]\n",
" poly = patches.Polygon(Utils.gps2pixel(Poly['points'],geot) - (Points[0][0], Points[0][1]),\n",
" linewidth=2,\n",
" edgecolor='red',\n",
" fill = False)\n",
" plt.text(np.mean([x[0] for x in Utils.gps2pixel(Poly['points'],geot) - (Points[0][0], Points[0][1])]), np.mean([y[1] for y in Utils.gps2pixel(Poly['points'],geot) - (Points[0][0], Points[0][1])]) , \n",
" str(Poly['id']), bbox=dict(facecolor='red', alpha=0.0), fontsize=8)\n",
"\n",
" ax.add_patch(poly)"
2020-11-18 03:05:29 -03:00
]
},
{
"cell_type": "code",
2020-12-24 00:32:16 -03:00
"execution_count": 31,
2020-11-18 03:05:29 -03:00
"metadata": {},
"outputs": [],
2020-12-23 21:33:22 -03:00
"source": [
"points = []\n",
"keypoints_to_search = List_P_strings[:]\n",
"while len(keypoints_to_search) > 0:\n",
" a = sorted(keypoints_to_search, key=lambda p: (p[0][0]) + (p[0][1]))[0] # find upper left point\n",
" b = sorted(keypoints_to_search, key=lambda p: (p[0][0]) - (p[0][1]))[-1] # find upper right point\n",
"\n",
" # convert opencv keypoint to numpy 3d point\n",
" a = np.array([a[0][0], a[0][1], 0])\n",
" b = np.array([b[0][0], b[0][1], 0])\n",
"\n",
" row_points = []\n",
" remaining_points = []\n",
" for k in keypoints_to_search:\n",
" p = np.array([k[0][0], k[0][1], 0])\n",
2020-12-24 00:32:16 -03:00
" d = k[2][1]-k[0][1]#k.size # diameter of the keypoint (might be a theshold)\n",
2020-12-23 21:33:22 -03:00
" dist = np.linalg.norm(np.cross(np.subtract(p, a), np.subtract(b, a))) / np.linalg.norm(b) # distance between keypoint and line a->b\n",
" if d/2 > dist:\n",
" row_points.append(k)\n",
" else:\n",
" remaining_points.append(k)\n",
"\n",
" points.extend(sorted(row_points, key=lambda h: h[0][0]))\n",
" keypoints_to_search = remaining_points"
]
},
{
"cell_type": "code",
2020-12-24 00:32:16 -03:00
"execution_count": 42,
2020-12-23 21:33:22 -03:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2020-12-24 00:32:16 -03:00
"array([[2591, 1217],\n",
" [2710, 1217],\n",
" [2710, 1260],\n",
" [2591, 1260]])"
2020-12-23 21:33:22 -03:00
]
},
2020-12-24 00:32:16 -03:00
"execution_count": 42,
2020-12-23 21:33:22 -03:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2020-12-24 00:32:16 -03:00
"k"
2020-12-23 21:33:22 -03:00
]
2020-11-18 03:05:29 -03:00
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.7"
}
},
"nbformat": 4,
"nbformat_minor": 4
}