OpenCV-Python träffbildsanalys

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Shimano
Inlägg: 40
Blev medlem: 22 april 2019, 13:13:05

OpenCV-Python träffbildsanalys

Inlägg av Shimano »

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.

Bild

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)
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Re: OpenCV-Python träffbildsanalys

Inlägg av ahlsten »

Det går att omsluta träffarna med en minsta konvex form, men det är väl aldrig så himla många träffpunkter att det behövs något tjusigt? Att räkna ut samtliga avstånd blir väl O(n*n) och det är inte såå himla farligt om det bara är typ <10 träffar?
Shimano
Inlägg: 40
Blev medlem: 22 april 2019, 13:13:05

Re: OpenCV-Python träffbildsanalys

Inlägg av Shimano »

Jag fick göra det den hårda vägen, men det fungerar(efter ett par timmar av fel-letande i koden. Alla avstånd beräknas och jämförs därefter med varandra. Det som behöver göras nu är att fixa så att inläsningskriterierna för hål/cirkel blir lite mer tillförligliga, dessa måste nu ändras lite för varje bild.

Bild

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.

# Find circle

circles = cv2.HoughCircles(im,cv2.HOUGH_GRADIENT,1,100,param1=10,param2=50,minRadius=350,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]
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 = 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)

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))

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
	elif i == 1:
		skott2[1] = x
		skott2[2] = y
	elif i == 2:
		skott3[1] = x
		skott3[2] = y
	elif i == 3:
		skott4[1] = x
		skott4[2] = y
	elif i == 4:
		skott5[1] = x
		skott5[2] = y
	print("Hole", i+1)
	print(str(x))
	print(str(y))
	print(" ")
	i = i + 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)

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])

print()

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)
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: OpenCV-Python träffbildsanalys

Inlägg av Lennart Aspenryd »

Tjusigt!
Jag vill se fler bilder Vad kollar du tavlan med för utrustning och hur visar du resultatet?
Spännande projekt!
guckrum
Inlägg: 1691
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: OpenCV-Python träffbildsanalys

Inlägg av guckrum »

Detekterar du måltavlan "för högt" eftersom nedersta delen av cirkeln inte är gråtonad på tavlan?
Shimano
Inlägg: 40
Blev medlem: 22 april 2019, 13:13:05

Re: OpenCV-Python träffbildsanalys

Inlägg av Shimano »

Jag har inte kommit mycket längre än att programmera python scriptet och sätta mig in i hur OpenCV fungerar, och provat mig fram till lite vilka inställningar som behövs med olika bilder. Eftersom jag är helt ny på Python så hade jag inte några förhoppningar om att det skulle gå att fixa.

Koden är nu förbättrad så att även färre träffar fungerar, och fixat så att fler träffbilder fungerar. Dessa måste vara 1000x800pixlar(eller nära iaf) för att fungera bra. Ett problem jag upptäckt är när kulhålen går ihop, men kanske går det att detektera storleken och räkna in även dubbelträffen.

Om det är möjligt så funderar jag på en Raspberry Pi och en webkamera framme vid måltavlan, som kan skicka resultatet i begriplig form, men det är fortfarande en bit dit :)

Bild
Detekterar du måltavlan "för högt" eftersom nedersta delen av cirkeln inte är gråtonad på tavlan?
Tavlan är platt på undersidan, just den typen av måltavla är det av någon anledning. Det fungerar fortfarande att detektera som en cirkel, men blir lite sned bara ibland. Cirkeln används hur som helst bara för att få skalan rätt till hur stort avståndet blir mellan dom yttersta skotten.
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: OpenCV-Python träffbildsanalys

Inlägg av Krille Krokodil »

Nära hål i hål kanske du skulle kunna använda "background estimation" för, det ger en binär
bild på vad som förändras i bilden som man sedan kan filtrera vidare på blobbar över en viss
area.

Background Subtraction, OpenCV 3.4.1


Perspektivtransformation kan vara användbart här också, med det kan du ha kameran snett utanför tavlan och
sedan vrida upp bilden så att du får samma perspektiv som nu.

Perspective transformation – OpenCV 3.4 with python 3 Tutorial 13
Shimano
Inlägg: 40
Blev medlem: 22 april 2019, 13:13:05

Re: OpenCV-Python träffbildsanalys

Inlägg av Shimano »

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.

Bild

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)
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: OpenCV-Python träffbildsanalys

Inlägg av Krille Krokodil »

Från elipsen kan man räkna ut hur man ska vrida upp bilden.

Släng gärna upp en bild tagen snett från sidan så ska jag leka lite med den.

Kod: Markera allt

imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,50,255,0)
im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#cv2.drawContours(img, contours, -1, (0,255,0), 3)

for i, contour in enumerate(contours):
    area = cv2.contourArea(contour)
    if area <= 100:  # skip ellipses smaller then 10x10
        continue

    ellipse = cv2.fitEllipse(contour)
    cv2.ellipse(img,ellipse,(0,255,0),2)

cv2.imshow('original',img)
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: OpenCV-Python träffbildsanalys

Inlägg av Lennart Aspenryd »

Riktigt bra forumrespons från KrilleKrokodil!
Det är så det skall vara.
Så nu vill vi bara ha en träffbildsmarkör in realtid. .
Kan bli nyttigt detta.
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: OpenCV-Python träffbildsanalys

Inlägg av Krille Krokodil »

Jag skalade bilden till 75% i bredd för att simulera perspektivet underifrån.

Kod: Markera allt

ellipse = cv2.fitEllipse(contour)
cv2.ellipse(img,ellipse,(0,255,0),2)
(x,y),(MA,ma),angle = cv2.fitEllipse(contour)
Xmin = x - MA/2
Xmax = x + MA/2
Ymin = y - ma/2
Ymax = y + ma/2

pts1 = np.float32([[Xmin, Ymin], [Xmax, Ymin], [Xmin, Ymax], [Xmax, Ymax]])
pts2 = np.float32([[0, 0], [500, 0], [0, 500], [500, 500]])
matrix = cv2.getPerspectiveTransform(pts1, pts2)

result = cv2.warpPerspective(img, matrix, (500, 500))
Screenshot 2019-04-22 at 21.36.30.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Johanb
Inlägg: 3406
Blev medlem: 26 mars 2006, 22:26:12
Ort: Smedjebacken

Re: OpenCV-Python träffbildsanalys

Inlägg av Johanb »

Det här ser kul ut, det blir lite tjatigt att gå 1km varje gång man ska markera :)
Om man skjuter en serie så kan man ju ta en score på den och sen skjuta en till på samma tavla.
Det kanske till och med går att göra en diff mellan gamla träffarna och nya.
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

Re: OpenCV-Python träffbildsanalys

Inlägg av Lennart Aspenryd »

Nu börjar det bli riktigt bra. Så har man en rulle med svart papper som matas upp en tavelhöjd mellan varje serie. Så kan vi låta markörgubbarna gå hem.
Läste tusen meter, tänkte det var som fan, men det var ju en retur också i de metrarna!
mounte
Inlägg: 204
Blev medlem: 14 november 2010, 13:15:00
Ort: Sandviken

Re: OpenCV-Python träffbildsanalys

Inlägg av mounte »

Vore jätteskoj med ett galleri av "råa" bilder.
Vidare undrar jag vad du har för möjlighet att t.ex. använda (om det finns) inbyggd mikrofon i webkameran.
Jag förstår problematiken med dubbelträffar, hur ofta förekommer "perfekta" dubbelträffar? Hur stor variation är det på hålen från träffarna, fläks pappret upp med stor variation eller är det hyggligt lika varje gång?
Hur jobbar du mot pajjen? Har du trådlöst nät?
Johanb
Inlägg: 3406
Blev medlem: 26 mars 2006, 22:26:12
Ort: Smedjebacken

Re: OpenCV-Python träffbildsanalys

Inlägg av Johanb »

lasp:
När jag var yngre (ung drömmare) så spånade jag runt att använda en matris-skrivare med traktorpapper som skrev ut en tavla och rullade upp den gamla på en rulle :)
Skriv svar