polygon interaction

main v0.1
psoubrie 2024-04-16 18:07:09 +02:00
parent 2bb6a15180
commit 2741895bad
3 changed files with 806 additions and 80 deletions

View File

@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 1, "execution_count": 2,
"metadata": { "metadata": {
"metadata": {} "metadata": {}
}, },
@ -28,7 +28,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": 3,
"metadata": { "metadata": {
"metadata": {} "metadata": {}
}, },
@ -69,7 +69,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 3, "execution_count": 4,
"metadata": { "metadata": {
"metadata": {} "metadata": {}
}, },
@ -115,7 +115,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 4, "execution_count": 5,
"metadata": { "metadata": {
"metadata": {} "metadata": {}
}, },
@ -125,34 +125,273 @@
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"list index out of range\n", "list index out of range\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n", "index 0 is out of bounds for axis 1 with size 0\n",
"list index out of range\n" "index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n",
"index 0 is out of bounds for axis 1 with size 0\n"
]
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn[5], line 24\u001b[0m\n\u001b[0;32m 22\u001b[0m image_path \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(folder, image_name)\n\u001b[0;32m 23\u001b[0m image \u001b[38;5;241m=\u001b[39m cv2\u001b[38;5;241m.\u001b[39mimread(image_path)\n\u001b[1;32m---> 24\u001b[0m sheared_image \u001b[38;5;241m=\u001b[39m \u001b[43mshear_img\u001b[49m\u001b[43m(\u001b[49m\u001b[43mimage\u001b[49m\u001b[43m)\u001b[49m\n\u001b[0;32m 26\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m idx, region \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(regions):\n\u001b[0;32m 27\u001b[0m target_path \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mjoin(cropped_folder, \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mimage_name[:\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m4\u001b[39m]\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00midx\u001b[38;5;241m+\u001b[39m\u001b[38;5;241m1\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.jpg\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
"Cell \u001b[1;32mIn[2], line 11\u001b[0m, in \u001b[0;36mshear_img\u001b[1;34m(image)\u001b[0m\n\u001b[0;32m 9\u001b[0m M \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mfloat32([[\u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m0.22\u001b[39m, \u001b[38;5;241m0\u001b[39m], [\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m1\u001b[39m, \u001b[38;5;241m0\u001b[39m], [\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m1\u001b[39m]])\n\u001b[0;32m 10\u001b[0m sheared_img \u001b[38;5;241m=\u001b[39m cv2\u001b[38;5;241m.\u001b[39mwarpPerspective(image, M, (\u001b[38;5;28mint\u001b[39m(cols \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m1.5\u001b[39m), \u001b[38;5;28mint\u001b[39m(rows \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m1.5\u001b[39m)))\n\u001b[1;32m---> 11\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mcv2\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mflip\u001b[49m\u001b[43m(\u001b[49m\u001b[43msheared_img\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n",
"\u001b[1;31mKeyboardInterrupt\u001b[0m: "
] ]
} }
], ],
"source": [ "source": [
"folder = \"../../../Downloads/wetransfer_metingen-8-04-tot-15-40-5min_2024-04-15_0905/metingen 8-04 tot 15-40 (5min)/\"\n", "folder = \"./wetransfer_metingen-16-04-1200-1300_2024-04-16_1102/metingen 16-04 (1200-1300)/\"\n",
"images = [f for f in os.listdir(folder) if f.endswith(\".jpg\")]\n", "images = [f for f in os.listdir(folder) if f.endswith(\".jpg\")]\n",
"cropped_folder = os.path.join(folder, \"cropped\")\n", "cropped_folder = os.path.join(folder, \"cropped\")\n",
"os.makedirs(cropped_folder, exist_ok=True)\n", "os.makedirs(cropped_folder, exist_ok=True)\n",
@ -193,7 +432,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": null,
"metadata": { "metadata": {
"metadata": {} "metadata": {}
}, },
@ -204,7 +443,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 12, "execution_count": null,
"metadata": { "metadata": {
"metadata": {} "metadata": {}
}, },

View File

@ -1,35 +1,195 @@
from paddleocr import PaddleOCR
import os import os
from datetime import datetime
import cv2 import cv2
import numpy as np
import xlsxwriter import xlsxwriter
INTERVV = [0.09, 0.29, 0.5, 0.7, 0.91]
def ocr_image(image_path, ocr): INTERVH = [0.33, 0.6]
result = ocr.ocr(image_path, cls=True)
return result[0][0][1][0]
def cropUI(image_path): def draw_interactive_polygon(image_path):
# small opencv window to crop the image # Initialize variables
points = []
moving = False
current_point_index = -1
original_image = cv2.flip(cv2.imread(image_path), 1)
image = original_image.copy()
window_name = "Polygon Drawer"
def interpolate(p1, p2, t):
"""Linearly interpolate between points p1 and p2 with parameter t"""
return [int((1 - t) * p1[0] + t * p2[0]), int((1 - t) * p1[1] + t * p2[1])]
def draw_additional_lines(temp_image, points):
"""Draw lines between interpolated points on the first, third, second, and fourth edges"""
if len(points) == 4:
# Intervals for the first-third edge connection
edge1_points = [interpolate(points[0], points[1], t) for t in INTERVV]
edge3_points = [interpolate(points[2], points[3], 1 - t) for t in INTERVV]
for p1, p3 in zip(edge1_points, edge3_points):
cv2.line(temp_image, tuple(p1), tuple(p3), (0, 255, 255), 1)
# Intervals for the second-fourth edge connection
edge2_points = [interpolate(points[1], points[2], t) for t in INTERVH]
edge4_points = [interpolate(points[3], points[0], 1 - t) for t in INTERVH]
for p2, p4 in zip(edge2_points, edge4_points):
cv2.line(temp_image, tuple(p2), tuple(p4), (255, 0, 255), 1)
return temp_image
def draw_polygon(temp_image, points, closed=False):
if len(points) > 1:
color = (0, 255, 0) if not closed else (255, 0, 0)
cv2.polylines(temp_image, [np.array(points, np.int32)], closed, color, 2)
for point in points:
cv2.circle(temp_image, tuple(point), 5, (0, 0, 255), -1)
temp_image = draw_additional_lines(temp_image, points)
return temp_image
def mouse_events(event, x, y, flags, param):
nonlocal points, moving, current_point_index, image, original_image
if event == cv2.EVENT_LBUTTONDOWN:
for i, point in enumerate(points):
if abs(x - point[0]) < 5 and abs(y - point[1]) < 5:
moving = True
current_point_index = i
return
if len(points) < 4:
points.append([x, y])
image = draw_polygon(
original_image.copy(), points, closed=(len(points) == 4)
)
elif event == cv2.EVENT_MOUSEMOVE:
if moving and current_point_index != -1:
points[current_point_index] = [x, y]
image = draw_polygon(
original_image.copy(), points, closed=(len(points) == 4)
)
elif event == cv2.EVENT_LBUTTONUP:
moving = False
current_point_index = -1
cv2.namedWindow(window_name)
cv2.setMouseCallback(window_name, mouse_events)
# Main loop
while True:
cv2.imshow(window_name, image)
key = cv2.waitKey(1) & 0xFF
if key == 13: # Enter key
cv2.destroyAllWindows()
return points # Return the coordinates when Enter is pressed
def warp_polygon(image_path, polygon_points):
"""Warps the quadrilateral defined by polygon_points into a rectangle."""
image = cv2.imread(image_path) image = cv2.imread(image_path)
r = cv2.selectROI(image) image = cv2.flip(image, 1)
cv2.destroyAllWindows()
return r pts_src = np.array(polygon_points).astype(np.float32)
# Define points in destination (output rectangle) image
width = 200 # Width of the rectangle
height = 50 # Height of the rectangle
pts_dst = np.array(
[[0, 0], [width - 1, 0], [width - 1, height - 1], [0, height - 1]]
).astype(np.float32)
# Calculate the perspective transform matrix
matrix = cv2.getPerspectiveTransform(pts_src, pts_dst)
# Warp the image
warped_image = cv2.warpPerspective(image, matrix, (width, height))
return warped_image
def cropImage(image_path, r, flip, cropped_folder): def extract_line_pixels(warped_image, intervalsV, intervalsH):
# crop the image and save it """Extracts pixel data along vertical and horizontal lines at given intervals."""
image = cv2.imread(image_path) height, width, channels = warped_image.shape
cropped = image[int(r[1]) : int(r[1] + r[3]), int(r[0]) : int(r[0] + r[2])]
# save with new name pixel_data = []
if flip == "y":
cropped = cv2.flip(cropped, 1)
# save in subfolder cropped # Vertical lines
new_name = os.path.join(cropped_folder, image_path.split("/")[-1]) for i in intervalsV:
cv2.imwrite(new_name, cropped) x_coord = int(width * i)
vertical_line = warped_image[:, x_coord, 1]
pixel_data.append(vertical_line)
# Horizontal lines
for i in intervalsH:
y_coord = int(height * i)
horizontal_line = warped_image[y_coord, :, 1]
pixel_data.append(horizontal_line)
return pixel_data
def peaks(data, boxes=2):
# split data in boxes
data = np.array_split(data, boxes)
# get the maximum value in each box
data = [np.max(d) for d in data]
data = [d > 150 for d in data]
return np.array(data).astype(int).tolist()
digits = {
0: [[1, 0, 1], [1, 1], [1, 1]],
1: [[0, 0, 0], [0, 1], [0, 1]],
2: [[1, 1, 1], [0, 1], [1, 0]],
3: [[1, 1, 1], [0, 1], [0, 1]],
4: [[0, 1, 0], [1, 1], [0, 1]],
5: [[1, 1, 1], [1, 0], [0, 1]],
6: [[1, 1, 1], [1, 0], [1, 1]],
7: [[1, 0, 0], [0, 1], [0, 1]],
8: [[1, 1, 1], [1, 1], [1, 1]],
9: [[1, 1, 1], [1, 1], [0, 1]],
}
def OCRdigit(vertical, horizontal1, horizontal2):
# get times it goes above 150, remove subsequent values
digit = [peaks(vertical, 3), peaks(horizontal1), peaks(horizontal2)]
digit = [key for key, value in digits.items() if value == digit]
return digit[0]
def OCRscreen(pixels_along_lines):
data = (
pixels_along_lines[:5]
+ [
pixels_along_lines[5][:40],
pixels_along_lines[5][40:80],
pixels_along_lines[5][80:120],
pixels_along_lines[5][120:160],
pixels_along_lines[5][160:],
]
+ [
pixels_along_lines[6][:40],
pixels_along_lines[6][40:80],
pixels_along_lines[6][80:120],
pixels_along_lines[6][120:160],
pixels_along_lines[6][160:],
]
)
text = ""
for i in range(5):
text += str(OCRdigit(data[i], data[i + 5], data[i + 10]))
return text
def writeDate(worksheet, row, column, date, format):
original_format = "%Y-%m-%d %H-%M-%S-%f"
parsed_datetime = datetime.strptime(date, original_format)
worksheet.write_datetime(row, column, parsed_datetime, format)
def data2excel(data): def data2excel(data):
@ -38,11 +198,13 @@ def data2excel(data):
workbook = xlsxwriter.Workbook(fileName) workbook = xlsxwriter.Workbook(fileName)
worksheet = workbook.add_worksheet() worksheet = workbook.add_worksheet()
dateFormat = workbook.add_format({"num_format": "dd/mm/yy hh:mm:ss"})
# write the data # write the data
row = 0 row = 0
for key, value in data.items(): for key, value in data.items():
date = key.split(" ", 1)[1][:-4] date = key.split(" ", 1)[1][:-4]
worksheet.write(row, 0, date) writeDate(worksheet, row, 0, date, dateFormat)
worksheet.write(row, 1, value) worksheet.write(row, 1, value)
try: try:
worksheet.write(row, 2, float(value[:6])) worksheet.write(row, 2, float(value[:6]))
@ -54,43 +216,23 @@ def data2excel(data):
def main(): def main():
# ocr settings folder = "./"
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" images = [f for f in os.listdir(folder) if f.endswith(".jpg")]
ocr = PaddleOCR(use_angle_cls=True, lang="en")
# *** start GUIs *** region = draw_interactive_polygon(folder + images[0])
images = [f for f in os.listdir(FOLDER) if f.endswith(".jpg")]
region = cropUI(os.path.join(FOLDER, images[0]))
flip = input("Do you want to flip the images horizontaly? (y/n): ")
cropped_folder = os.path.join(FOLDER, "cropped")
if not os.path.exists(cropped_folder):
os.makedirs(cropped_folder)
# *** start cropping ***
for image in images:
cropImage(os.path.join(FOLDER, image), region, flip, cropped_folder)
# *** start OCR ***
cropped_images = [f for f in os.listdir(cropped_folder) if f.endswith(".jpg")]
data = {} data = {}
for image in cropped_images: for image in images:
try: try:
path = os.path.join(cropped_folder, image) warped = warp_polygon(folder + image, region)
text = ocr_image(path, ocr) pixels_along_lines = extract_line_pixels(warped, INTERVV, INTERVH)
except Exception as _: data[image] = OCRscreen(pixels_along_lines)
print("Error in cropped image") except Exception as e:
print(f"Error processing {image}: {e}")
continue continue
data[image] = text
# *** save data in excel ***
data2excel(data) data2excel(data)
print("All images cropped successfully")
if __name__ == "__main__": if __name__ == "__main__":
FOLDER = "data/"
main() main()

345
img2xlsx2.ipynb Normal file
View File

@ -0,0 +1,345 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"metadata": {}
},
"outputs": [],
"source": [
"import cv2\n",
"import numpy as np\n",
"import os\n",
"\n",
"INTERVV = [0.09, 0.29, 0.5, 0.7, 0.91]\n",
"INTERVH = [0.33, 0.6]\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"metadata": {}
},
"outputs": [],
"source": [
"def draw_interactive_polygon(image_path):\n",
" # Initialize variables\n",
" points = []\n",
" moving = False\n",
" current_point_index = -1\n",
"\n",
" original_image = cv2.flip(cv2.imread(image_path), 1)\n",
" image = original_image.copy()\n",
" window_name = \"Polygon Drawer\"\n",
"\n",
" def interpolate(p1, p2, t):\n",
" \"\"\"Linearly interpolate between points p1 and p2 with parameter t\"\"\"\n",
" return [int((1 - t) * p1[0] + t * p2[0]), int((1 - t) * p1[1] + t * p2[1])]\n",
"\n",
" def draw_additional_lines(temp_image, points):\n",
" \"\"\"Draw lines between interpolated points on the first, third, second, and fourth edges\"\"\"\n",
" if len(points) == 4:\n",
" # Intervals for the first-third edge connection\n",
" edge1_points = [interpolate(points[0], points[1], t) for t in INTERVV]\n",
" edge3_points = [interpolate(points[2], points[3], 1 - t) for t in INTERVV]\n",
" for p1, p3 in zip(edge1_points, edge3_points):\n",
" cv2.line(temp_image, tuple(p1), tuple(p3), (0, 255, 255), 1)\n",
"\n",
" # Intervals for the second-fourth edge connection\n",
" edge2_points = [interpolate(points[1], points[2], t) for t in INTERVH]\n",
" edge4_points = [interpolate(points[3], points[0], 1 - t) for t in INTERVH]\n",
" for p2, p4 in zip(edge2_points, edge4_points):\n",
" cv2.line(temp_image, tuple(p2), tuple(p4), (255, 0, 255), 1)\n",
" return temp_image\n",
"\n",
" def draw_polygon(temp_image, points, closed=False):\n",
" if len(points) > 1:\n",
" color = (0, 255, 0) if not closed else (255, 0, 0)\n",
" cv2.polylines(temp_image, [np.array(points, np.int32)], closed, color, 2)\n",
" for point in points:\n",
" cv2.circle(temp_image, tuple(point), 5, (0, 0, 255), -1)\n",
" temp_image = draw_additional_lines(temp_image, points)\n",
" return temp_image\n",
"\n",
" def mouse_events(event, x, y, flags, param):\n",
" nonlocal points, moving, current_point_index, image, original_image\n",
" if event == cv2.EVENT_LBUTTONDOWN:\n",
" for i, point in enumerate(points):\n",
" if abs(x - point[0]) < 5 and abs(y - point[1]) < 5:\n",
" moving = True\n",
" current_point_index = i\n",
" return\n",
" if len(points) < 4:\n",
" points.append([x, y])\n",
" image = draw_polygon(\n",
" original_image.copy(), points, closed=(len(points) == 4)\n",
" )\n",
"\n",
" elif event == cv2.EVENT_MOUSEMOVE:\n",
" if moving and current_point_index != -1:\n",
" points[current_point_index] = [x, y]\n",
" image = draw_polygon(\n",
" original_image.copy(), points, closed=(len(points) == 4)\n",
" )\n",
"\n",
" elif event == cv2.EVENT_LBUTTONUP:\n",
" moving = False\n",
" current_point_index = -1\n",
"\n",
" cv2.namedWindow(window_name)\n",
" cv2.setMouseCallback(window_name, mouse_events)\n",
"\n",
" # Main loop\n",
" while True:\n",
" cv2.imshow(window_name, image)\n",
" key = cv2.waitKey(1) & 0xFF\n",
" if key == 13: # Enter key\n",
" cv2.destroyAllWindows()\n",
" return points # Return the coordinates when Enter is pressed\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"metadata": {}
},
"outputs": [],
"source": [
"def warp_polygon(image_path, polygon_points):\n",
" \"\"\"Warps the quadrilateral defined by polygon_points into a rectangle.\"\"\"\n",
"\n",
" image = cv2.imread(image_path)\n",
" image = cv2.flip(image, 1)\n",
"\n",
" pts_src = np.array(polygon_points).astype(np.float32)\n",
"\n",
" # Define points in destination (output rectangle) image\n",
" width = 200 # Width of the rectangle\n",
" height = 50 # Height of the rectangle\n",
" pts_dst = np.array(\n",
" [[0, 0], [width - 1, 0], [width - 1, height - 1], [0, height - 1]]\n",
" ).astype(np.float32)\n",
"\n",
" # Calculate the perspective transform matrix\n",
" matrix = cv2.getPerspectiveTransform(pts_src, pts_dst)\n",
"\n",
" # Warp the image\n",
" warped_image = cv2.warpPerspective(image, matrix, (width, height))\n",
" return warped_image\n",
"\n",
"\n",
"def extract_line_pixels(warped_image, intervalsV, intervalsH):\n",
" \"\"\"Extracts pixel data along vertical and horizontal lines at given intervals.\"\"\"\n",
" height, width, channels = warped_image.shape\n",
"\n",
" pixel_data = []\n",
"\n",
" # Vertical lines\n",
" for i in intervalsV:\n",
" x_coord = int(width * i)\n",
" vertical_line = warped_image[:, x_coord, 1]\n",
" pixel_data.append(vertical_line)\n",
"\n",
" # Horizontal lines\n",
" for i in intervalsH:\n",
" y_coord = int(height * i)\n",
" horizontal_line = warped_image[y_coord, :, 1]\n",
" pixel_data.append(horizontal_line)\n",
"\n",
" return pixel_data\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"metadata": {}
},
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"fig, axes = plt.subplots(3, 5, figsize=(15, 15))\n",
"axes = axes.flatten()\n",
"for i, pixels in enumerate(data):\n",
"axes[i].plot(pixels)\n",
"axes[i].set_ylim([0, 255])\n",
"axes[i].set_title(f\"Line {i+1}\")\n",
"axes[i].set_xlabel(\"Pixel Index\")\n",
"axes[i].set_ylabel(\"Pixel Value\")\n",
"\n",
"plt.tight_layout()\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"metadata": {}
},
"outputs": [],
"source": [
"def peaks(data, boxes=2):\n",
" # split data in boxes\n",
" data = np.array_split(data, boxes)\n",
"\n",
" # get the maximum value in each box\n",
" data = [np.max(d) for d in data]\n",
" data = [d > 150 for d in data]\n",
" return np.array(data).astype(int).tolist()\n",
"\n",
"\n",
"digits = {\n",
" 0: [[1, 0, 1], [1, 1], [1, 1]],\n",
" 1: [[0, 0, 0], [0, 1], [0, 1]],\n",
" 2: [[1, 1, 1], [0, 1], [1, 0]],\n",
" 3: [[1, 1, 1], [0, 1], [0, 1]],\n",
" 4: [[0, 1, 0], [1, 1], [0, 1]],\n",
" 5: [[1, 1, 1], [1, 0], [0, 1]],\n",
" 6: [[1, 1, 1], [1, 0], [1, 1]],\n",
" 7: [[1, 0, 0], [0, 1], [0, 1]],\n",
" 8: [[1, 1, 1], [1, 1], [1, 1]],\n",
" 9: [[1, 1, 1], [1, 1], [0, 1]],\n",
"}\n",
"\n",
"\n",
"def OCRdigit(vertical, horizontal1, horizontal2):\n",
" # get times it goes above 150, remove subsequent values\n",
" digit = [peaks(vertical, 3), peaks(horizontal1), peaks(horizontal2)]\n",
" digit = [key for key, value in digits.items() if value == digit]\n",
" return digit[0]\n",
"\n",
"\n",
"def OCRscreen(pixels_along_lines):\n",
" data = (\n",
" pixels_along_lines[:5]\n",
" + [\n",
" pixels_along_lines[5][:40],\n",
" pixels_along_lines[5][40:80],\n",
" pixels_along_lines[5][80:120],\n",
" pixels_along_lines[5][120:160],\n",
" pixels_along_lines[5][160:],\n",
" ]\n",
" + [\n",
" pixels_along_lines[6][:40],\n",
" pixels_along_lines[6][40:80],\n",
" pixels_along_lines[6][80:120],\n",
" pixels_along_lines[6][120:160],\n",
" pixels_along_lines[6][160:],\n",
" ]\n",
" )\n",
"\n",
" text = \"\"\n",
" for i in range(5):\n",
" text += str(OCRdigit(data[i], data[i + 5], data[i + 10]))\n",
" return text\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"metadata": {}
},
"outputs": [],
"source": [
"from datetime import datetime\n",
"import xlsxwriter\n",
"\n",
"\n",
"def writeDate(worksheet, row, column, date, format):\n",
" original_format = \"%Y-%m-%d %H-%M-%S-%f\"\n",
" parsed_datetime = datetime.strptime(date, original_format)\n",
"\n",
" worksheet.write_datetime(row, column, parsed_datetime, format)\n",
"\n",
"\n",
"def data2excel(data):\n",
" # save the data in an excel file\n",
" fileName = \"data.xlsx\"\n",
" workbook = xlsxwriter.Workbook(fileName)\n",
" worksheet = workbook.add_worksheet()\n",
"\n",
" dateFormat = workbook.add_format({\"num_format\": \"dd/mm/yy hh:mm:ss\"})\n",
"\n",
" # write the data\n",
" row = 0\n",
" for key, value in data.items():\n",
" date = key.split(\" \", 1)[1][:-4]\n",
" writeDate(worksheet, row, 0, date, dateFormat)\n",
" worksheet.write(row, 1, value)\n",
" try:\n",
" worksheet.write(row, 2, float(value[:6]))\n",
" except Exception as _:\n",
" pass\n",
" row += 1\n",
"\n",
" workbook.close()\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"metadata": {}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Error processing bandicam 2024-04-16 11-25-10-700.jpg: list index out of range\n",
"Error processing bandicam 2024-04-16 11-40-00-733.jpg: list index out of range\n",
"Error processing bandicam 2024-04-16 11-40-10-720.jpg: list index out of range\n",
"Error processing bandicam 2024-04-16 11-44-30-732.jpg: list index out of range\n",
"Error processing bandicam 2024-04-16 11-48-20-723.jpg: list index out of range\n",
"Error processing bandicam 2024-04-16 11-48-30-728.jpg: list index out of range\n",
"Error processing bandicam 2024-04-16 11-49-50-741.jpg: list index out of range\n"
]
}
],
"source": [
"folder = (\n",
" \"./2/\"\n",
")\n",
"images = [f for f in os.listdir(folder) if f.endswith(\".jpg\")]\n",
"\n",
"region = draw_interactive_polygon(folder + images[0])\n",
"\n",
"data = {}\n",
"for image in images:\n",
" try:\n",
" warped = warp_polygon(folder + image, region)\n",
" pixels_along_lines = extract_line_pixels(warped, INTERVV, INTERVH)\n",
" data[image] = OCRscreen(pixels_along_lines)\n",
" except Exception as e:\n",
" print(f\"Error processing {image}: {e}\")\n",
" continue\n",
"\n",
"data2excel(data)\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "AI_logging",
"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.10.14"
}
},
"nbformat": 4,
"nbformat_minor": 2
}