提交 3c6d5512 编写于 作者: qq_25193841's avatar qq_25193841

Support multipoint labeling

Support multipoint labeling
上级 70ea536a
...@@ -379,7 +379,7 @@ class MainWindow(QMainWindow): ...@@ -379,7 +379,7 @@ class MainWindow(QMainWindow):
'w', 'objects', getStr('crtBoxDetail'), enabled=False) 'w', 'objects', getStr('crtBoxDetail'), enabled=False)
delete = action(getStr('delBox'), self.deleteSelectedShape, delete = action(getStr('delBox'), self.deleteSelectedShape,
'Alt+X', 'delete', getStr('delBoxDetail'), enabled=False) 'backspace', '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'),
...@@ -1931,6 +1931,38 @@ class MainWindow(QMainWindow): ...@@ -1931,6 +1931,38 @@ class MainWindow(QMainWindow):
owidth += itemwidget.width() owidth += itemwidget.width()
self.iconlist.setMinimumWidth(owidth + 50) self.iconlist.setMinimumWidth(owidth + 50)
def gen_quad_from_poly(self, poly):
"""
Generate min area quad from poly.
"""
point_num = poly.shape[0]
min_area_quad = np.zeros((4, 2), dtype=np.float32)
rect = cv2.minAreaRect(poly.astype(
np.int32)) # (center (x,y), (width, height), angle of rotation)
box = np.array(cv2.boxPoints(rect))
first_point_idx = 0
min_dist = 1e4
for i in range(4):
dist = np.linalg.norm(box[(i + 0) % 4] - poly[0]) + \
np.linalg.norm(box[(i + 1) % 4] - poly[point_num // 2 - 1]) + \
np.linalg.norm(box[(i + 2) % 4] - poly[point_num // 2]) + \
np.linalg.norm(box[(i + 3) % 4] - poly[-1])
if dist < min_dist:
min_dist = dist
first_point_idx = i
for i in range(4):
min_area_quad[i] = box[(first_point_idx + i) % 4]
bbox_new = min_area_quad.tolist()
bbox = []
for box in bbox_new:
box = list(map(int, box))
bbox.append(box)
return bbox
def getImglabelidx(self, filePath): def getImglabelidx(self, filePath):
if platform.system() == 'Windows': if platform.system() == 'Windows':
spliter = '\\' spliter = '\\'
...@@ -1965,7 +1997,11 @@ class MainWindow(QMainWindow): ...@@ -1965,7 +1997,11 @@ class MainWindow(QMainWindow):
rec_flag = 0 rec_flag = 0
for shape in self.canvas.shapes: for shape in self.canvas.shapes:
box = [[int(p.x()), int(p.y())] for p in shape.points] box = [[int(p.x()), int(p.y())] for p in shape.points]
if len(box) > 4:
box = self.gen_quad_from_poly(np.array(box))
assert len(box) == 4 assert len(box) == 4
img_crop = get_rotate_crop_image(img, np.array(box, np.float32)) img_crop = get_rotate_crop_image(img, np.array(box, np.float32))
if img_crop is None: if img_crop is None:
msg = 'Can not recognise the detection box in ' + self.filePath + '. Please change manually' msg = 'Can not recognise the detection box in ' + self.filePath + '. Please change manually'
...@@ -2014,6 +2050,8 @@ class MainWindow(QMainWindow): ...@@ -2014,6 +2050,8 @@ class MainWindow(QMainWindow):
img = cv2.imread(self.filePath) img = cv2.imread(self.filePath)
for shape in self.canvas.selectedShapes: for shape in self.canvas.selectedShapes:
box = [[int(p.x()), int(p.y())] for p in shape.points] box = [[int(p.x()), int(p.y())] for p in shape.points]
if len(box) > 4:
box = self.gen_quad_from_poly(np.array(box))
assert len(box) == 4 assert len(box) == 4
img_crop = get_rotate_crop_image(img, np.array(box, np.float32)) img_crop = get_rotate_crop_image(img, np.array(box, np.float32))
if img_crop is None: if img_crop is None:
......
...@@ -159,7 +159,7 @@ python PPOCRLabel.py --kie True # [KIE mode] for [detection + recognition + keyw ...@@ -159,7 +159,7 @@ python PPOCRLabel.py --kie True # [KIE mode] for [detection + recognition + keyw
| Ctrl + R | Re-recognize the selected box | | Ctrl + R | Re-recognize the selected box |
| Ctrl + C | Copy and paste the selected box | | Ctrl + C | Copy and paste the selected box |
| Ctrl + Left Mouse Button | Multi select the label box | | Ctrl + Left Mouse Button | Multi select the label box |
| Alt + X | Delete the selected box | | Backspace | Delete the selected box |
| Ctrl + V | Check image | | Ctrl + V | Check image |
| Ctrl + Shift + d | Delete image | | Ctrl + Shift + d | Delete image |
| D | Next image | | D | Next image |
......
...@@ -148,7 +148,7 @@ python PPOCRLabel.py --lang ch --kie True # 启动 【KIE 模式】,用于打 ...@@ -148,7 +148,7 @@ python PPOCRLabel.py --lang ch --kie True # 启动 【KIE 模式】,用于打
| Ctrl + R | 重新识别所选标记 | | Ctrl + R | 重新识别所选标记 |
| Ctrl + C | 复制并粘贴选中的标记框 | | Ctrl + C | 复制并粘贴选中的标记框 |
| Ctrl + 鼠标左键 | 多选标记框 | | Ctrl + 鼠标左键 | 多选标记框 |
| Alt + X | 删除所选框 | | Backspace | 删除所选框 |
| Ctrl + V | 确认本张图片标记 | | Ctrl + V | 确认本张图片标记 |
| Ctrl + Shift + d | 删除本张图片 | | Ctrl + Shift + d | 删除本张图片 |
| D | 下一张图片 | | D | 下一张图片 |
......
...@@ -263,7 +263,7 @@ class Canvas(QWidget): ...@@ -263,7 +263,7 @@ class Canvas(QWidget):
if self.current.isClosed(): if self.current.isClosed():
# print('1111') # print('1111')
self.finalise() self.finalise()
elif self.drawSquare: # 增加 elif self.drawSquare:
assert len(self.current.points) == 1 assert len(self.current.points) == 1
self.current.points = self.line.points self.current.points = self.line.points
self.finalise() self.finalise()
......
...@@ -57,6 +57,7 @@ class Shape(object): ...@@ -57,6 +57,7 @@ class Shape(object):
self.locked = False self.locked = False
self.direction = 0 self.direction = 0
self.center = None self.center = None
self.epsilon = 5 # same as canvas
self._highlightIndex = None self._highlightIndex = None
self._highlightMode = self.NEAR_VERTEX self._highlightMode = self.NEAR_VERTEX
self._highlightSettings = { self._highlightSettings = {
...@@ -98,11 +99,14 @@ class Shape(object): ...@@ -98,11 +99,14 @@ class Shape(object):
return False return False
def addPoint(self, point): def addPoint(self, point):
if self.reachMaxPoints(): if self.reachMaxPoints() and self.closeEnough(self.points[0], point):
self.close() self.close()
else: else:
self.points.append(point) self.points.append(point)
def closeEnough(self, p1, p2):
return distance(p1 - p2) < self.epsilon
def popPoint(self): def popPoint(self):
if self.points: if self.points:
return self.points.pop() return self.points.pop()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册