2016年3月10日 星期四

opencv tutorial : pyimagesearch



example :1  shape_detector


ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
        help="path to the input image")
args = vars(ap.parse_args())

# load the image and resize it to a smaller factor so that
# the shapes can be approximated better
image = cv2.imread(args["image"])
resized = imutils.resize(image, width=300)
ratio = image.shape[0] / float(resized.shape[0])

# convert the resized image to grayscale, blur it slightly,
# and threshold it
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY)[1]

取出 thresh 的影像....

cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
        cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]
sd = ShapeDetector()   

取出cnts ...利用  findContours.....

然後取cnts[0]



# loop over the contours
for c in cnts:
        # compute the center of the contour, then detect the name of the
        # shape using only the contour
        M = cv2.moments(c)
        cX = int((M["m10"] / M["m00"]) * ratio)
        cY = int((M["m01"] / M["m00"]) * ratio)
        shape = sd.detect(c)

        # multiply the contour (x, y)-coordinates by the resize ratio,
        # then draw the contours and the name of the shape on the image
        c *= ratio
        cv2.drawContours(image, [c], -1, (0, 255, 0), 2)
        cv2.putText(image, shape, (cX, cY), cv2.FONT_HERSHEY_SIMPLEX,
                0.5, (255, 255, 255), 2)

        # show the output image
        cv2.imshow("Image", image)
        cv2.waitKey(0)


利用
 shape = sd.detect(c)

程式碼如下:  重點是利用approx = cv2.approxPolyDP(c, 0.04 * peri, True)

得到 approx(頂點)....然後  len(approx) 去判斷...3 就是三角形... 

        def detect(self, c):
                # initialize the shape name and approximate the contour
                shape = "unidentified"
                peri = cv2.arcLength(c, True)
                approx = cv2.approxPolyDP(c, 0.04 * peri, True)

                # if the shape is a triangle, it will have 3 vertices
                if len(approx) == 3:
                        shape = "triangle"

                # if the shape has 4 vertices, it is either a square or
                # a rectangle
                elif len(approx) == 4:
                        # compute the bounding box of the contour and use the
                        # bounding box to compute the aspect ratio
                        (x, y, w, h) = cv2.boundingRect(approx)
                        ar = w / float(h)

                        # a square will have an aspect ratio that is approximately
                        # equal to one, otherwise, the shape is a rectangle
                        shape = "square" if ar >= 0.95 and ar <= 1.05 else "rectangle"

                # if the shape is a pentagon, it will have 5 vertices
                elif len(approx) == 5:
                        shape = "pentagon"

                # otherwise, we assume the shape is a circle
                else:
                        shape = "circle"

                # return the name of the shape
                return shape


最後輸入command

python detect_shapes.py --image shapes_and_colors.png




Reference : http://www.pyimagesearch.com/

沒有留言:

張貼留言