Files
Photovoltaic_Fault_Detector/GPS_Panel/Enumeration_KML.ipynb

622 lines
907 KiB
Plaintext
Raw Normal View History

2020-11-13 00:19:20 -03:00
{
"cells": [
{
"cell_type": "code",
2020-12-23 21:30:06 -03:00
"execution_count": 51,
2020-11-13 00:19:20 -03:00
"metadata": {},
2020-12-23 21:30:06 -03:00
"outputs": [],
2020-11-13 00:19:20 -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-18 16:27:01 -03:00
"import geopandas\n",
2020-11-13 00:19:20 -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:30:06 -03:00
" return np.array(L_F) \n",
"\n",
"\n",
"\n",
"def order_rect2(List_P_strings, top_bottom = False):\n",
" #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",
" d = 2#k.size # diameter of the keypoint (might be a theshold)\n",
" 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-13 00:19:20 -03:00
" return np.array(L_F) "
]
},
{
"cell_type": "markdown",
"metadata": {},
2020-11-18 03:05:29 -03:00
"source": [
"# Parameters"
]
2020-11-13 00:19:20 -03:00
},
{
"cell_type": "code",
2020-12-23 21:30:06 -03:00
"execution_count": 58,
2020-11-13 00:19:20 -03:00
"metadata": {},
"outputs": [],
"source": [
"#path_T = \"Thermo.tif\"\n",
"#path_String = \"Thermo_String_PV01.tif\"\n",
"\n",
2020-12-17 18:46:01 -03:00
"path_T = \"Los_Loros/TH_02_index_thermal_ir.tif\"\n",
2020-12-18 16:27:01 -03:00
"path_Mesa_shape = \"Los_Loros/Mesas.shp\"\n",
"#path_String = \"Los_Loros/Raster_Test.tif\"\n",
2020-12-17 18:46:01 -03:00
"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-13 00:19:20 -03:00
"\n",
2020-12-17 18:46:01 -03:00
"#panel_size = (11 , 21)\n",
2020-11-13 00:19:20 -03:00
"#panel_size = (37 , 17) #weight, height size#\n",
"#panel_size = (20 , 35)\n",
2020-12-17 18:46:01 -03:00
"\n",
"split_Weight, split_Height = (10,2)\n",
2020-12-18 16:27:01 -03:00
"overlap = 0\n",
2020-11-13 00:19:20 -03:00
"order_top_bottom = False # order top bottom or right left\n",
"\n",
"\n",
2020-12-18 16:27:01 -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-23 21:30:06 -03:00
"execution_count": 59,
2020-11-18 03:05:29 -03:00
"metadata": {},
2020-12-18 16:27:01 -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-23 21:30:06 -03:00
"execution_count": 59,
2020-12-18 16:27:01 -03:00
"metadata": {},
"output_type": "execute_result"
}
],
2020-11-18 03:05:29 -03:00
"source": [
2020-12-18 16:27:01 -03:00
"# If Mesas is Raster\n",
"\"\"\"\"\n",
2020-11-13 00:19:20 -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-18 16:27:01 -03:00
" \n",
"\"\"\""
]
},
{
"cell_type": "code",
2020-12-23 21:30:06 -03:00
"execution_count": 60,
2020-12-18 16:27:01 -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",
2020-11-13 00:19:20 -03:00
"\n",
2020-12-18 16:27:01 -03:00
"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-23 21:30:06 -03:00
"execution_count": 61,
2020-12-18 16:27:01 -03:00
"metadata": {},
"outputs": [],
"source": [
"\n",
"L_strings = {}\n",
2020-11-13 00:19:20 -03:00
" \n",
2020-12-23 21:30:06 -03:00
"for i,List_P in enumerate(order_rect2(List_P_strings, top_bottom=order_top_bottom), 1):\n",
2020-11-13 00:19:20 -03:00
" \n",
" L_strings[str(i)] = {'id': i, \n",
" 'points' : List_P, \n",
" 'panels' : {}, \n",
" 'status': 'default', \n",
2020-12-17 18:46:01 -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-13 00:19:20 -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-17 18:46:01 -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-13 00:19:20 -03:00
"\n",
2020-12-17 18:46:01 -03:00
" #split_Weight = max(split_Weight, 1)\n",
" #split_Height = max(split_Height, 1)\n",
2020-11-13 00:19:20 -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-17 18:46:01 -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-13 00:19:20 -03:00
" 'severidad': 'default'} \n"
]
},
{
"cell_type": "markdown",
"metadata": {},
2020-11-18 03:05:29 -03:00
"source": [
"# Save dictionary with gps data"
]
2020-11-13 00:19:20 -03:00
},
{
"cell_type": "code",
2020-12-23 21:30:06 -03:00
"execution_count": 62,
2020-11-13 00:19:20 -03:00
"metadata": {},
"outputs": [],
"source": [
"## Save List in coordinate latitud and longitude ###\n",
2020-12-18 16:27:01 -03:00
"\n",
2020-11-13 00:19:20 -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-17 18:46:01 -03:00
" 'T': panel['T'], \n",
2020-11-13 00:19:20 -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-17 18:46:01 -03:00
"\n"
2020-11-13 00:19:20 -03:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Display image"
]
},
{
"cell_type": "code",
2020-12-23 21:30:06 -03:00
"execution_count": 63,
2020-12-17 18:46:01 -03:00
"metadata": {
"scrolled": true
},
2020-11-13 00:19:20 -03:00
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 432x288 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
2020-12-23 21:30:06 -03:00
"image/png": "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
2020-11-13 00:19:20 -03:00
"text/plain": [
"<Figure size 1152x1152 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
2020-12-23 21:30:06 -03:00
"image/png": "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
2020-11-13 00:19:20 -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-18 16:27:01 -03:00
"string = L_strings_coord['6']\n",
2020-11-13 00:19:20 -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-18 16:27:01 -03:00
"\n",
2020-11-13 00:19:20 -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-18 16:27:01 -03:00
"plt.imshow(GR_T.raster.data)\n",
2020-11-13 00:19:20 -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-18 16:27:01 -03:00
" poly = patches.Polygon(Utils.gps2pixel(Poly['points'],geot),\n",
2020-11-13 00:19:20 -03:00
" linewidth=2,\n",
" edgecolor='red',\n",
" alpha=0.5,\n",
" fill = True)\n",
2020-12-18 16:27:01 -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-13 00:19:20 -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-17 18:46:01 -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-13 00:19:20 -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-18 16:27:01 -03:00
"execution_count": 98,
2020-11-13 00:19:20 -03:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Listo\n"
]
}
],
"source": [
2020-12-17 18:46:01 -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",
2020-11-13 00:19:20 -03:00
"\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-17 18:46:01 -03:00
" pmt = kml.newpolygon(name= string['id'], \n",
" outerboundaryis = points)\n",
2020-11-13 00:19:20 -03:00
" pmt.extendeddata.newdata(name='Mesa', value=string['id'])\n",
2020-12-17 18:46:01 -03:00
" pmt.extendeddata.newdata(name= 'T°', value= string['T'])\n",
" \n",
2020-11-13 00:19:20 -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-17 18:46:01 -03:00
" pmt.extendeddata.newdata(name= 'T°', value= panel['T'])\n",
2020-11-13 00:19:20 -03:00
" \n",
"kml.save(path_kml_panel)\n",
"print('Listo')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
2020-12-18 16:27:01 -03:00
{
"cell_type": "code",
2020-12-23 21:30:06 -03:00
"execution_count": 20,
2020-12-18 16:27:01 -03:00
"metadata": {},
2020-12-23 21:30:06 -03:00
"outputs": [
{
"data": {
"text/plain": [
"<Figure size 432x288 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA6UAAALXCAYAAAB1vOY4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOy9fcx2z3MXNHM9v75QoLalaOmrpBG1aMQYLGiD/AGlmhKJQm0pGGIIESUkBDQKChWrARMDimIsRDTQYpWikrZiq0EafANfSYsUsaG2thja0hfbpvj7XusfZ3fPzOxnZmfPOff93D96Jnme+7rO7s7M7s7OfGZ3r+viUgrddNNNN91000033XTTTTfddNP7oMf7VuCmm2666aabbrrppptuuummH790J6U33XTTTTfddNNNN9100003vTe6k9Kbbrrppptuuummm2666aab3hvdSelNN91000033XTTTTfddNNN743upPSmm2666aabbrrppptuuumm90Z3UnrTTTfddNNNN91000033XTTe6M7Kb3ppptuuukjjpj5v2bmX71Q/y8x8y+or38zM//+l9NujZj5S5n5G66ue9NNN910000fKXQnpTfddNNNN70XYubPY+b/lpl/gJm/j5n/G2b+2S8tt5Tyr5ZS0gntCjHzFzLzn2bmH2bm72Xmr2TmT5/o85WllM/P8F+pC3T7Mmb+Q0fa3nTTTTfddNNL0p2U3nTTTTfd9OrEzB9PRF9LRL+HiD6JiD6NiP4lIvqx96nXGWLmX0pEX0VE/wYRfTIR/Uza+vOnmPkTnTYfej0Nb7rppptuuult0p2U3nTTTTfd9D7oZxARlVL+cCnlg1LKj5ZSvqGU8meJxlM9Zv6bmbmYJO6z66nkDzDzf8bMnyTq/0pm/vZ6WvlbpGDJm5n/ODP/OlP+vzHzP1Jf/23M/I31JPdbmfmLUGeYmYnoXyeiL6+nmT9aSvnLRPSriej/JaLfUOv9qnoi/LuY+fuI6Mvqsz8leH1+lfUDzPx7mflPtqvKoG5h5n+Smf8PZv6rzPxvV12mVNv+U7XtDzHzv8zMn83M/x0z/yAz/0fM/NG17icy89cy81+pcr5WngAz809n5m+qfP7Lqoecv59TT8W/v47vz8/oeNNNN910048PupPSm2666aab3gf9BSL6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
"text/plain": [
"<Figure size 1152x1152 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"string = L_strings_coord['1']\n",
"panels = string['panels']\n",
"\n",
"\n",
"epsilon = 100\n",
"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-12-18 16:27:01 -03:00
},
{
"cell_type": "code",
2020-12-23 21:30:06 -03:00
"execution_count": 48,
2020-12-18 16:27:01 -03:00
"metadata": {},
"outputs": [],
2020-12-23 21:30:06 -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",
" d = 2#k.size # diameter of the keypoint (might be a theshold)\n",
" 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"
]
2020-12-18 16:27:01 -03:00
},
{
"cell_type": "code",
2020-12-23 21:30:06 -03:00
"execution_count": 50,
2020-12-18 16:27:01 -03:00
"metadata": {},
2020-12-23 21:30:06 -03:00
"outputs": [
{
"data": {
"text/plain": [
"8"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"k.size"
]
2020-12-18 16:27:01 -03:00
},
2020-11-13 00:19:20 -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
}