OpenCV-Python träffbildsanalys
Postat: 22 april 2019, 13:21:37
Hej!
Jag håller på att försöka skriva ett Python script som med hjälp av OpenCV ska kunna analysera ett foto på en måltavla och avgöra hur ett antal träffar sitter placerade på detta.
I nuläget har jag lyckats att få koden att mäta måltavlans radie, för att få ett mått på antal pixlar/mm samt att räkna och lokalisera träffarna.

Programering är inte min starka sida, men jag har lyckats få ihop koden genom att klippa och klistra/läsa exempel. Men nu är jag osäker på hur jag bäst ska försöka räkna ut spridningen mellan skotten, alltså det största avståndet mellan 2 skott som finns i träffbilden. Finns det något bra sätt att göra det, eller är det helt enkelt så att man får mäta alla avstånd mellan alla skot och sedan sortera ut det största?
Jag håller på att försöka skriva ett Python script som med hjälp av OpenCV ska kunna analysera ett foto på en måltavla och avgöra hur ett antal träffar sitter placerade på detta.
I nuläget har jag lyckats att få koden att mäta måltavlans radie, för att få ett mått på antal pixlar/mm samt att räkna och lokalisera träffarna.

Programering är inte min starka sida, men jag har lyckats få ihop koden genom att klippa och klistra/läsa exempel. Men nu är jag osäker på hur jag bäst ska försöka räkna ut spridningen mellan skotten, alltså det största avståndet mellan 2 skott som finns i träffbilden. Finns det något bra sätt att göra det, eller är det helt enkelt så att man får mäta alla avstånd mellan alla skot och sedan sortera ut det största?
Kod: Markera allt
#!/usr/bin/python
# Standard imports
import cv2
import numpy as np;
# Read image
im = cv2.imread("Bild2.jpg",0)
im = cv2.medianBlur(im,5)
# Setup SimpleBlobDetector parameters.
# Find circle
circles = cv2.HoughCircles(im,cv2.HOUGH_GRADIENT,1,100,param1=10,param2=60,minRadius=300,maxRadius=400)
# 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]/100
print(i[2])
print(" ")
cv2.putText(im,str(scale), (100,100), cv2.FONT_HERSHEY_PLAIN, 1, 1)
cv2.putText(im,"pix/mm", (115,100), cv2.FONT_HERSHEY_PLAIN, 1, 1)
# Setup SimpleBlobDetector parameters.
params = cv2.SimpleBlobDetector_Params()
# Change thresholds
params.minThreshold = 40
params.maxThreshold = 200
# Filter by Area.
params.filterByArea = True
params.minArea = 200
params.maxArea = 400
# 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.11
# 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)
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)
im = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
listx = []
listy = []
i = 0
for keypoint in keypoints:
x = int(keypoint.pt[0])
y = int(keypoint.pt[1])
s = int(keypoint.size)
print(i)
print(str(x))
print(str(y))
print(" ")
i = i + 1
# Show blobs
cv2.imshow("Keypoints", im)
cv2.waitKey(0)