Question: this simple code I wrote does not work on the picture I uploaded. how can I improve the code? It should detect shapes without detecting

this simple code I wrote does not work on the picture I uploaded. how can I improve the code? It should detect shapes without detecting lines.
import cv2
import numpy as np
import argparse
def angle(pt1, pt2, pt0):
# pt1 ve pt0 arasndaki kenarn x'i (pt1x - pt0x)
dx1= pt1[0]- pt0[0]
# pt1 ve pt0 arasndaki kenarn y'si (pt1y - pt0y)
dy1= pt1[1]- pt0[1]
# pt2 ve pt0 arasndaki kenarn x'i (pt2x - pt0x)
dx2= pt2[0]- pt0[0]
# pt2 ve pt0 arasndaki kenarn y'si (pt2y - pt0y)
dy2= pt2[1]- pt0[1]
return (dx1* dx2+ dy1* dy2)/ np.sqrt((dx1* dx1+ dy1* dy1)*(dx2* dx2+ dy2* dy2))
def main(input_image):
input_path ="C:/Users/burak/Desktop/Shape Recognition & Detection/data/input/"
output_path ="C:/Users/burak/Desktop/Shape Recognition & Detection/data/output"
image = cv2.imread(input_path + input_image)
if image is None:
print("Resim alamad ya da yklenemedi.")
return
# gri
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imwrite(output_path +"\\output_gray.png", gray)
# blurlama
blurred = cv2.GaussianBlur(gray,(5,5),0)
cv2.imwrite(output_path +"\\output_blurred.png", blurred)
# kenar alglama
edged = cv2.Canny(blurred,100,200)
cv2.imwrite(output_path +"\\output_edged.png", edged)
# kontor bulma
contours, _= cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# ekil alglama
for contour in contours:
shape =""
peri = cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour,0.02* peri, True)
if len(approx)==3:
shape = "triangle"
elif len(approx)==4:
max_cosine =0
for j in range(2,5):
cosine = abs(angle(approx[j %4][0], approx[j -2][0], approx[j -1][0]))
max_cosine = max(max_cosine, cosine)
if max_cosine 0.3:
# kare
edges =[]
for i in range(4):
pt1= approx[i][0]
pt2= approx[(i +1)%4][0]
edge_length = np.sqrt((pt1[0]- pt2[0])**2+(pt1[1]- pt2[1])**2)
edges.append(edge_length)
# kenarlar eit mi
if max(edges)- min(edges)10:
shape = "square"
else:
shape = "rectangle"
else:
edges =[]
for i in range(4):
pt1= approx[i][0]
pt2= approx[(i +1)%4][0]
edge_length = np.sqrt((pt1[0]- pt2[0])**2+(pt1[1]- pt2[1])**2)
edges.append(edge_length)
edges = sorted(edges)
if abs(edges[0]- edges[1])50 and abs(edges[2]- edges[3])50:
shape = "parallelogram"
elif abs(edges[0]- edges[1])50 or abs(edges[2]- edges[3])50:
shape = "trapezoid"
elif len(approx)>4:
shape = "circle"
cv2.drawContours(image,[contour],-1,(0,255,0),2)
M = cv2.moments(contour)
cX = int(M["m10"]/ M["m00"])
cY = int(M["m01"]/ M["m00"])
cv2.putText(image, shape, (cX -50, cY), cv2.FONT_HERSHEY_SIMPLEX, 0.5,(255,0,0),1)
# output
cv2.imwrite(output_path +"\\output_shapes.png", image)
cv2.imshow("Shapes", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__=="__main__":
parser = argparse.ArgumentParser(description="Shape detection in an image.")
parser.add_argument("input_image", type=str, help="Input'un dosya yolu.")
args = parser.parse_args()
main(args.input_image)
#python sekilalgilama.py shapes.png
 this simple code I wrote does not work on the picture

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!