Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import cv2
- from collections import deque
- from scipy.spatial import distance as dist
- from imutils import perspective
- import numpy as np
- import argparse
- import imutils
- import math
- import time
- font = cv2.FONT_HERSHEY_SIMPLEX
- def midpoint(ptA, ptB):
- return ((ptA[0] + ptB[0]) * 0.5, (ptA[1] + ptB[1]) * 0.5)
- ap = argparse.ArgumentParser()
- ap.add_argument("-v", "--video", help="path to the (optional) video file")
- args = vars(ap.parse_args())
- sensitivity = 43
- greyLower = np.array([96,0,176-sensitivity])
- greyUpper = np.array([180,sensitivity,255])
- pixelsPerMetric = None
- KNOWN_WIDTH = 19
- if not args.get("video", False):
- camera = cv2.VideoCapture(0)
- else:
- camera = cv2.VideoCapture(args["video"])
- while True:
- (grabbed, frame) = camera.read()
- if args.get("video") and not grabbed:
- break
- frame = imutils.resize(frame, width=600)
- hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
- mask = cv2.inRange(hsv,greyLower, greyUpper)
- mask = cv2.erode(mask, None, iterations=2)
- mask = cv2.dilate(mask, None, iterations=2)
- (_, contours, hierarchy) = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- center = None
- for pic, contour in enumerate(contours):
- if len(contours) > 0:
- contour = max(contours, key =cv2.contourArea)
- x,y,w,h = cv2.boundingRect(contour)
- rect = (x+w, y+h)
- rect = cv2.minAreaRect(contour)
- box = cv2.boxPoints(rect)
- box = np.int0(box)
- box = perspective.order_points(box)
- M = cv2.moments(contour)
- for (x, y) in box:
- M = cv2.rectangle(frame,(int(x),int(y)),(int(x+w), int(y+h)),(0,0,139),2)
- # unpack the ordered bounding box, then compute the midpoint
- # between the top-left and top-right coordinates, followed by
- # the midpoint between bottom-left and bottom-right coordinates
- (tl, tr, br, bl) = box
- (tltrX, tltrY) = midpoint(tl, tr)
- (blbrX, blbrY) = midpoint(bl, br)
- # compute the midpoint between the top-left and top-right points,
- # followed by the midpoint between the top-righ and bottom-right
- (tlblX, tlblY) = midpoint(tl, bl)
- (trbrX, trbrY) = midpoint(tr, br)
- # draw the midpoints on the image
- cv2.circle(M, (int(tltrX), int(tltrY)), 5, (255, 0, 0), -1)
- cv2.circle(M, (int(blbrX), int(blbrY)), 5, (255, 0, 0), -1)
- cv2.circle(M, (int(tlblX), int(tlblY)), 5, (255, 0, 0), -1)
- cv2.circle(M, (int(trbrX), int(trbrY)), 5, (255, 0, 0), -1)
- # draw lines between the midpoints
- cv2.line(M, (int(tltrX), int(tltrY)), (int(blbrX), int(blbrY)),
- (255, 0, 255), 2)
- cv2.line(M, (int(tlblX), int(tlblY)), (int(trbrX), int(trbrY)),
- (255, 0, 255), 2)
- # compute the Euclidean distance between the midpoints
- dA = dist.euclidean((tltrX, tltrY), (blbrX, blbrY))
- dB = dist.euclidean((tlblX, tlblY), (trbrX, trbrY))
- # if the pixels per metric has not been initialized, then
- # compute it as the ratio of pixels to supplied metric
- # (in this case, inches)
- # compute the size of the object
- dimA = dA / KNOWN_WIDTH
- dimB = dB / KNOWN_WIDTH
- if rect >300:
- frame = cv2.rectangle(frame,(int(x),int(y)),(int(x+w), int(y+h)),(0,0,139),2)
- cv2.putText(frame,"MCB",(x,y),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0,0,139))
- # draw the object sizes on the image
- cv2.putText(frame, "{:.1f}cm".format(dimA),
- (int(tltrX - 15), int(tltrY - 10)), cv2.FONT_HERSHEY_SIMPLEX,
- 0.65, (255, 255, 255), 2)
- cv2.putText(frame, "{:.1f}cm".format(dimB),
- (int(trbrX + 10), int(trbrY)), cv2.FONT_HERSHEY_SIMPLEX,
- 0.65, (255, 255, 255), 2)
- cv2.imshow("Frame", frame)
- key = cv2.waitKey(10) & 0xFF
- if key == ord("q"):
- break
- camera.release()
- cv2.destroyAllWindows()
Add Comment
Please, Sign In to add comment