Created
March 8, 2021 19:37
-
-
Save yokeshrana/e1d940a2dfcaabbe469cbec5a5a63be8 to your computer and use it in GitHub Desktop.
Object detection using OpenCV
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import cv2 | |
import numpy as np | |
path = 'Resources/shapes.png' | |
img = cv2.imread(path) | |
imgContour = img.copy() | |
def stackImages(scale, imgArray): | |
rows = len(imgArray) | |
cols = len(imgArray[0]) | |
rowsAvailable = isinstance(imgArray[0], list) | |
width = imgArray[0][0].shape[1] | |
height = imgArray[0][0].shape[0] | |
if rowsAvailable: | |
for x in range(0, rows): | |
for y in range(0, cols): | |
if imgArray[x][y].shape[:2] == imgArray[0][0].shape[:2]: | |
imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale) | |
else: | |
imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), | |
None, scale, scale) | |
if len(imgArray[x][y].shape) == 2: imgArray[x][y] = cv2.cvtColor(imgArray[x][y], cv2.COLOR_GRAY2BGR) | |
imageBlank = np.zeros((height, width, 3), np.uint8) | |
hor = [imageBlank] * rows | |
hor_con = [imageBlank] * rows | |
for x in range(0, rows): | |
hor[x] = np.hstack(imgArray[x]) | |
ver = np.vstack(hor) | |
else: | |
for x in range(0, rows): | |
if imgArray[x].shape[:2] == imgArray[0].shape[:2]: | |
imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale) | |
else: | |
imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None, scale, | |
scale) | |
if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR) | |
hor = np.hstack(imgArray) | |
ver = hor | |
return ver | |
def getContours(img): | |
contours,hierarchy = cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2:] | |
for cnt in contours: | |
area = cv2.contourArea(cnt) | |
print(area) | |
cv2.drawContours(imgContour,cnt,-1,(255,0,0),3) | |
if area > 500: | |
cv2.drawContours(imgContour,cnt,-1,(255,0,0),3) | |
peri = cv2.arcLength(cnt,True) | |
print(peri) | |
approx = cv2.approxPolyDP(cnt,0.02*peri,True) | |
print(len(approx)) # 3 is triangle 4 can be square /rectnage anything >4 is circle | |
objCor = len(approx) | |
# Now we will create a bounding box around our detected object | |
x,y,w,h = cv2.boundingRect(approx) | |
# Now clasisifying the object | |
objectType="" | |
if objCor == 3:objectType="Triangle" | |
elif objCor == 4: | |
aspRatio = w/float(h) | |
if aspRatio > 0.95 and aspRatio <1.05 : objectType = "Sqaure" | |
else:objectType="Rectangle" | |
elif objCor>4:objectType="Circles" | |
cv2.rectangle(imgContour, (x, y), (x + w, y + h), (0, 255, 0), 2) # this will draw a rectannge over the detected shape | |
cv2.putText(imgContour,objectType, | |
(x+(w//2)-10,y+(h//2)-10), | |
cv2.FONT_HERSHEY_PLAIN, | |
0.6, | |
(0,0,0),2) | |
## First we will convert our image to gray scale and then we will determine the edges | |
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) | |
imgBlur = cv2.GaussianBlur(imgGray,(7,7),1) | |
imgCanny = cv2.Canny(imgBlur,50,50) #Used to detect images | |
#cv2.imshow("Original",img) | |
#cv2.imshow("Gray",imgGray) | |
#cv2.imshow("Blur",imgBlur) | |
getContours(imgCanny) | |
imgBlank = np.zeros_like(img) | |
imgStack = stackImages(0.6,([img,imgGray,imgBlur], | |
[imgCanny,imgContour,imgBlank])) | |
cv2.imshow("Stack",imgStack) | |
cv2.waitKey(0) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment