Vsevolod Levitan преди 11 месеца
родител
ревизия
722c16f8e6
променени са 1 файла, в които са добавени 80 реда и са изтрити 0 реда
  1. 80 0
      paper/main.py

+ 80 - 0
paper/main.py

@@ -0,0 +1,80 @@
+import cv2
+import numpy as np
+
+cap = cv2.VideoCapture(0)
+
+while True:
+    img = cap.read()[1]
+    orig = img.copy()
+
+    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
+    blur = cv2.GaussianBlur(gray, (5, 5), 0)
+
+    _, thres = cv2.threshold(blur, 200, 255, cv2.THRESH_BINARY)
+
+    cts, _ = cv2.findContours(thres, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
+
+    contour = max(cts, key=cv2.contourArea)
+
+    epsilon = 0.02 * cv2.arcLength(contour, True)
+    approx = cv2.approxPolyDP(contour, epsilon, True)
+
+    if len(approx) == 4:
+        pts = approx.reshape(4, 2)
+
+        rect = np.zeros((4, 2), dtype="float32")
+        s = pts.sum(axis=1)
+        rect[0] = pts[np.argmin(s)]
+        rect[2] = pts[np.argmax(s)]
+
+        diff = np.diff(pts, axis=1)
+        rect[1] = pts[np.argmin(diff)]
+        rect[3] = pts[np.argmax(diff)]
+
+        (tl, tr, br, bl) = rect
+
+        widthA = np.linalg.norm(br - bl)
+        widthB = np.linalg.norm(tr - tl)
+        maxWidth = max(int(widthA), int(widthB))
+
+        heightA = np.linalg.norm(tr - br)
+        heightB = np.linalg.norm(tl - bl)
+        maxHeight = max(int(heightA), int(heightB))
+
+        dst = np.array(
+            [
+                [0, 0],
+                [maxWidth - 1, 0],
+                [maxWidth - 1, maxHeight - 1],
+                [0, maxHeight - 1],
+            ],
+            dtype="float32",
+        )
+
+        M = cv2.getPerspectiveTransform(rect, dst)
+        warped = cv2.warpPerspective(orig, M, (maxWidth, maxHeight))
+
+        cv2.putText(
+            warped,
+            "llpoDaM rapa>|<",
+            (0, 50),
+            cv2.FONT_HERSHEY_SIMPLEX,
+            1,
+            (0, 0, 0),
+            2,
+        )
+
+        M_inv = cv2.getPerspectiveTransform(dst, rect)
+        warped_back = cv2.warpPerspective(warped, M_inv, (orig.shape[1], orig.shape[0]))
+
+        mask = np.zeros_like(gray)
+        cv2.fillConvexPoly(mask, approx, 255)
+
+        masked = cv2.bitwise_and(orig, orig, mask=cv2.bitwise_not(mask))
+        final = cv2.add(masked, warped_back)
+
+        cv2.imshow("img", final)
+        cv2.waitKey(1)
+    else:
+        cv2.imshow("img", orig)
+        cv2.waitKey(1)