@ -257,6 +257,9 @@ class MainWindow(QMainWindow, WindowMixin):
self . imgsliderDock . setObjectName ( getStr ( ' IR ' ) )
self . imgsliderDock . setObjectName ( getStr ( ' IR ' ) )
self . imgsliderDock . setWidget ( self . imgsplider )
self . imgsliderDock . setWidget ( self . imgsplider )
self . imgsliderDock . setFeatures ( QDockWidget . DockWidgetFloatable )
self . imgsliderDock . setFeatures ( QDockWidget . DockWidgetFloatable )
# op = QGraphicsOpacityEffect()
# op.setOpacity(0.2)
# self.imgsliderDock.setGraphicsEffect(op)
self . imgsliderDock . setAttribute ( Qt . WA_TranslucentBackground )
self . imgsliderDock . setAttribute ( Qt . WA_TranslucentBackground )
self . addDockWidget ( Qt . RightDockWidgetArea , self . imgsliderDock )
self . addDockWidget ( Qt . RightDockWidgetArea , self . imgsliderDock )
@ -274,6 +277,7 @@ class MainWindow(QMainWindow, WindowMixin):
self . preButton . setIconSize ( QSize ( 40 , 100 ) )
self . preButton . setIconSize ( QSize ( 40 , 100 ) )
self . preButton . clicked . connect ( self . openPrevImg )
self . preButton . clicked . connect ( self . openPrevImg )
self . preButton . setStyleSheet ( ' border: none; ' )
self . preButton . setStyleSheet ( ' border: none; ' )
self . preButton . setShortcut ( ' a ' )
self . iconlist = QListWidget ( )
self . iconlist = QListWidget ( )
self . iconlist . setViewMode ( QListView . IconMode )
self . iconlist . setViewMode ( QListView . IconMode )
self . iconlist . setFlow ( QListView . TopToBottom )
self . iconlist . setFlow ( QListView . TopToBottom )
@ -289,6 +293,7 @@ class MainWindow(QMainWindow, WindowMixin):
self . nextButton . setIconSize ( QSize ( 40 , 100 ) )
self . nextButton . setIconSize ( QSize ( 40 , 100 ) )
self . nextButton . setStyleSheet ( ' border: none; ' )
self . nextButton . setStyleSheet ( ' border: none; ' )
self . nextButton . clicked . connect ( self . openNextImg )
self . nextButton . clicked . connect ( self . openNextImg )
self . nextButton . setShortcut ( ' d ' )
hlayout . addWidget ( self . preButton )
hlayout . addWidget ( self . preButton )
hlayout . addWidget ( self . iconlist )
hlayout . addWidget ( self . iconlist )
@ -299,6 +304,10 @@ class MainWindow(QMainWindow, WindowMixin):
iconListContainer = QWidget ( )
iconListContainer = QWidget ( )
iconListContainer . setLayout ( hlayout )
iconListContainer . setLayout ( hlayout )
iconListContainer . setFixedHeight ( 100 )
iconListContainer . setFixedHeight ( 100 )
# iconListContainer.setFixedWidth(530)
# op = QGraphicsOpacityEffect()
# op.setOpacity(0.5)
# iconListContainer.setGraphicsEffect(op)
########### Canvas ###########
########### Canvas ###########
self . canvas = Canvas ( parent = self )
self . canvas = Canvas ( parent = self )
@ -359,11 +368,6 @@ class MainWindow(QMainWindow, WindowMixin):
opendir = action ( getStr ( ' openDir ' ) , self . openDirDialog ,
opendir = action ( getStr ( ' openDir ' ) , self . openDirDialog ,
' Ctrl+u ' , ' open ' , getStr ( ' openDir ' ) )
' Ctrl+u ' , ' open ' , getStr ( ' openDir ' ) )
openNextImg = action ( getStr ( ' nextImg ' ) , self . openNextImg ,
' d ' , ' next ' , getStr ( ' nextImgDetail ' ) )
openPrevImg = action ( getStr ( ' prevImg ' ) , self . openPrevImg ,
' a ' , ' prev ' , getStr ( ' prevImgDetail ' ) )
save = action ( getStr ( ' save ' ) , self . saveFile ,
save = action ( getStr ( ' save ' ) , self . saveFile ,
' Ctrl+V ' , ' verify ' , getStr ( ' saveDetail ' ) , enabled = False )
' Ctrl+V ' , ' verify ' , getStr ( ' saveDetail ' ) , enabled = False )
@ -371,7 +375,7 @@ class MainWindow(QMainWindow, WindowMixin):
alcm = action ( getStr ( ' choosemodel ' ) , self . autolcm ,
alcm = action ( getStr ( ' choosemodel ' ) , self . autolcm ,
' Ctrl+M ' , ' next ' , getStr ( ' tipchoosemodel ' ) )
' Ctrl+M ' , ' next ' , getStr ( ' tipchoosemodel ' ) )
deleteImg = action ( getStr ( ' deleteImg ' ) , self . deleteImg , ' Ctrl+ D' , ' close ' , getStr ( ' deleteImgDetail ' ) ,
deleteImg = action ( getStr ( ' deleteImg ' ) , self . deleteImg , ' Ctrl+ Shift+ D' , ' close ' , getStr ( ' deleteImgDetail ' ) ,
enabled = True )
enabled = True )
resetAll = action ( getStr ( ' resetAll ' ) , self . resetAll , None , ' resetall ' , getStr ( ' resetAllDetail ' ) )
resetAll = action ( getStr ( ' resetAll ' ) , self . resetAll , None , ' resetall ' , getStr ( ' resetAllDetail ' ) )
@ -388,7 +392,7 @@ class MainWindow(QMainWindow, WindowMixin):
' w ' , ' new ' , getStr ( ' crtBoxDetail ' ) , enabled = False )
' w ' , ' new ' , getStr ( ' crtBoxDetail ' ) , enabled = False )
delete = action ( getStr ( ' delBox ' ) , self . deleteSelectedShape ,
delete = action ( getStr ( ' delBox ' ) , self . deleteSelectedShape ,
' Delet e' , ' delete ' , getStr ( ' delBoxDetail ' ) , enabled = False )
' backspac e' , ' delete ' , getStr ( ' delBoxDetail ' ) , enabled = False )
copy = action ( getStr ( ' dupBox ' ) , self . copySelectedShape ,
copy = action ( getStr ( ' dupBox ' ) , self . copySelectedShape ,
' Ctrl+C ' , ' copy ' , getStr ( ' dupBoxDetail ' ) ,
' Ctrl+C ' , ' copy ' , getStr ( ' dupBoxDetail ' ) ,
enabled = False )
enabled = False )
@ -446,8 +450,11 @@ class MainWindow(QMainWindow, WindowMixin):
reRec = action ( getStr ( ' reRecognition ' ) , self . reRecognition ,
reRec = action ( getStr ( ' reRecognition ' ) , self . reRecognition ,
' Ctrl+Shift+R ' , ' reRec ' , getStr ( ' reRecognition ' ) , enabled = False )
' Ctrl+Shift+R ' , ' reRec ' , getStr ( ' reRecognition ' ) , enabled = False )
singleRere = action ( getStr ( ' singleRe ' ) , self . singleRerecognition ,
' Ctrl+R ' , ' reRec ' , getStr ( ' singleRe ' ) , enabled = False )
createpoly = action ( getStr ( ' creatPolygon ' ) , self . createPolygon ,
createpoly = action ( getStr ( ' creatPolygon ' ) , self . createPolygon ,
' p ' , ' new ' , ' Creat Polygon ' , enabled = True )
' q ' , ' new ' , ' Creat Polygon ' , enabled = True )
saveRec = action ( getStr ( ' saveRec ' ) , self . saveRecResult ,
saveRec = action ( getStr ( ' saveRec ' ) , self . saveRecResult ,
' ' , ' save ' , getStr ( ' saveRec ' ) , enabled = False )
' ' , ' save ' , getStr ( ' saveRec ' ) , enabled = False )
@ -491,6 +498,10 @@ class MainWindow(QMainWindow, WindowMixin):
icon = ' color ' , tip = getStr ( ' shapeFillColorDetail ' ) ,
icon = ' color ' , tip = getStr ( ' shapeFillColorDetail ' ) ,
enabled = False )
enabled = False )
# labels = self.dock.toggleViewAction()
# labels.setText(getStr('showHide'))
# labels.setShortcut('Ctrl+Shift+L')
# Label list context menu.
# Label list context menu.
labelMenu = QMenu ( )
labelMenu = QMenu ( )
addActions ( labelMenu , ( edit , delete ) )
addActions ( labelMenu , ( edit , delete ) )
@ -501,7 +512,6 @@ class MainWindow(QMainWindow, WindowMixin):
# Draw squares/rectangles
# Draw squares/rectangles
self . drawSquaresOption = QAction ( getStr ( ' drawSquares ' ) , self )
self . drawSquaresOption = QAction ( getStr ( ' drawSquares ' ) , self )
self . drawSquaresOption . setShortcut ( ' Ctrl+Shift+R ' )
self . drawSquaresOption . setCheckable ( True )
self . drawSquaresOption . setCheckable ( True )
self . drawSquaresOption . setChecked ( settings . get ( SETTING_DRAW_SQUARE , False ) )
self . drawSquaresOption . setChecked ( settings . get ( SETTING_DRAW_SQUARE , False ) )
self . drawSquaresOption . triggered . connect ( self . toogleDrawSquare )
self . drawSquaresOption . triggered . connect ( self . toogleDrawSquare )
@ -509,7 +519,7 @@ class MainWindow(QMainWindow, WindowMixin):
# Store actions for further handling.
# Store actions for further handling.
self . actions = struct ( save = save , open = open , resetAll = resetAll , deleteImg = deleteImg ,
self . actions = struct ( save = save , open = open , resetAll = resetAll , deleteImg = deleteImg ,
lineColor = color1 , create = create , delete = delete , edit = edit , copy = copy ,
lineColor = color1 , create = create , delete = delete , edit = edit , copy = copy ,
saveRec = saveRec ,
saveRec = saveRec , singleRere = singleRere , AutoRec = AutoRec , reRec = reRec ,
createMode = createMode , editMode = editMode ,
createMode = createMode , editMode = editMode ,
shapeLineColor = shapeLineColor , shapeFillColor = shapeFillColor ,
shapeLineColor = shapeLineColor , shapeFillColor = shapeFillColor ,
zoom = zoom , zoomIn = zoomIn , zoomOut = zoomOut , zoomOrg = zoomOrg ,
zoom = zoom , zoomIn = zoomIn , zoomOut = zoomOut , zoomOrg = zoomOrg ,
@ -518,9 +528,9 @@ class MainWindow(QMainWindow, WindowMixin):
fileMenuActions = (
fileMenuActions = (
open , opendir , saveLabel , resetAll , quit ) ,
open , opendir , saveLabel , resetAll , quit ) ,
beginner = ( ) , advanced = ( ) ,
beginner = ( ) , advanced = ( ) ,
editMenu = ( createpoly , edit , copy , delete ,
editMenu = ( createpoly , edit , copy , delete , singleRere ,
None , color1 , self . drawSquaresOption ) ,
None , color1 , self . drawSquaresOption ) ,
beginnerContext = ( create , edit , copy , delete ),
beginnerContext = ( create , edit , copy , delete , singleRere ),
advancedContext = ( createMode , editMode , edit , copy ,
advancedContext = ( createMode , editMode , edit , copy ,
delete , shapeLineColor , shapeFillColor ) ,
delete , shapeLineColor , shapeFillColor ) ,
onLoadActive = (
onLoadActive = (
@ -562,7 +572,7 @@ class MainWindow(QMainWindow, WindowMixin):
zoomIn , zoomOut , zoomOrg , None ,
zoomIn , zoomOut , zoomOrg , None ,
fitWindow , fitWidth ) )
fitWindow , fitWidth ) )
addActions ( self . menus . autolabel , ( alcm, None , help ) ) #
addActions ( self . menus . autolabel , ( AutoRec, reRec , alcm, None , help ) ) #
self . menus . file . aboutToShow . connect ( self . updateFileMenu )
self . menus . file . aboutToShow . connect ( self . updateFileMenu )
@ -572,6 +582,17 @@ class MainWindow(QMainWindow, WindowMixin):
action ( ' &Copy here ' , self . copyShape ) ,
action ( ' &Copy here ' , self . copyShape ) ,
action ( ' &Move here ' , self . moveShape ) ) )
action ( ' &Move here ' , self . moveShape ) ) )
# self.tools = self.toolbar('Tools')
# self.actions.beginner = (
# open, opendir, openNextImg, openPrevImg, verify, save, None, create, copy, delete, None,
# zoomIn, zoom, zoomOut, fitWindow, fitWidth)
#
# self.actions.advanced = (
# open, opendir, openNextImg, openPrevImg, save, None,
# createMode, editMode, None,
# hideAll, showAll)
self . statusBar ( ) . showMessage ( ' %s started. ' % __appname__ )
self . statusBar ( ) . showMessage ( ' %s started. ' % __appname__ )
self . statusBar ( ) . show ( )
self . statusBar ( ) . show ( )
@ -919,6 +940,7 @@ class MainWindow(QMainWindow, WindowMixin):
self . actions . edit . setEnabled ( selected )
self . actions . edit . setEnabled ( selected )
self . actions . shapeLineColor . setEnabled ( selected )
self . actions . shapeLineColor . setEnabled ( selected )
self . actions . shapeFillColor . setEnabled ( selected )
self . actions . shapeFillColor . setEnabled ( selected )
self . actions . singleRere . setEnabled ( selected )
def addLabel ( self , shape ) :
def addLabel ( self , shape ) :
shape . paintLabel = self . displayLabelOption . isChecked ( )
shape . paintLabel = self . displayLabelOption . isChecked ( )
@ -988,6 +1010,19 @@ class MainWindow(QMainWindow, WindowMixin):
self . updateComboBox ( )
self . updateComboBox ( )
self . canvas . loadShapes ( s )
self . canvas . loadShapes ( s )
def singleLabel ( self , shape ) :
if shape is None :
# print('rm empty label')
return
item = self . shapesToItems [ shape ]
item . setText ( shape . label )
self . updateComboBox ( )
# ADD:
item = self . shapesToItemsbox [ shape ]
item . setText ( str ( [ ( int ( p . x ( ) ) , int ( p . y ( ) ) ) for p in shape . points ] ) )
self . updateComboBox ( )
def updateComboBox ( self ) :
def updateComboBox ( self ) :
# Get the unique labels and add them to the Combobox.
# Get the unique labels and add them to the Combobox.
itemsTextList = [ str ( self . labelList . item ( i ) . text ( ) ) for i in range ( self . labelList . count ( ) ) ]
itemsTextList = [ str ( self . labelList . item ( i ) . text ( ) ) for i in range ( self . labelList . count ( ) ) ]
@ -1441,6 +1476,8 @@ class MainWindow(QMainWindow, WindowMixin):
self . haveAutoReced = False
self . haveAutoReced = False
self . AutoRecognition . setEnabled ( True )
self . AutoRecognition . setEnabled ( True )
self . reRecogButton . setEnabled ( True )
self . reRecogButton . setEnabled ( True )
self . actions . AutoRec . setEnabled ( True )
self . actions . reRec . setEnabled ( True )
self . actions . saveLabel . setEnabled ( True )
self . actions . saveLabel . setEnabled ( True )
@ -1755,6 +1792,7 @@ class MainWindow(QMainWindow, WindowMixin):
self . loadFile ( self . filePath ) # ADD
self . loadFile ( self . filePath ) # ADD
self . haveAutoReced = True
self . haveAutoReced = True
self . AutoRecognition . setEnabled ( False )
self . AutoRecognition . setEnabled ( False )
self . actions . AutoRec . setEnabled ( False )
self . setDirty ( )
self . setDirty ( )
self . saveCacheLabel ( )
self . saveCacheLabel ( )
@ -1794,6 +1832,27 @@ class MainWindow(QMainWindow, WindowMixin):
else :
else :
QMessageBox . information ( self , " Information " , " Draw a box! " )
QMessageBox . information ( self , " Information " , " Draw a box! " )
def singleRerecognition ( self ) :
img = cv2 . imread ( self . filePath )
shape = self . canvas . selectedShape
box = [ [ int ( p . x ( ) ) , int ( p . y ( ) ) ] for p in shape . points ]
assert len ( box ) == 4
img_crop = get_rotate_crop_image ( img , np . array ( box , np . float32 ) )
if img_crop is None :
msg = ' Can not recognise the detection box in ' + self . filePath + ' . Please change manually '
QMessageBox . information ( self , " Information " , msg )
return
result = self . ocr . ocr ( img_crop , cls = True , det = False )
if result [ 0 ] [ 0 ] is not ' ' :
result . insert ( 0 , box )
print ( ' result in reRec is ' , result )
if result [ 1 ] [ 0 ] == shape . label :
print ( ' label no change ' )
else :
shape . label = result [ 1 ] [ 0 ]
self . singleLabel ( shape )
self . setDirty ( )
print ( box )
def autolcm ( self ) :
def autolcm ( self ) :
vbox = QVBoxLayout ( )
vbox = QVBoxLayout ( )
@ -1825,6 +1884,7 @@ class MainWindow(QMainWindow, WindowMixin):
self . dialog . exec_ ( )
self . dialog . exec_ ( )
if self . filePath :
if self . filePath :
self . AutoRecognition . setEnabled ( True )
self . AutoRecognition . setEnabled ( True )
self . actions . AutoRec . setEnabled ( True )
def modelChoose ( self ) :
def modelChoose ( self ) :