0

Please help me with object identification of edge detected image using contours. this is the part of my code using this i can separate some images but difficult in large detailed images. how can i modify this

import numpy as np
import cv2

# load image
img = cv2.imread('res/test6.jpg', 1)

# convert the image to grayscale, blur it, and detect edges
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(gray, 35, 125)
height, width = edged.shape

# find contours of object
ret, thresh = cv2.threshold(edged, 127, 255, 0)
contours = cv2.findContours(thresh, 1, 2)
cnts = contours[1]
for cnt in cnts:
    # find and draw a rectangle around object
    x, y, w, h = cv2.boundingRect(cnt)
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

    # line parameter
    x1 = x + w / 2
    y1 = y + h
    x2 = x + w / 2
    y2 = height

    # mark pixel depth with arrow
    cv2.arrowedLine(img, (x2, y2), (x1, y1), (255, 0, 0), 4)
    distance = (y2 - y1) * 0.03 + 4

    cv2.putText(img, str(distance) + "m", (x1 + 5, y1 + 50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, 255)

    print height, width

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
import numpy as np
import cv2

# load image
img = cv2.imread('res/test6.jpg', 1)

# convert the image to grayscale, blur it, and detect edges
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(gray, 35, 125)
height, width = edged.shape

# find contours of object
ret, thresh = cv2.threshold(edged, 127, 255, 0)
contours = cv2.findContours(thresh, 1, 2)
cnts = contours[1]
for cnt in cnts:
    # find and draw a rectangle around object
    x, y, w, h = cv2.boundingRect(cnt)
    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

    # line parameter
    x1 = x + w / 2
    y1 = y + h
    x2 = x + w / 2
    y2 = height

    # mark pixel depth with arrow
    cv2.arrowedLine(img, (x2, y2), (x1, y1), (255, 0, 0), 4)
    distance = (y2 - y1) * 0.03 + 4

    cv2.putText(img, str(distance) + "m", (x1 + 5, y1 + 50), cv2.FONT_HERSHEY_SIMPLEX, 0.5, 255)

    print height, width

cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

What i want is to limit identify objects. img1 out1

1 Answers1

1

From the given code, I suppose you have identified your objects using contours. Then you have bound those contours with rectangles.

Now go one step further. Find the centroid of the rectangles bounding the contours you've just obtained. Measure the distance from the centroid to the bottom of your image.

for c in cnts:
   ------# compute the center of the contour
   M = cv2.moments(c)
   cX = int(M["m10"] / M["m00"])
   cY = int(M["m01"] / M["m00"])

   ------# draw the contour and center of the shape on the image
   cv2.drawContours(image, [c], -1, (0, 255, 0), 2)
   cv2.circle(image, (cX, cY), 7, (255, 255, 255), -1)

   ------# show the image
   cv2.imshow("Image", image)

I came across THIS POST which helped me with the answer.

To get a better idea of what Image Moments are, I would recommend THIS ARTICLE from Wikipedia.

Jeru Luke
  • 20,118
  • 13
  • 80
  • 87
  • Thank you for your help but i got this error File "D:/FYP/MyProject/Distance/MeasureDistance.py", line 46, in cX = int(M["m10"] / M["m00"]) ZeroDivisionError: float division by zero – Hasintha Samith Randika Jan 06 '17 at 02:49
  • 1
    Refer [THIS POST](http://stackoverflow.com/questions/35247211/zerodivisionerror-python) – Jeru Luke Jan 06 '17 at 05:16