1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- 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)
|