Skip to content

Commit

Permalink
Update model_handler.py (#4665)
Browse files Browse the repository at this point in the history
use the OpenCV contour function to extract contour instead of
scikit-image function. to solve the problem of poor drawing of the
contour see the issue 4660
#4660
  • Loading branch information
waqarsqureshi authored Jan 11, 2023
1 parent 43ed0a2 commit 6b41630
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 12 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
The corresponding arguments are keyword-only now.
(<https://github.com/opencv/cvat/pull/5502>)
- Windows Installation Instructions adjusted to work around <https://github.com/nuclio/nuclio/issues/1821>
- The contour detection function for semantic segmentation (<https://github.com/opencv/cvat/pull/4665>)

### Deprecated
- TDB
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
# SPDX-License-Identifier: MIT

import os

import cv2
import numpy as np
from model_loader import ModelLoader
from shared import to_cvat_mask
from skimage.measure import approximate_polygon, find_contours


class ModelHandler:
Expand All @@ -29,26 +29,24 @@ def infer(self, image, threshold):

for i in range(len(self.labels)):
mask_by_label = np.zeros((width, height), dtype=np.uint8)

mask_by_label = ((mask == float(i))).astype(np.uint8)
mask_by_label = ((mask == float(i)) * 255).astype(np.uint8)
mask_by_label = cv2.resize(mask_by_label,
dsize=(image.width, image.height),
interpolation=cv2.INTER_CUBIC)
cv2.normalize(mask_by_label, mask_by_label, 0, 255, cv2.NORM_MINMAX)
interpolation=cv2.INTER_NEAREST)

contours = find_contours(mask_by_label, 0.8)
contours, _ = cv2.findContours(mask_by_label, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
contour = np.flip(contour, axis=1)
contour = approximate_polygon(contour, tolerance=2.5)

x_min = max(0, int(np.min(contour[:,0])))
x_max = max(0, int(np.max(contour[:,0])))
y_min = max(0, int(np.min(contour[:,1])))
y_max = max(0, int(np.max(contour[:,1])))
if len(contour) < 3:
continue

x_min = max(0, int(np.min(contour[:,:,0])))
x_max = max(0, int(np.max(contour[:,:,0])))
y_min = max(0, int(np.min(contour[:,:,1])))
y_max = max(0, int(np.max(contour[:,:,1])))

cvat_mask = to_cvat_mask((x_min, y_min, x_max, y_max), mask_by_label)

results.append({
Expand Down

0 comments on commit 6b41630

Please sign in to comment.