|
|
@@ -12,14 +12,10 @@
|
|
|
# See the License for the specific language governing permissions and
|
|
|
# limitations under the License.
|
|
|
|
|
|
-import math
|
|
|
import random
|
|
|
import numpy as np
|
|
|
-import cv2
|
|
|
-import PIL
|
|
|
-from PIL import Image, ImageDraw, ImageFont
|
|
|
+from PIL import Image, ImageDraw
|
|
|
|
|
|
-from ...utils.fonts import PINGFANG_FONT_FILE_PATH
|
|
|
from .base import CVResult
|
|
|
|
|
|
|
|
|
@@ -30,30 +26,6 @@ class FormulaRecResult(CVResult):
|
|
|
rec_formula_str = ", ".join([str(formula) for formula in self["rec_formula"]])
|
|
|
return str(self).replace("\\\\", "\\")
|
|
|
|
|
|
- def get_minarea_rect(self, points):
|
|
|
- bounding_box = cv2.minAreaRect(points)
|
|
|
- points = sorted(list(cv2.boxPoints(bounding_box)), key=lambda x: x[0])
|
|
|
-
|
|
|
- index_a, index_b, index_c, index_d = 0, 1, 2, 3
|
|
|
- if points[1][1] > points[0][1]:
|
|
|
- index_a = 0
|
|
|
- index_d = 1
|
|
|
- else:
|
|
|
- index_a = 1
|
|
|
- index_d = 0
|
|
|
- if points[3][1] > points[2][1]:
|
|
|
- index_b = 2
|
|
|
- index_c = 3
|
|
|
- else:
|
|
|
- index_b = 3
|
|
|
- index_c = 2
|
|
|
-
|
|
|
- box = np.array(
|
|
|
- [points[index_a], points[index_b], points[index_c], points[index_d]]
|
|
|
- ).astype(np.int32)
|
|
|
-
|
|
|
- return box
|
|
|
-
|
|
|
def _to_img(
|
|
|
self,
|
|
|
):
|
|
|
@@ -64,10 +36,9 @@ class FormulaRecResult(CVResult):
|
|
|
if self._HARD_FLAG:
|
|
|
image_np = np.array(image)
|
|
|
image = Image.fromarray(image_np[:, :, ::-1])
|
|
|
- h, w = image.height, image.width
|
|
|
- img_left = image.copy()
|
|
|
+ img = image.copy()
|
|
|
random.seed(0)
|
|
|
- draw_left = ImageDraw.Draw(img_left)
|
|
|
+ draw_img = ImageDraw.Draw(img)
|
|
|
if formula is None or len(formula) != len(boxes):
|
|
|
formula = [None] * len(boxes)
|
|
|
for idx, (box, txt) in enumerate(zip(boxes, formula)):
|
|
|
@@ -78,19 +49,11 @@ class FormulaRecResult(CVResult):
|
|
|
random.randint(0, 255),
|
|
|
)
|
|
|
box = np.array(box)
|
|
|
-
|
|
|
- if len(box) > 4:
|
|
|
- pts = [(x, y) for x, y in box.tolist()]
|
|
|
- draw_left.polygon(pts, outline=color, width=8)
|
|
|
- box = self.get_minarea_rect(box)
|
|
|
- height = int(0.5 * (max(box[:, 1]) - min(box[:, 1])))
|
|
|
- box[:2, 1] = np.mean(box[:, 1])
|
|
|
- box[2:, 1] = np.mean(box[:, 1]) + min(20, height)
|
|
|
- draw_left.polygon(box, fill=color)
|
|
|
+ pts = [(x, y) for x, y in box.tolist()]
|
|
|
+ draw_img.polygon(pts, outline=color, width=8)
|
|
|
+ draw_img.polygon(box, fill=color)
|
|
|
except:
|
|
|
continue
|
|
|
|
|
|
- img_left = Image.blend(image, img_left, 0.5)
|
|
|
- img_show = Image.new("RGB", (w, h), (255, 255, 255))
|
|
|
- img_show.paste(img_left, (0, 0, w, h))
|
|
|
- return img_show
|
|
|
+ img = Image.blend(image, img, 0.5)
|
|
|
+ return img
|