Jag har låtit programmet räkna ut genomsnittstorleken på kulhålen, om det saknas ett kulhål och ett av kulhålen är 20% större än genomsnittet kommer det hålet räknas som en dubbelträff. Annars antar programmet att det är färre träffar.
Nu har jag krånglat till koden något, ska försöka snygga upp den senare. Nästa steg blir att försöka förbättra inläsningen av bilden så att det inte är så petigt med upplösning och vinkel, tack för länken till perspektivinställningarna!
Nu funderar jag på att man kanske skulle kunna ha en raspberry pi med en kamera under målet, raspberryn kan sedan indikera träff tillbaka till skytten.
Kod: Markera allt
#!/usr/bin/python
# Standard imports
import cv2
import numpy as np;
import math
# Read image
im = cv2.imread("Bild1.jpg",0)
im = cv2.medianBlur(im,5)
# Setup SimpleBlobDetector parameters.
circles = cv2.HoughCircles(im,cv2.HOUGH_GRADIENT,1,100,param1=10,param2=40,minRadius=350,maxRadius=410)
# Paint circle on image
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# draw the outer circle
cv2.circle(im,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
scale = i[2]
print("scale", scale)
# Setup SimpleBlobDetector parameters.
params = cv2.SimpleBlobDetector_Params()
# Change thresholds
params.minThreshold = 40
params.maxThreshold = 200
# Filter by Area.
params.filterByArea = True
params.minArea = 300
params.maxArea = 600
# Filter by Circularity
params.filterByCircularity = True
params.minCircularity = 0.1
# Filter by Convexity
params.filterByConvexity = True
params.minConvexity = 0.44
# Filter by Inertia
params.filterByInertia = True
params.minInertiaRatio = 0.31
# Create a detector with the parameters
detector = cv2.SimpleBlobDetector_create(params)
# Detect blobs.
keypoints = detector.detect(im)
# Draw detected blobs as red circles.
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS ensures
# the size of the circle corresponds to the size of blob
nblobs = len(keypoints)
im = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
i = 0
skott1 = list(range(1, 8))
skott2 = list(range(1, 8))
skott3 = list(range(1, 8))
skott4 = list(range(1, 8))
skott5 = list(range(1, 8))
distance = list(range(1, 32))
size = list(range(1,32))
for keypoint in keypoints:
x = int(keypoint.pt[0])
y = int(keypoint.pt[1])
s = int(keypoint.size)
if i == 0:
skott1[1] = x
skott1[2] = y
size[1] = s
elif i == 1:
skott2[1] = x
skott2[2] = y
size[2] = s
elif i == 2:
skott3[1] = x
skott3[2] = y
size[3] = s
elif i == 3:
skott4[1] = x
skott4[2] = y
size[4] = s
elif i == 4:
skott5[1] = x
skott5[2] = y
size[5] = s
print("Hole", i+1)
print(str(x))
print(str(y))
print(str(s))
print(" ")
i = i + 1
sizeavg = (size[1] + size[2] + size[3] + size[4]) / 4
sizediff = sizeavg * 1.2
print ("avgsize", sizeavg)
if size[1] > sizediff:
print("double 1")
nblobs = 5
skott5[1] = skott1[1]
skott5[2] = skott1[2]
elif size[2] > sizediff:
print("double 2")
nblobs = 5
skott5[1] = skott2[1]
skott5[2] = skott2[2]
elif size[3] > sizediff:
print("double 3")
nblobs = 5
skott5[1] = skott3[1]
skott5[2] = skott3[2]
elif size[4] > sizediff:
print("double 4")
nblobs = 5
skott5[1] = skott4[1]
skott5[2] = skott4[2]
cv2.putText(im,str(nblobs), (100,120), cv2.FONT_HERSHEY_PLAIN, 1, 1)
cv2.putText(im,"hits", (115,120), cv2.FONT_HERSHEY_PLAIN, 1, 1)
cv2.putText(im,"1", (skott1[1]+20,skott1[2]), cv2.FONT_HERSHEY_PLAIN, 1, 1)
cv2.putText(im,"2", (skott2[1]+20,skott2[2]), cv2.FONT_HERSHEY_PLAIN, 1, 1)
cv2.putText(im,"3", (skott3[1]+20,skott3[2]), cv2.FONT_HERSHEY_PLAIN, 1, 1)
cv2.putText(im,"4", (skott4[1]+20,skott4[2]), cv2.FONT_HERSHEY_PLAIN, 1, 1)
cv2.putText(im,"5", (skott5[1]+20,skott5[2]), cv2.FONT_HERSHEY_PLAIN, 1, 1)
if nblobs == 2:
skott2[1] = skott2[1]
skott2[2] = skott2[2]
skott3[1] = skott2[1]
skott3[2] = skott2[2]
skott4[1] = skott2[1]
skott4[2] = skott2[2]
skott5[1] = skott2[1]
skott5[2] = skott2[2]
elif nblobs == 2:
skott3[1] = skott2[1]
skott3[2] = skott2[2]
skott4[1] = skott2[1]
skott4[2] = skott2[2]
skott5[1] = skott2[1]
skott5[2] = skott2[2]
elif nblobs == 3:
skott4[1] = skott3[1]
skott4[2] = skott3[2]
skott5[1] = skott3[1]
skott5[2] = skott3[2]
elif nblobs == 4:
skott5[1] = skott4[1]
skott5[2] = skott4[2]
print("Distances:")
distance[1] = math.sqrt( ((skott1[1]-skott2[1])**2)+((skott1[2]-skott2[2])**2) )
print("1-2", distance[1])
distance[2] = math.sqrt( ((skott1[1]-skott3[1])**2)+((skott1[2]-skott3[2])**2) )
print("1-3", distance[2])
distance[3] = math.sqrt( ((skott1[1]-skott4[1])**2)+((skott1[2]-skott4[2])**2) )
print("1-4", distance[3])
distance[4] = math.sqrt( ((skott1[1]-skott5[1])**2)+((skott1[2]-skott5[2])**2) )
print("1-5", distance[4])
distance[5] = math.sqrt( ((skott2[1]-skott3[1])**2)+((skott2[2]-skott3[2])**2) )
print("2-3", distance[5])
distance[6] = math.sqrt( ((skott2[1]-skott4[1])**2)+((skott2[2]-skott4[2])**2) )
print("2-4", distance[6])
distance[7] = math.sqrt( ((skott2[1]-skott5[1])**2)+((skott2[2]-skott5[2])**2) )
print("2-5", distance[7])
distance[8] = math.sqrt( ((skott3[1]-skott2[1])**2)+((skott3[2]-skott2[2])**2) )
print("3-2", distance[8])
distance[9] = math.sqrt( ((skott3[1]-skott4[1])**2)+((skott3[2]-skott4[2])**2) )
print("3-4", distance[9])
distance[10] = math.sqrt( ((skott3[1]-skott5[1])**2)+((skott3[2]-skott5[2])**2) )
print("3-5", distance[10])
distance[11] = math.sqrt( ((skott4[1]-skott2[1])**2)+((skott4[2]-skott2[2])**2) )
print("4-2", distance[11])
distance[12] = math.sqrt( ((skott4[1]-skott3[1])**2)+((skott4[2]-skott3[2])**2) )
print("4-3", distance[12])
distance[13] = math.sqrt( ((skott4[1]-skott5[1])**2)+((skott4[2]-skott5[2])**2) )
print("4-5", distance[13])
distance[14] = math.sqrt( ((skott5[1]-skott2[1])**2)+((skott5[2]-skott2[2])**2) )
print("5-2", distance[14])
distance[15] = math.sqrt( ((skott5[1]-skott3[1])**2)+((skott5[2]-skott3[2])**2) )
print("5-3", distance[15])
distance[16] = math.sqrt( ((skott5[1]-skott4[1])**2)+((skott5[2]-skott4[2])**2) )
print("5-4", distance[16])
maxa = 1
for x in range(1,16):
if distance[x] > distance[x+1]:
print(distance[x],"bigger than", distance[x+1])
if distance[x] > distance[maxa]:
maxa = x
else:
print(distance[x],"smaller than", distance[x+1])
print("biggest yet", distance[maxa])
print("longest: ", maxa, distance[maxa])
spread = round(distance[maxa]*100/scale)
cv2.putText(im,"mm", (220,140), cv2.FONT_HERSHEY_PLAIN, 1, 1)
cv2.putText(im,str(spread), (165,140), cv2.FONT_HERSHEY_PLAIN, 1, 1)
cv2.putText(im,"Spread: ", (100,140), cv2.FONT_HERSHEY_PLAIN, 1, 1)
moa = round(spread/87,2)
cv2.putText(im,"MOA", (220,160), cv2.FONT_HERSHEY_PLAIN, 1, 1)
cv2.putText(im,str(moa), (165,160), cv2.FONT_HERSHEY_PLAIN, 1, 1)
# Show blobs
cv2.imshow("Keypoints", im)
cv2.waitKey(0)