From c3a29117797027dbce60aa86c218ad7f3b0b7396 Mon Sep 17 00:00:00 2001 From: yatenglg <767624851@qq.com> Date: Wed, 11 Dec 2024 18:47:14 +0800 Subject: [PATCH] - support sam box prompt --- ISAT/configs.py | 1 + ISAT/icons.qrc | 1 + ISAT/icons_rc.py | 283 ++++++++++-------- ISAT/software.yaml | 2 +- ISAT/ui/MainWindow.py | 15 +- ISAT/ui/MainWindow.ui | 21 +- ISAT/widgets/canvas.py | 67 ++++- ISAT/widgets/mainwindow.py | 8 + ISAT/widgets/polygon.py | 96 +++++- ...7\237\251\345\275\242_rectangle-small.svg" | 1 + 10 files changed, 350 insertions(+), 145 deletions(-) create mode 100644 "icons/\345\260\217\347\237\251\345\275\242_rectangle-small.svg" diff --git a/ISAT/configs.py b/ISAT/configs.py index b2bacaa..904b295 100644 --- a/ISAT/configs.py +++ b/ISAT/configs.py @@ -37,6 +37,7 @@ class STATUSMode(Enum): class DRAWMode(Enum): POLYGON = 0 SEGMENTANYTHING = 1 + SEGMENTANYTHING_BOX = 2 class CLICKMode(Enum): POSITIVE = 0 diff --git a/ISAT/icons.qrc b/ISAT/icons.qrc index 8e54001..14d4f17 100644 --- a/ISAT/icons.qrc +++ b/ISAT/icons.qrc @@ -1,5 +1,6 @@ + ../icons/小矩形_rectangle-small.svg ../icons/关闭-小_close-small.svg ../icons/校验-小_check-small.svg ../icons/play-1.svg diff --git a/ISAT/icons_rc.py b/ISAT/icons_rc.py index 9f77c97..72594fd 100644 --- a/ISAT/icons_rc.py +++ b/ISAT/icons_rc.py @@ -240,6 +240,29 @@ \x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x22\x33\x22\x20\x73\ \x74\x72\x6f\x6b\x65\x2d\x6c\x69\x6e\x65\x63\x61\x70\x3d\x22\x73\ \x71\x75\x61\x72\x65\x22\x2f\x3e\x3c\x2f\x73\x76\x67\x3e\ +\x00\x00\x01\x48\ +\x3c\ +\x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ +\x30\x22\x20\x65\x6e\x63\x6f\x64\x69\x6e\x67\x3d\x22\x55\x54\x46\ +\x2d\x38\x22\x3f\x3e\x3c\x73\x76\x67\x20\x77\x69\x64\x74\x68\x3d\ +\x22\x33\x32\x22\x20\x68\x65\x69\x67\x68\x74\x3d\x22\x33\x32\x22\ +\x20\x76\x69\x65\x77\x42\x6f\x78\x3d\x22\x30\x20\x30\x20\x34\x38\ +\x20\x34\x38\x22\x20\x66\x69\x6c\x6c\x3d\x22\x6e\x6f\x6e\x65\x22\ +\x20\x78\x6d\x6c\x6e\x73\x3d\x22\x68\x74\x74\x70\x3a\x2f\x2f\x77\ +\x77\x77\x2e\x77\x33\x2e\x6f\x72\x67\x2f\x32\x30\x30\x30\x2f\x73\ +\x76\x67\x22\x3e\x3c\x70\x61\x74\x68\x20\x64\x3d\x22\x4d\x33\x36\ +\x20\x31\x34\x48\x31\x32\x43\x31\x30\x2e\x38\x39\x35\x34\x20\x31\ +\x34\x20\x31\x30\x20\x31\x34\x2e\x38\x39\x35\x34\x20\x31\x30\x20\ +\x31\x36\x56\x33\x32\x43\x31\x30\x20\x33\x33\x2e\x31\x30\x34\x36\ +\x20\x31\x30\x2e\x38\x39\x35\x34\x20\x33\x34\x20\x31\x32\x20\x33\ +\x34\x48\x33\x36\x43\x33\x37\x2e\x31\x30\x34\x36\x20\x33\x34\x20\ +\x33\x38\x20\x33\x33\x2e\x31\x30\x34\x36\x20\x33\x38\x20\x33\x32\ +\x56\x31\x36\x43\x33\x38\x20\x31\x34\x2e\x38\x39\x35\x34\x20\x33\ +\x37\x2e\x31\x30\x34\x36\x20\x31\x34\x20\x33\x36\x20\x31\x34\x5a\ +\x22\x20\x66\x69\x6c\x6c\x3d\x22\x6e\x6f\x6e\x65\x22\x20\x73\x74\ +\x72\x6f\x6b\x65\x3d\x22\x23\x30\x30\x36\x34\x66\x66\x22\x20\x73\ +\x74\x72\x6f\x6b\x65\x2d\x77\x69\x64\x74\x68\x3d\x22\x33\x22\x2f\ +\x3e\x3c\x2f\x73\x76\x67\x3e\ \x00\x00\x02\x95\ \x3c\ \x3f\x78\x6d\x6c\x20\x76\x65\x72\x73\x69\x6f\x6e\x3d\x22\x31\x2e\ @@ -5467,6 +5490,11 @@ \x4e\x00\ \x5b\xf9\x4e\x00\x00\x5f\x00\x6f\x00\x6e\x00\x65\x00\x2d\x00\x74\x00\x6f\x00\x2d\x00\x6f\x00\x6e\x00\x65\x00\x2e\x00\x73\x00\x76\ \x00\x67\ +\x00\x17\ +\x01\xea\xa2\x87\ +\x5c\x0f\ +\x77\xe9\x5f\x62\x00\x5f\x00\x72\x00\x65\x00\x63\x00\x74\x00\x61\x00\x6e\x00\x67\x00\x6c\x00\x65\x00\x2d\x00\x73\x00\x6d\x00\x61\ +\x00\x6c\x00\x6c\x00\x2e\x00\x73\x00\x76\x00\x67\ \x00\x0d\ \x01\xee\x64\x87\ \x52\x20\ @@ -5740,75 +5768,76 @@ qt_resource_struct_v1 = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00\x0e\x00\x02\x00\x00\x00\x44\x00\x00\x00\x03\ +\x00\x00\x00\x0e\x00\x02\x00\x00\x00\x45\x00\x00\x00\x03\ \x00\x00\x00\x1e\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x00\x3e\x00\x01\x00\x00\x00\x01\x00\x00\x06\x2c\ \x00\x00\x00\x78\x00\x00\x00\x00\x00\x01\x00\x00\x07\x5a\ \x00\x00\x00\x9e\x00\x01\x00\x00\x00\x01\x00\x00\x09\xa6\ \x00\x00\x00\xd4\x00\x00\x00\x00\x00\x01\x00\x00\x0a\xfd\ \x00\x00\x00\xfe\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xc0\ -\x00\x00\x01\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x10\x59\ -\x00\x00\x01\x48\x00\x00\x00\x00\x00\x01\x00\x00\x16\x00\ -\x00\x00\x01\x64\x00\x00\x00\x00\x00\x01\x00\x00\x19\x62\ -\x00\x00\x01\x86\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x3d\ -\x00\x00\x01\xae\x00\x00\x00\x00\x00\x01\x00\x00\x1d\xb2\ -\x00\x00\x01\xca\x00\x00\x00\x00\x00\x01\x00\x00\x21\x80\ -\x00\x00\x01\xf2\x00\x01\x00\x00\x00\x01\x00\x00\x23\x56\ -\x00\x00\x02\x12\x00\x00\x00\x00\x00\x01\x00\x00\x24\x6a\ -\x00\x00\x02\x44\x00\x00\x00\x00\x00\x01\x00\x00\x26\x99\ -\x00\x00\x02\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x27\xd0\ -\x00\x00\x02\x86\x00\x00\x00\x00\x00\x01\x00\x00\x2a\xdd\ -\x00\x00\x02\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x2f\x5f\ -\x00\x00\x02\xc4\x00\x00\x00\x00\x00\x01\x00\x00\x31\x47\ -\x00\x00\x03\x04\x00\x00\x00\x00\x00\x01\x00\x00\x34\x89\ -\x00\x00\x03\x22\x00\x00\x00\x00\x00\x01\x00\x00\x37\xbc\ -\x00\x00\x03\x40\x00\x00\x00\x00\x00\x01\x00\x00\x39\xa3\ -\x00\x00\x03\x6e\x00\x00\x00\x00\x00\x01\x00\x00\x3b\x04\ -\x00\x00\x03\x86\x00\x00\x00\x00\x00\x01\x00\x00\x3e\x0e\ -\x00\x00\x03\xac\x00\x00\x00\x00\x00\x01\x00\x00\x41\x53\ -\x00\x00\x03\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x4b\x50\ -\x00\x00\x03\xe0\x00\x00\x00\x00\x00\x01\x00\x00\x55\x0d\ -\x00\x00\x03\xfa\x00\x00\x00\x00\x00\x01\x00\x00\x5f\x1a\ -\x00\x00\x04\x14\x00\x00\x00\x00\x00\x01\x00\x00\x68\xde\ -\x00\x00\x04\x2e\x00\x00\x00\x00\x00\x01\x00\x00\x72\xdb\ -\x00\x00\x04\x48\x00\x00\x00\x00\x00\x01\x00\x00\x7c\xd8\ -\x00\x00\x04\x62\x00\x00\x00\x00\x00\x01\x00\x00\x86\xe5\ -\x00\x00\x04\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x90\xf2\ -\x00\x00\x04\xae\x00\x00\x00\x00\x00\x01\x00\x00\x93\x22\ -\x00\x00\x04\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x96\x96\ -\x00\x00\x05\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x9a\x88\ -\x00\x00\x05\x40\x00\x00\x00\x00\x00\x01\x00\x00\x9d\x35\ -\x00\x00\x05\x70\x00\x00\x00\x00\x00\x01\x00\x00\xa1\xc1\ -\x00\x00\x05\x8a\x00\x00\x00\x00\x00\x01\x00\x00\xa5\x08\ -\x00\x00\x05\xa6\x00\x00\x00\x00\x00\x01\x00\x00\xa7\x76\ -\x00\x00\x05\xc4\x00\x00\x00\x00\x00\x01\x00\x00\xaa\xd1\ -\x00\x00\x05\xe2\x00\x00\x00\x00\x00\x01\x00\x00\xaf\x6d\ -\x00\x00\x06\x06\x00\x00\x00\x00\x00\x01\x00\x00\xb1\xa6\ -\x00\x00\x06\x28\x00\x00\x00\x00\x00\x01\x00\x00\xbc\x20\ -\x00\x00\x06\x28\x00\x00\x00\x00\x00\x01\x00\x00\xc6\x4d\ -\x00\x00\x06\x4a\x00\x00\x00\x00\x00\x01\x00\x00\xd0\x7a\ -\x00\x00\x06\x6c\x00\x00\x00\x00\x00\x01\x00\x00\xda\xaf\ -\x00\x00\x06\x8e\x00\x00\x00\x00\x00\x01\x00\x00\xe5\x39\ -\x00\x00\x06\xb0\x00\x00\x00\x00\x00\x01\x00\x00\xef\xa6\ -\x00\x00\x06\xd2\x00\x00\x00\x00\x00\x01\x00\x00\xfa\x20\ -\x00\x00\x06\xf4\x00\x00\x00\x00\x00\x01\x00\x01\x04\x9f\ -\x00\x00\x07\x16\x00\x00\x00\x00\x00\x01\x00\x01\x0f\x29\ -\x00\x00\x07\x32\x00\x00\x00\x00\x00\x01\x00\x01\x10\xa7\ -\x00\x00\x07\x5e\x00\x00\x00\x00\x00\x01\x00\x01\x14\x8d\ -\x00\x00\x07\x8e\x00\x00\x00\x00\x00\x01\x00\x01\x16\xdf\ -\x00\x00\x07\xa8\x00\x00\x00\x00\x00\x01\x00\x01\x1c\x0b\ -\x00\x00\x07\xc2\x00\x00\x00\x00\x00\x01\x00\x01\x20\x9b\ -\x00\x00\x07\xf2\x00\x00\x00\x00\x00\x01\x00\x01\x22\x65\ -\x00\x00\x08\x1a\x00\x00\x00\x00\x00\x01\x00\x01\x25\x56\ -\x00\x00\x08\x48\x00\x00\x00\x00\x00\x01\x00\x01\x26\x54\ -\x00\x00\x08\x70\x00\x00\x00\x00\x00\x01\x00\x01\x30\x86\ -\x00\x00\x08\x90\x00\x00\x00\x00\x00\x01\x00\x01\x37\xbe\ -\x00\x00\x08\xae\x00\x00\x00\x00\x00\x01\x00\x01\x39\xa6\ -\x00\x00\x08\xf4\x00\x00\x00\x00\x00\x01\x00\x01\x3c\x9f\ -\x00\x00\x09\x1a\x00\x00\x00\x00\x00\x01\x00\x01\x40\x0c\ -\x00\x00\x09\x40\x00\x00\x00\x00\x00\x01\x00\x01\x42\x8e\ -\x00\x00\x09\x78\x00\x00\x00\x00\x00\x01\x00\x01\x44\xa2\ -\x00\x00\x09\x96\x00\x00\x00\x00\x00\x01\x00\x01\x47\x33\ +\x00\x00\x01\x32\x00\x00\x00\x00\x00\x01\x00\x00\x0f\x0c\ +\x00\x00\x01\x52\x00\x00\x00\x00\x00\x01\x00\x00\x11\xa5\ +\x00\x00\x01\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x17\x4c\ +\x00\x00\x01\x98\x00\x00\x00\x00\x00\x01\x00\x00\x1a\xae\ +\x00\x00\x01\xba\x00\x00\x00\x00\x00\x01\x00\x00\x1c\x89\ +\x00\x00\x01\xe2\x00\x00\x00\x00\x00\x01\x00\x00\x1e\xfe\ +\x00\x00\x01\xfe\x00\x00\x00\x00\x00\x01\x00\x00\x22\xcc\ +\x00\x00\x02\x26\x00\x01\x00\x00\x00\x01\x00\x00\x24\xa2\ +\x00\x00\x02\x46\x00\x00\x00\x00\x00\x01\x00\x00\x25\xb6\ +\x00\x00\x02\x78\x00\x00\x00\x00\x00\x01\x00\x00\x27\xe5\ +\x00\x00\x02\x9e\x00\x00\x00\x00\x00\x01\x00\x00\x29\x1c\ +\x00\x00\x02\xba\x00\x00\x00\x00\x00\x01\x00\x00\x2c\x29\ +\x00\x00\x02\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x30\xab\ +\x00\x00\x02\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x32\x93\ +\x00\x00\x03\x38\x00\x00\x00\x00\x00\x01\x00\x00\x35\xd5\ +\x00\x00\x03\x56\x00\x00\x00\x00\x00\x01\x00\x00\x39\x08\ +\x00\x00\x03\x74\x00\x00\x00\x00\x00\x01\x00\x00\x3a\xef\ +\x00\x00\x03\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x3c\x50\ +\x00\x00\x03\xba\x00\x00\x00\x00\x00\x01\x00\x00\x3f\x5a\ +\x00\x00\x03\xe0\x00\x00\x00\x00\x00\x01\x00\x00\x42\x9f\ +\x00\x00\x03\xfa\x00\x00\x00\x00\x00\x01\x00\x00\x4c\x9c\ +\x00\x00\x04\x14\x00\x00\x00\x00\x00\x01\x00\x00\x56\x59\ +\x00\x00\x04\x2e\x00\x00\x00\x00\x00\x01\x00\x00\x60\x66\ +\x00\x00\x04\x48\x00\x00\x00\x00\x00\x01\x00\x00\x6a\x2a\ +\x00\x00\x04\x62\x00\x00\x00\x00\x00\x01\x00\x00\x74\x27\ +\x00\x00\x04\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x7e\x24\ +\x00\x00\x04\x96\x00\x00\x00\x00\x00\x01\x00\x00\x88\x31\ +\x00\x00\x04\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x92\x3e\ +\x00\x00\x04\xe2\x00\x00\x00\x00\x00\x01\x00\x00\x94\x6e\ +\x00\x00\x05\x28\x00\x00\x00\x00\x00\x01\x00\x00\x97\xe2\ +\x00\x00\x05\x52\x00\x00\x00\x00\x00\x01\x00\x00\x9b\xd4\ +\x00\x00\x05\x74\x00\x00\x00\x00\x00\x01\x00\x00\x9e\x81\ +\x00\x00\x05\xa4\x00\x00\x00\x00\x00\x01\x00\x00\xa3\x0d\ +\x00\x00\x05\xbe\x00\x00\x00\x00\x00\x01\x00\x00\xa6\x54\ +\x00\x00\x05\xda\x00\x00\x00\x00\x00\x01\x00\x00\xa8\xc2\ +\x00\x00\x05\xf8\x00\x00\x00\x00\x00\x01\x00\x00\xac\x1d\ +\x00\x00\x06\x16\x00\x00\x00\x00\x00\x01\x00\x00\xb0\xb9\ +\x00\x00\x06\x3a\x00\x00\x00\x00\x00\x01\x00\x00\xb2\xf2\ +\x00\x00\x06\x5c\x00\x00\x00\x00\x00\x01\x00\x00\xbd\x6c\ +\x00\x00\x06\x5c\x00\x00\x00\x00\x00\x01\x00\x00\xc7\x99\ +\x00\x00\x06\x7e\x00\x00\x00\x00\x00\x01\x00\x00\xd1\xc6\ +\x00\x00\x06\xa0\x00\x00\x00\x00\x00\x01\x00\x00\xdb\xfb\ +\x00\x00\x06\xc2\x00\x00\x00\x00\x00\x01\x00\x00\xe6\x85\ +\x00\x00\x06\xe4\x00\x00\x00\x00\x00\x01\x00\x00\xf0\xf2\ +\x00\x00\x07\x06\x00\x00\x00\x00\x00\x01\x00\x00\xfb\x6c\ +\x00\x00\x07\x28\x00\x00\x00\x00\x00\x01\x00\x01\x05\xeb\ +\x00\x00\x07\x4a\x00\x00\x00\x00\x00\x01\x00\x01\x10\x75\ +\x00\x00\x07\x66\x00\x00\x00\x00\x00\x01\x00\x01\x11\xf3\ +\x00\x00\x07\x92\x00\x00\x00\x00\x00\x01\x00\x01\x15\xd9\ +\x00\x00\x07\xc2\x00\x00\x00\x00\x00\x01\x00\x01\x18\x2b\ +\x00\x00\x07\xdc\x00\x00\x00\x00\x00\x01\x00\x01\x1d\x57\ +\x00\x00\x07\xf6\x00\x00\x00\x00\x00\x01\x00\x01\x21\xe7\ +\x00\x00\x08\x26\x00\x00\x00\x00\x00\x01\x00\x01\x23\xb1\ +\x00\x00\x08\x4e\x00\x00\x00\x00\x00\x01\x00\x01\x26\xa2\ +\x00\x00\x08\x7c\x00\x00\x00\x00\x00\x01\x00\x01\x27\xa0\ +\x00\x00\x08\xa4\x00\x00\x00\x00\x00\x01\x00\x01\x31\xd2\ +\x00\x00\x08\xc4\x00\x00\x00\x00\x00\x01\x00\x01\x39\x0a\ +\x00\x00\x08\xe2\x00\x00\x00\x00\x00\x01\x00\x01\x3a\xf2\ +\x00\x00\x09\x28\x00\x00\x00\x00\x00\x01\x00\x01\x3d\xeb\ +\x00\x00\x09\x4e\x00\x00\x00\x00\x00\x01\x00\x01\x41\x58\ +\x00\x00\x09\x74\x00\x00\x00\x00\x00\x01\x00\x01\x43\xda\ +\x00\x00\x09\xac\x00\x00\x00\x00\x00\x01\x00\x01\x45\xee\ +\x00\x00\x09\xca\x00\x00\x00\x00\x00\x01\x00\x01\x48\x7f\ " qt_resource_struct_v2 = b"\ @@ -5816,7 +5845,7 @@ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ \x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x0e\x00\x02\x00\x00\x00\x44\x00\x00\x00\x03\ +\x00\x00\x00\x0e\x00\x02\x00\x00\x00\x45\x00\x00\x00\x03\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x1e\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ @@ -5829,130 +5858,132 @@ \x00\x00\x00\xd4\x00\x00\x00\x00\x00\x01\x00\x00\x0a\xfd\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ \x00\x00\x00\xfe\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xc0\ +\x00\x00\x01\x93\xb5\x40\x33\xad\ +\x00\x00\x01\x32\x00\x00\x00\x00\x00\x01\x00\x00\x0f\x0c\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x01\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x10\x59\ +\x00\x00\x01\x52\x00\x00\x00\x00\x00\x01\x00\x00\x11\xa5\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x01\x48\x00\x00\x00\x00\x00\x01\x00\x00\x16\x00\ +\x00\x00\x01\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x17\x4c\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x01\x64\x00\x00\x00\x00\x00\x01\x00\x00\x19\x62\ +\x00\x00\x01\x98\x00\x00\x00\x00\x00\x01\x00\x00\x1a\xae\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x01\x86\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x3d\ +\x00\x00\x01\xba\x00\x00\x00\x00\x00\x01\x00\x00\x1c\x89\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x01\xae\x00\x00\x00\x00\x00\x01\x00\x00\x1d\xb2\ +\x00\x00\x01\xe2\x00\x00\x00\x00\x00\x01\x00\x00\x1e\xfe\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x01\xca\x00\x00\x00\x00\x00\x01\x00\x00\x21\x80\ +\x00\x00\x01\xfe\x00\x00\x00\x00\x00\x01\x00\x00\x22\xcc\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x01\xf2\x00\x01\x00\x00\x00\x01\x00\x00\x23\x56\ +\x00\x00\x02\x26\x00\x01\x00\x00\x00\x01\x00\x00\x24\xa2\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x02\x12\x00\x00\x00\x00\x00\x01\x00\x00\x24\x6a\ +\x00\x00\x02\x46\x00\x00\x00\x00\x00\x01\x00\x00\x25\xb6\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x02\x44\x00\x00\x00\x00\x00\x01\x00\x00\x26\x99\ +\x00\x00\x02\x78\x00\x00\x00\x00\x00\x01\x00\x00\x27\xe5\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x02\x6a\x00\x00\x00\x00\x00\x01\x00\x00\x27\xd0\ +\x00\x00\x02\x9e\x00\x00\x00\x00\x00\x01\x00\x00\x29\x1c\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x02\x86\x00\x00\x00\x00\x00\x01\x00\x00\x2a\xdd\ +\x00\x00\x02\xba\x00\x00\x00\x00\x00\x01\x00\x00\x2c\x29\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x02\x9c\x00\x00\x00\x00\x00\x01\x00\x00\x2f\x5f\ +\x00\x00\x02\xd0\x00\x00\x00\x00\x00\x01\x00\x00\x30\xab\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x02\xc4\x00\x00\x00\x00\x00\x01\x00\x00\x31\x47\ +\x00\x00\x02\xf8\x00\x00\x00\x00\x00\x01\x00\x00\x32\x93\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x03\x04\x00\x00\x00\x00\x00\x01\x00\x00\x34\x89\ +\x00\x00\x03\x38\x00\x00\x00\x00\x00\x01\x00\x00\x35\xd5\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x03\x22\x00\x00\x00\x00\x00\x01\x00\x00\x37\xbc\ +\x00\x00\x03\x56\x00\x00\x00\x00\x00\x01\x00\x00\x39\x08\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x03\x40\x00\x00\x00\x00\x00\x01\x00\x00\x39\xa3\ +\x00\x00\x03\x74\x00\x00\x00\x00\x00\x01\x00\x00\x3a\xef\ \x00\x00\x01\x93\xb0\x2d\x57\x77\ -\x00\x00\x03\x6e\x00\x00\x00\x00\x00\x01\x00\x00\x3b\x04\ +\x00\x00\x03\xa2\x00\x00\x00\x00\x00\x01\x00\x00\x3c\x50\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x03\x86\x00\x00\x00\x00\x00\x01\x00\x00\x3e\x0e\ +\x00\x00\x03\xba\x00\x00\x00\x00\x00\x01\x00\x00\x3f\x5a\ \x00\x00\x01\x92\x32\x12\x40\x8d\ -\x00\x00\x03\xac\x00\x00\x00\x00\x00\x01\x00\x00\x41\x53\ +\x00\x00\x03\xe0\x00\x00\x00\x00\x00\x01\x00\x00\x42\x9f\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x03\xc6\x00\x00\x00\x00\x00\x01\x00\x00\x4b\x50\ +\x00\x00\x03\xfa\x00\x00\x00\x00\x00\x01\x00\x00\x4c\x9c\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x03\xe0\x00\x00\x00\x00\x00\x01\x00\x00\x55\x0d\ +\x00\x00\x04\x14\x00\x00\x00\x00\x00\x01\x00\x00\x56\x59\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x03\xfa\x00\x00\x00\x00\x00\x01\x00\x00\x5f\x1a\ +\x00\x00\x04\x2e\x00\x00\x00\x00\x00\x01\x00\x00\x60\x66\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x04\x14\x00\x00\x00\x00\x00\x01\x00\x00\x68\xde\ +\x00\x00\x04\x48\x00\x00\x00\x00\x00\x01\x00\x00\x6a\x2a\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x04\x2e\x00\x00\x00\x00\x00\x01\x00\x00\x72\xdb\ +\x00\x00\x04\x62\x00\x00\x00\x00\x00\x01\x00\x00\x74\x27\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x04\x48\x00\x00\x00\x00\x00\x01\x00\x00\x7c\xd8\ +\x00\x00\x04\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x7e\x24\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x04\x62\x00\x00\x00\x00\x00\x01\x00\x00\x86\xe5\ +\x00\x00\x04\x96\x00\x00\x00\x00\x00\x01\x00\x00\x88\x31\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x04\x7c\x00\x00\x00\x00\x00\x01\x00\x00\x90\xf2\ +\x00\x00\x04\xb0\x00\x00\x00\x00\x00\x01\x00\x00\x92\x3e\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x04\xae\x00\x00\x00\x00\x00\x01\x00\x00\x93\x22\ +\x00\x00\x04\xe2\x00\x00\x00\x00\x00\x01\x00\x00\x94\x6e\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x04\xf4\x00\x00\x00\x00\x00\x01\x00\x00\x96\x96\ +\x00\x00\x05\x28\x00\x00\x00\x00\x00\x01\x00\x00\x97\xe2\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x05\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x9a\x88\ +\x00\x00\x05\x52\x00\x00\x00\x00\x00\x01\x00\x00\x9b\xd4\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x05\x40\x00\x00\x00\x00\x00\x01\x00\x00\x9d\x35\ +\x00\x00\x05\x74\x00\x00\x00\x00\x00\x01\x00\x00\x9e\x81\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x05\x70\x00\x00\x00\x00\x00\x01\x00\x00\xa1\xc1\ +\x00\x00\x05\xa4\x00\x00\x00\x00\x00\x01\x00\x00\xa3\x0d\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x05\x8a\x00\x00\x00\x00\x00\x01\x00\x00\xa5\x08\ +\x00\x00\x05\xbe\x00\x00\x00\x00\x00\x01\x00\x00\xa6\x54\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x05\xa6\x00\x00\x00\x00\x00\x01\x00\x00\xa7\x76\ +\x00\x00\x05\xda\x00\x00\x00\x00\x00\x01\x00\x00\xa8\xc2\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x05\xc4\x00\x00\x00\x00\x00\x01\x00\x00\xaa\xd1\ +\x00\x00\x05\xf8\x00\x00\x00\x00\x00\x01\x00\x00\xac\x1d\ \x00\x00\x01\x91\xbc\x84\xb0\x44\ -\x00\x00\x05\xe2\x00\x00\x00\x00\x00\x01\x00\x00\xaf\x6d\ +\x00\x00\x06\x16\x00\x00\x00\x00\x00\x01\x00\x00\xb0\xb9\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x06\x06\x00\x00\x00\x00\x00\x01\x00\x00\xb1\xa6\ +\x00\x00\x06\x3a\x00\x00\x00\x00\x00\x01\x00\x00\xb2\xf2\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x06\x28\x00\x00\x00\x00\x00\x01\x00\x00\xbc\x20\ +\x00\x00\x06\x5c\x00\x00\x00\x00\x00\x01\x00\x00\xbd\x6c\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x06\x28\x00\x00\x00\x00\x00\x01\x00\x00\xc6\x4d\ +\x00\x00\x06\x5c\x00\x00\x00\x00\x00\x01\x00\x00\xc7\x99\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x06\x4a\x00\x00\x00\x00\x00\x01\x00\x00\xd0\x7a\ +\x00\x00\x06\x7e\x00\x00\x00\x00\x00\x01\x00\x00\xd1\xc6\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x06\x6c\x00\x00\x00\x00\x00\x01\x00\x00\xda\xaf\ +\x00\x00\x06\xa0\x00\x00\x00\x00\x00\x01\x00\x00\xdb\xfb\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x06\x8e\x00\x00\x00\x00\x00\x01\x00\x00\xe5\x39\ +\x00\x00\x06\xc2\x00\x00\x00\x00\x00\x01\x00\x00\xe6\x85\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x06\xb0\x00\x00\x00\x00\x00\x01\x00\x00\xef\xa6\ +\x00\x00\x06\xe4\x00\x00\x00\x00\x00\x01\x00\x00\xf0\xf2\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x06\xd2\x00\x00\x00\x00\x00\x01\x00\x00\xfa\x20\ +\x00\x00\x07\x06\x00\x00\x00\x00\x00\x01\x00\x00\xfb\x6c\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x06\xf4\x00\x00\x00\x00\x00\x01\x00\x01\x04\x9f\ +\x00\x00\x07\x28\x00\x00\x00\x00\x00\x01\x00\x01\x05\xeb\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x07\x16\x00\x00\x00\x00\x00\x01\x00\x01\x0f\x29\ +\x00\x00\x07\x4a\x00\x00\x00\x00\x00\x01\x00\x01\x10\x75\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x07\x32\x00\x00\x00\x00\x00\x01\x00\x01\x10\xa7\ +\x00\x00\x07\x66\x00\x00\x00\x00\x00\x01\x00\x01\x11\xf3\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x07\x5e\x00\x00\x00\x00\x00\x01\x00\x01\x14\x8d\ +\x00\x00\x07\x92\x00\x00\x00\x00\x00\x01\x00\x01\x15\xd9\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x07\x8e\x00\x00\x00\x00\x00\x01\x00\x01\x16\xdf\ +\x00\x00\x07\xc2\x00\x00\x00\x00\x00\x01\x00\x01\x18\x2b\ \x00\x00\x01\x91\xbc\x81\x6a\x90\ -\x00\x00\x07\xa8\x00\x00\x00\x00\x00\x01\x00\x01\x1c\x0b\ +\x00\x00\x07\xdc\x00\x00\x00\x00\x00\x01\x00\x01\x1d\x57\ \x00\x00\x01\x91\xbc\x83\x46\x5b\ -\x00\x00\x07\xc2\x00\x00\x00\x00\x00\x01\x00\x01\x20\x9b\ +\x00\x00\x07\xf6\x00\x00\x00\x00\x00\x01\x00\x01\x21\xe7\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x07\xf2\x00\x00\x00\x00\x00\x01\x00\x01\x22\x65\ +\x00\x00\x08\x26\x00\x00\x00\x00\x00\x01\x00\x01\x23\xb1\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x08\x1a\x00\x00\x00\x00\x00\x01\x00\x01\x25\x56\ +\x00\x00\x08\x4e\x00\x00\x00\x00\x00\x01\x00\x01\x26\xa2\ \x00\x00\x01\x93\xb0\x2d\x40\x2a\ -\x00\x00\x08\x48\x00\x00\x00\x00\x00\x01\x00\x01\x26\x54\ +\x00\x00\x08\x7c\x00\x00\x00\x00\x00\x01\x00\x01\x27\xa0\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x08\x70\x00\x00\x00\x00\x00\x01\x00\x01\x30\x86\ +\x00\x00\x08\xa4\x00\x00\x00\x00\x00\x01\x00\x01\x31\xd2\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x08\x90\x00\x00\x00\x00\x00\x01\x00\x01\x37\xbe\ +\x00\x00\x08\xc4\x00\x00\x00\x00\x00\x01\x00\x01\x39\x0a\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x08\xae\x00\x00\x00\x00\x00\x01\x00\x01\x39\xa6\ +\x00\x00\x08\xe2\x00\x00\x00\x00\x00\x01\x00\x01\x3a\xf2\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x08\xf4\x00\x00\x00\x00\x00\x01\x00\x01\x3c\x9f\ +\x00\x00\x09\x28\x00\x00\x00\x00\x00\x01\x00\x01\x3d\xeb\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x09\x1a\x00\x00\x00\x00\x00\x01\x00\x01\x40\x0c\ +\x00\x00\x09\x4e\x00\x00\x00\x00\x00\x01\x00\x01\x41\x58\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x09\x40\x00\x00\x00\x00\x00\x01\x00\x01\x42\x8e\ +\x00\x00\x09\x74\x00\x00\x00\x00\x00\x01\x00\x01\x43\xda\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x09\x78\x00\x00\x00\x00\x00\x01\x00\x01\x44\xa2\ +\x00\x00\x09\xac\x00\x00\x00\x00\x00\x01\x00\x01\x45\xee\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ -\x00\x00\x09\x96\x00\x00\x00\x00\x00\x01\x00\x01\x47\x33\ +\x00\x00\x09\xca\x00\x00\x00\x00\x00\x01\x00\x01\x48\x7f\ \x00\x00\x01\x90\xc4\xda\x36\x6e\ " diff --git a/ISAT/software.yaml b/ISAT/software.yaml index 70d4a4b..1a49580 100644 --- a/ISAT/software.yaml +++ b/ISAT/software.yaml @@ -24,7 +24,7 @@ label: software: auto_save: false contour_mode: external - language: zh + language: en mask_alpha: 0.6 show_edge: true show_prompt: true diff --git a/ISAT/ui/MainWindow.py b/ISAT/ui/MainWindow.py index 3928d92..ce304f9 100644 --- a/ISAT/ui/MainWindow.py +++ b/ISAT/ui/MainWindow.py @@ -362,6 +362,11 @@ def setupUi(self, MainWindow): icon35.addPixmap(QtGui.QPixmap(":/icon/icons/视频_video-two.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.actionVideo_to_frames.setIcon(icon35) self.actionVideo_to_frames.setObjectName("actionVideo_to_frames") + self.actionSegment_anything_box = QtWidgets.QAction(MainWindow) + icon36 = QtGui.QIcon() + icon36.addPixmap(QtGui.QPixmap(":/icon/icons/小矩形_rectangle-small.svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.actionSegment_anything_box.setIcon(icon36) + self.actionSegment_anything_box.setObjectName("actionSegment_anything_box") self.menuFile.addAction(self.actionOpen_dir) self.menuFile.addAction(self.actionSave_dir) self.menuFile.addSeparator() @@ -388,6 +393,7 @@ def setupUi(self, MainWindow): self.menuTools.addAction(self.actionAuto_segment) self.menuTools.addAction(self.actionAnno_validator) self.menuEdit.addAction(self.actionSegment_anything) + self.menuEdit.addAction(self.actionSegment_anything_box) self.menuEdit.addAction(self.actionPolygon) self.menuEdit.addSeparator() self.menuEdit.addAction(self.actionVideo_segment) @@ -428,6 +434,7 @@ def setupUi(self, MainWindow): self.toolBar.addAction(self.actionNext) self.toolBar.addSeparator() self.toolBar.addAction(self.actionSegment_anything) + self.toolBar.addAction(self.actionSegment_anything_box) self.toolBar.addAction(self.actionPolygon) self.toolBar.addSeparator() self.toolBar.addAction(self.actionVideo_segment_once) @@ -507,8 +514,8 @@ def retranslateUi(self, MainWindow): self.actionNext.setShortcut(_translate("MainWindow", "D")) self.actionShortcut.setText(_translate("MainWindow", "Shortcut")) self.actionAbout.setText(_translate("MainWindow", "About")) - self.actionSegment_anything.setText(_translate("MainWindow", "Segment anything")) - self.actionSegment_anything.setToolTip(_translate("MainWindow", "Segment anything")) + self.actionSegment_anything.setText(_translate("MainWindow", "Segment anything point")) + self.actionSegment_anything.setToolTip(_translate("MainWindow", "Segment anything point")) self.actionSegment_anything.setStatusTip(_translate("MainWindow", "Quick annotate using Segment anything.")) self.actionSegment_anything.setShortcut(_translate("MainWindow", "Q")) self.actionDelete.setText(_translate("MainWindow", "Delete")) @@ -588,4 +595,6 @@ def retranslateUi(self, MainWindow): self.actionVideo_segment_five_times.setText(_translate("MainWindow", "Video segment five times")) self.actionVideo_segment_five_times.setStatusTip(_translate("MainWindow", "Video segment next five frames.(only support sam2 model)")) self.actionVideo_to_frames.setText(_translate("MainWindow", "Video to frames")) - + self.actionSegment_anything_box.setText(_translate("MainWindow", "Segment anything box")) + self.actionSegment_anything_box.setStatusTip(_translate("MainWindow", "Quick annotate using Segment anything.")) + self.actionSegment_anything_box.setShortcut(_translate("MainWindow", "W")) diff --git a/ISAT/ui/MainWindow.ui b/ISAT/ui/MainWindow.ui index 3ec6146..24d7713 100644 --- a/ISAT/ui/MainWindow.ui +++ b/ISAT/ui/MainWindow.ui @@ -167,6 +167,7 @@ Edit + @@ -266,6 +267,7 @@ + @@ -528,10 +530,10 @@ :/icon/icons/M_Favicon.ico:/icon/icons/M_Favicon.ico - Segment anything + Segment anything point - Segment anything + Segment anything point Quick annotate using Segment anything. @@ -993,6 +995,21 @@ Video to frames + + + + :/icon/icons/小矩形_rectangle-small.svg:/icon/icons/小矩形_rectangle-small.svg + + + Segment anything box + + + Quick annotate using Segment anything. + + + W + + diff --git a/ISAT/widgets/canvas.py b/ISAT/widgets/canvas.py index d716e1b..8020c00 100644 --- a/ISAT/widgets/canvas.py +++ b/ISAT/widgets/canvas.py @@ -2,7 +2,7 @@ # @Author : LG from PyQt5 import QtWidgets, QtGui, QtCore -from ISAT.widgets.polygon import Polygon, Vertex, PromptPoint, Line +from ISAT.widgets.polygon import Polygon, Vertex, PromptPoint, Line, Rect from ISAT.configs import STATUSMode, CLICKMode, DRAWMode, CONTOURMode import numpy as np import cv2 @@ -18,6 +18,7 @@ def __init__(self, mainwindow): self.mask_item: QtWidgets.QGraphicsPixmapItem = None self.image_data = None self.current_graph: Polygon = None + self.current_sam_rect: Rect = None self.current_line: Line = None self.mode = STATUSMode.VIEW self.click = CLICKMode.POSITIVE @@ -82,6 +83,7 @@ def change_mode_to_create(self): self.mainwindow.actionNext.setEnabled(False) self.mainwindow.actionSegment_anything.setEnabled(False) + self.mainwindow.actionSegment_anything_box.setEnabled(False) self.mainwindow.actionPolygon.setEnabled(False) self.mainwindow.actionBackspace.setEnabled(True) self.mainwindow.actionFinish.setEnabled(True) @@ -157,6 +159,7 @@ def change_mode_to_edit(self): self.mainwindow.actionNext.setEnabled(False) self.mainwindow.actionSegment_anything.setEnabled(False) + self.mainwindow.actionSegment_anything_box.setEnabled(False) self.mainwindow.actionPolygon.setEnabled(False) self.mainwindow.actionBackspace.setEnabled(False) self.mainwindow.actionFinish.setEnabled(False) @@ -198,6 +201,7 @@ def change_mode_to_repaint(self): self.mainwindow.actionNext.setEnabled(False) self.mainwindow.actionSegment_anything.setEnabled(False) + self.mainwindow.actionSegment_anything_box.setEnabled(False) self.mainwindow.actionPolygon.setEnabled(False) self.mainwindow.actionBackspace.setEnabled(True) self.mainwindow.actionFinish.setEnabled(False) @@ -242,6 +246,10 @@ def start_segment_anything(self): self.draw_mode = DRAWMode.SEGMENTANYTHING self.start_draw() + def start_segment_anything_box(self): + self.draw_mode = DRAWMode.SEGMENTANYTHING_BOX + self.start_draw() + def start_draw_polygon(self): self.draw_mode = DRAWMode.POLYGON self.start_draw() @@ -269,7 +277,7 @@ def finish_draw(self): is_crowd = False note = '' - if self.draw_mode == DRAWMode.SEGMENTANYTHING: + if self.draw_mode == DRAWMode.SEGMENTANYTHING or self.draw_mode == DRAWMode.SEGMENTANYTHING_BOX: # mask to polygon # -------------- if self.masks is not None: @@ -378,6 +386,12 @@ def finish_draw(self): self.mainwindow.annos_dock_widget.update_listwidget() self.current_graph = None + + if self.current_sam_rect is not None: + self.current_sam_rect.delete() + self.removeItem(self.current_sam_rect) + self.current_sam_rect = None + self.change_mode_to_view() # mask清空 @@ -406,6 +420,11 @@ def cancel_draw(self): for item in self.selectedItems(): item.setSelected(False) + if self.current_sam_rect is not None: + self.current_sam_rect.delete() + self.removeItem(self.current_sam_rect) + self.current_sam_rect = None + self.change_mode_to_view() self.click_points.clear() @@ -763,6 +782,14 @@ def mousePressEvent(self, event: 'QtWidgets.QGraphicsSceneMouseEvent'): self.prompt_points.append(prompt_point) self.addItem(prompt_point) + elif self.draw_mode == DRAWMode.SEGMENTANYTHING_BOX: # sam 矩形框提示 + if self.current_sam_rect is None: + self.current_sam_rect = Rect() + self.current_sam_rect.setZValue(2) + self.addItem(self.current_sam_rect) + self.current_sam_rect.addPoint(QtCore.QPointF(sceneX, sceneY)) + self.current_sam_rect.addPoint(QtCore.QPointF(sceneX, sceneY)) + elif self.draw_mode == DRAWMode.POLYGON: # 移除随鼠标移动的点 self.current_graph.removePoint(len(self.current_graph.points) - 1) @@ -877,6 +904,10 @@ def mouseMoveEvent(self, event: 'QtWidgets.QGraphicsSceneMouseEvent'): if self.draw_mode == DRAWMode.POLYGON: # 随鼠标位置实时更新多边形 self.current_graph.movePoint(len(self.current_graph.points) - 1, pos) + if self.draw_mode == DRAWMode.SEGMENTANYTHING_BOX: + if self.current_sam_rect is not None: + self.current_sam_rect.movePoint(len(self.current_sam_rect.points) - 1, pos) + self.update_mask() if self.mode == STATUSMode.REPAINT: self.current_line.movePoint(len(self.current_line.points) - 1, pos) @@ -946,6 +977,23 @@ def update_mask(self): if len(self.click_points) > 0 and len(self.click_points_mode) > 0: masks = self.mainwindow.segany.predict_with_point_prompt(self.click_points, self.click_points_mode) + self.masks = masks + color = np.array([0, 0, 255]) + h, w = masks.shape[-2:] + mask_image = masks.reshape(h, w, 1) * color.reshape(1, 1, -1) + mask_image = mask_image.astype("uint8") + mask_image = cv2.cvtColor(mask_image, cv2.COLOR_BGR2RGB) + mask_image = cv2.addWeighted(self.image_data, self.mask_alpha, mask_image, 1, 0) + elif self.current_sam_rect is not None: + point1 = self.current_sam_rect.points[0] + point2 = self.current_sam_rect.points[1] + box = np.array([min(point1.x(), point2.x()), + min(point1.y(), point2.y()), + max(point1.x(), point2.x()), + max(point1.y(), point2.y()), + ]) + masks = self.mainwindow.segany.predict_with_box_prompt(box) + self.masks = masks color = np.array([0, 0, 255]) h, w = masks.shape[-2:] @@ -954,19 +1002,14 @@ def update_mask(self): mask_image = cv2.cvtColor(mask_image, cv2.COLOR_BGR2RGB) # 这里通过调整原始图像的权重self.mask_alpha,来调整mask的明显程度。 mask_image = cv2.addWeighted(self.image_data, self.mask_alpha, mask_image, 1, 0) - mask_image = QtGui.QImage(mask_image[:], mask_image.shape[1], mask_image.shape[0], mask_image.shape[1] * 3, - QtGui.QImage.Format_RGB888) - mask_pixmap = QtGui.QPixmap(mask_image) - if self.mask_item is not None: - self.mask_item.setPixmap(mask_pixmap) else: mask_image = np.zeros(self.image_data.shape, dtype=np.uint8) mask_image = cv2.addWeighted(self.image_data, 1, mask_image, 0, 0) - mask_image = QtGui.QImage(mask_image[:], mask_image.shape[1], mask_image.shape[0], mask_image.shape[1] * 3, - QtGui.QImage.Format_RGB888) - mask_pixmap = QtGui.QPixmap(mask_image) - if self.mask_item is not None: - self.mask_item.setPixmap(mask_pixmap) + mask_image = QtGui.QImage(mask_image[:], mask_image.shape[1], mask_image.shape[0], mask_image.shape[1] * 3, + QtGui.QImage.Format_RGB888) + mask_pixmap = QtGui.QPixmap(mask_image) + if self.mask_item is not None: + self.mask_item.setPixmap(mask_pixmap) def backspace(self): if self.mode == STATUSMode.CREATE: diff --git a/ISAT/widgets/mainwindow.py b/ISAT/widgets/mainwindow.py index e32dd06..9ab6791 100644 --- a/ISAT/widgets/mainwindow.py +++ b/ISAT/widgets/mainwindow.py @@ -405,6 +405,7 @@ def init_segment_anything(self, model_name=None): return # 等待sam线程完成 self.actionSegment_anything.setEnabled(False) + self.actionSegment_anything_box.setEnabled(False) try: self.seganythread.wait() self.seganythread.results_dict.clear() @@ -539,6 +540,7 @@ def SeganyEnabled(self): """ if not self.use_segment_anything: self.actionSegment_anything.setEnabled(False) + self.actionSegment_anything_box.setEnabled(False) return results = self.seganythread.results_dict.get(self.current_index, {}) @@ -560,9 +562,11 @@ def SeganyEnabled(self): self.segany.predictor_with_point_prompt._is_image_set = True self.actionSegment_anything.setEnabled(True) + self.actionSegment_anything_box.setEnabled(True) else: self.segany.predictor_with_point_prompt.reset_image() self.actionSegment_anything.setEnabled(False) + self.actionSegment_anything_box.setEnabled(False) def seg_video_start(self, max_frame_num_to_track=None): if self.current_index == None: @@ -1161,6 +1165,7 @@ def change_bit_map_to_semantic(self): self.annos_dock_widget.listWidget.setEnabled(False) self.annos_dock_widget.checkBox_visible.setEnabled(False) self.actionSegment_anything.setEnabled(False) + self.actionSegment_anything_box.setEnabled(False) self.actionVideo_segment.setEnabled(False) self.actionVideo_segment_once.setEnabled(False) self.actionVideo_segment_five_times.setEnabled(False) @@ -1189,6 +1194,7 @@ def change_bit_map_to_instance(self): self.annos_dock_widget.listWidget.setEnabled(False) self.annos_dock_widget.checkBox_visible.setEnabled(False) self.actionSegment_anything.setEnabled(False) + self.actionSegment_anything_box.setEnabled(False) self.actionVideo_segment.setEnabled(False) self.actionVideo_segment_once.setEnabled(False) self.actionVideo_segment_five_times.setEnabled(False) @@ -1425,6 +1431,7 @@ def init_connect(self): self.actionExit.triggered.connect(self.exit) self.actionSegment_anything.triggered.connect(self.scene.start_segment_anything) + self.actionSegment_anything_box.triggered.connect(self.scene.start_segment_anything_box) self.actionPolygon.triggered.connect(self.scene.start_draw_polygon) self.actionCancel.triggered.connect(self.scene.cancel_draw) self.actionBackspace.triggered.connect(self.scene.backspace) @@ -1471,6 +1478,7 @@ def reset_action(self): self.actionPrev.setEnabled(False) self.actionNext.setEnabled(False) self.actionSegment_anything.setEnabled(False) + self.actionSegment_anything_box.setEnabled(False) self.actionPolygon.setEnabled(False) self.actionVideo_segment.setEnabled(False) self.actionVideo_segment_once.setEnabled(False) diff --git a/ISAT/widgets/polygon.py b/ISAT/widgets/polygon.py index 215962c..df8b3b4 100644 --- a/ISAT/widgets/polygon.py +++ b/ISAT/widgets/polygon.py @@ -396,4 +396,98 @@ def redraw(self): for point in self.points[1:]: line_path.lineTo(point) - self.setPath(line_path) \ No newline at end of file + self.setPath(line_path) + + +class RectVertex(QtWidgets.QGraphicsPathItem): + def __init__(self, rect, color, nohover_size=2): + super(RectVertex, self).__init__() + self.rect = rect + self.color = color + self.color.setAlpha(255) + self.nohover_size = nohover_size + self.hover_size = self.nohover_size + 2 + self.line_width = 0 + + self.nohover = QtGui.QPainterPath() + self.nohover.addEllipse(QtCore.QRectF(-self.nohover_size//2, -self.nohover_size//2, self.nohover_size, self.nohover_size)) + self.hover = QtGui.QPainterPath() + self.hover.addRect(QtCore.QRectF(-self.nohover_size//2, -self.nohover_size//2, self.nohover_size, self.nohover_size)) + + self.setPath(self.nohover) + self.setBrush(self.color) + self.setPen(QtGui.QPen(self.color, self.line_width)) + self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemIsSelectable, False) + self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemIsMovable, True) + self.setFlag(QtWidgets.QGraphicsItem.GraphicsItemFlag.ItemSendsGeometryChanges, True) + self.setAcceptHoverEvents(True) + self.setZValue(1e5) + + def itemChange(self, change: 'QtWidgets.QGraphicsItem.GraphicsItemChange', value: typing.Any): + if change == QtWidgets.QGraphicsItem.GraphicsItemChange.ItemSelectedHasChanged: + self.scene().mainwindow.actionDelete.setEnabled(self.isSelected()) + if self.isSelected(): + selected_color = QtGui.QColor('#00A0FF') + self.setBrush(selected_color) + else: + self.setBrush(self.color) + + if change == QtWidgets.QGraphicsItem.GraphicsItemChange.ItemPositionChange and self.isEnabled(): + # 限制顶点移动到图外 + if value.x() < 0: + value.setX(0) + if value.x() > self.scene().width()-1: + value.setX(self.scene().width()-1) + if value.y() < 0: + value.setY(0) + if value.y() > self.scene().height()-1: + value.setY(self.scene().height()-1) + index = self.rect.vertexs.index(self) + self.rect.movePoint(index, value) + + return super(RectVertex, self).itemChange(change, value) + + +class Rect(QtWidgets.QGraphicsRectItem): + def __init__(self): + super().__init__(parent=None) + self.line_width = 1 + self.points = [] + self.vertexs = [] + self.color = QtGui.QColor('#ff0000') + + def addPoint(self, point): + self.points.append(point) + vertex = RectVertex(self, self.color, self.scene().mainwindow.cfg['software']['vertex_size'] * 2) + # 添加路径点 + self.scene().addItem(vertex) + self.vertexs.append(vertex) + vertex.setPos(point) + + def movePoint(self, index, point): + if not 0 <= index < len(self.points): + return + self.points[index] = self.mapFromScene(point) + self.redraw() + + def removePoint(self, index): + if not self.points: + return + self.points.pop(index) + vertex = self.vertexs.pop(index) + self.scene().removeItem(vertex) + del vertex + self.redraw() + + def delete(self): + self.points.clear() + while self.vertexs: + vertex = self.vertexs.pop() + self.scene().removeItem(vertex) + del vertex + + def redraw(self): + if len(self.points) < 2: + return + + self.setRect(QtCore.QRectF(self.points[0], self.points[-1])) diff --git "a/icons/\345\260\217\347\237\251\345\275\242_rectangle-small.svg" "b/icons/\345\260\217\347\237\251\345\275\242_rectangle-small.svg" new file mode 100644 index 0000000..fb89fd6 --- /dev/null +++ "b/icons/\345\260\217\347\237\251\345\275\242_rectangle-small.svg" @@ -0,0 +1 @@ + \ No newline at end of file