revert documentation code to working code
This commit is contained in:
@@ -5,7 +5,6 @@ import json
|
|||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
import cv2
|
import cv2
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
from .imagereaders import VideoReader, NaoImageReader, PictureReader
|
from .imagereaders import VideoReader, NaoImageReader, PictureReader
|
||||||
from .finders import GoalFinder, BallFinder, FieldFinder
|
from .finders import GoalFinder, BallFinder, FieldFinder
|
||||||
@@ -13,7 +12,8 @@ from .utils import read_config, imresize, hsv_mask, InterruptDelayed
|
|||||||
|
|
||||||
class Colorpicker(object):
|
class Colorpicker(object):
|
||||||
|
|
||||||
WINDOW_DETECTION_NAME = 'Colorpicker'
|
WINDOW_CAPTURE_NAME = 'Object Detection (or not)'
|
||||||
|
WINDOW_DETECTION_NAME = 'Primary Mask'
|
||||||
|
|
||||||
def __init__(self, target=None):
|
def __init__(self, target=None):
|
||||||
parameters = ['low_h', 'low_s', 'low_v', 'high_h', 'high_s', 'high_v']
|
parameters = ['low_h', 'low_s', 'low_v', 'high_h', 'high_s', 'high_v']
|
||||||
@@ -53,6 +53,7 @@ class Colorpicker(object):
|
|||||||
else:
|
else:
|
||||||
self.marker = None
|
self.marker = None
|
||||||
|
|
||||||
|
cv2.namedWindow(self.WINDOW_CAPTURE_NAME)
|
||||||
cv2.namedWindow(self.WINDOW_DETECTION_NAME)
|
cv2.namedWindow(self.WINDOW_DETECTION_NAME)
|
||||||
self.trackers = [
|
self.trackers = [
|
||||||
cv2.createTrackbar(
|
cv2.createTrackbar(
|
||||||
@@ -98,13 +99,9 @@ class Colorpicker(object):
|
|||||||
tuple(map(self.settings.get, ('high_h', 'high_s', 'high_v')))
|
tuple(map(self.settings.get, ('high_h', 'high_s', 'high_v')))
|
||||||
)
|
)
|
||||||
|
|
||||||
thr = cv2.cvtColor(thr, cv2.COLOR_GRAY2BGR)
|
cv2.imshow(self.WINDOW_CAPTURE_NAME, frame)
|
||||||
# thr = self.marker.draw_last_contours(thr)
|
cv2.imshow(self.WINDOW_DETECTION_NAME, thr)
|
||||||
resulting = np.concatenate((frame, thr), axis=1)
|
return cv2.waitKey(0 if manual else 1)
|
||||||
|
|
||||||
cv2.imshow(self.WINDOW_DETECTION_NAME, resulting)
|
|
||||||
# cv2.imshow(self.WINDOW_DETECTION_NAME, thr)
|
|
||||||
return cv2.waitKey(0 if manual else 50)
|
|
||||||
|
|
||||||
def save(self, filename, color):
|
def save(self, filename, color):
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ from __future__ import division
|
|||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
import cv2
|
import cv2
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
from .utils import read_config, imresize
|
from .utils import read_config, imresize
|
||||||
from .imagereaders import NaoImageReader, VideoReader, PictureReader
|
from .imagereaders import NaoImageReader, VideoReader, PictureReader
|
||||||
@@ -119,10 +118,9 @@ if __name__ == '__main__':
|
|||||||
|
|
||||||
ball_frame = ball_finder.draw(ball_frame, ball)
|
ball_frame = ball_finder.draw(ball_frame, ball)
|
||||||
goal_frame = goal_finder.draw(goal_frame, goal)
|
goal_frame = goal_finder.draw(goal_frame, goal)
|
||||||
combined = np.concatenate((ball_frame, goal_frame), axis=1)
|
|
||||||
|
|
||||||
cv2.imshow(ball_window, combined)
|
cv2.imshow(ball_window, ball_frame)
|
||||||
# cv2.imshow(goal_window, goal_frame)
|
cv2.imshow(goal_window, goal_frame)
|
||||||
|
|
||||||
key = cv2.waitKey(0 if args.manual else 1)
|
key = cv2.waitKey(0 if args.manual else 1)
|
||||||
if key == ord('q') or key == 27:
|
if key == ord('q') or key == 27:
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from collections import deque
|
|||||||
import cv2
|
import cv2
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
from .utils import hsv_mask, contour_center
|
from .utils import hsv_mask
|
||||||
|
|
||||||
|
|
||||||
class FieldFinder(object):
|
class FieldFinder(object):
|
||||||
@@ -51,12 +51,9 @@ class FieldFinder(object):
|
|||||||
|
|
||||||
class GoalFinder(object):
|
class GoalFinder(object):
|
||||||
|
|
||||||
def __init__(self, hsv_lower, hsv_upper, goal_thr=0.45):
|
def __init__(self, hsv_lower, hsv_upper):
|
||||||
self.hsv_lower = tuple(hsv_lower)
|
self.hsv_lower = tuple(hsv_lower)
|
||||||
self.hsv_upper = tuple(hsv_upper)
|
self.hsv_upper = tuple(hsv_upper)
|
||||||
self.goal_thr = goal_thr
|
|
||||||
self.last_detection = []
|
|
||||||
self.last_contours = []
|
|
||||||
|
|
||||||
def primary_mask(self, frame):
|
def primary_mask(self, frame):
|
||||||
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
|
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
|
||||||
@@ -89,11 +86,9 @@ class GoalFinder(object):
|
|||||||
return final_score
|
return final_score
|
||||||
|
|
||||||
def find(self, frame):
|
def find(self, frame):
|
||||||
self.last_detection = []
|
|
||||||
thr = self.primary_mask(frame)
|
thr = self.primary_mask(frame)
|
||||||
cnts, _ = cv2.findContours(thr, cv2.RETR_EXTERNAL,
|
cnts, _ = cv2.findContours(thr, cv2.RETR_EXTERNAL,
|
||||||
cv2.CHAIN_APPROX_SIMPLE)
|
cv2.CHAIN_APPROX_SIMPLE)
|
||||||
self.last_contours = cnts
|
|
||||||
cnts.sort(key=cv2.contourArea, reverse=True)
|
cnts.sort(key=cv2.contourArea, reverse=True)
|
||||||
top_x = 6
|
top_x = 6
|
||||||
cnts = cnts[:top_x]
|
cnts = cnts[:top_x]
|
||||||
@@ -113,22 +108,15 @@ class GoalFinder(object):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
similarities = [self.goal_similarity(cnt) for cnt in good_cnts]
|
similarities = [self.goal_similarity(cnt) for cnt in good_cnts]
|
||||||
self.last_detection = list(zip(good_cnts, similarities))
|
|
||||||
best = min(similarities)
|
best = min(similarities)
|
||||||
print('Final goal score:', best)
|
print('Final goal score:', best)
|
||||||
print()
|
print()
|
||||||
if best > self.goal_thr:
|
if best > 0.45:
|
||||||
return None
|
return None
|
||||||
# Find the contour with the shape closest to that of the goal
|
# Find the contour with the shape closest to that of the goal
|
||||||
goal = good_cnts[similarities.index(best)]
|
goal = good_cnts[similarities.index(best)]
|
||||||
return goal
|
return goal
|
||||||
|
|
||||||
def draw_last_contours(self, frame):
|
|
||||||
frame = frame.copy()
|
|
||||||
for cnt in self.last_contours:
|
|
||||||
cv2.drawContours(frame, (cnt,), -1, (255, 0, 0), 2)
|
|
||||||
return frame
|
|
||||||
|
|
||||||
def left_right_post(self, contour):
|
def left_right_post(self, contour):
|
||||||
return contour[...,0].min(), contour[...,0].max()
|
return contour[...,0].min(), contour[...,0].max()
|
||||||
|
|
||||||
@@ -139,27 +127,9 @@ class GoalFinder(object):
|
|||||||
return (l + r) / 2
|
return (l + r) / 2
|
||||||
|
|
||||||
def draw(self, frame, goal):
|
def draw(self, frame, goal):
|
||||||
frame = frame.copy()
|
|
||||||
cv2.putText(frame,
|
|
||||||
'Upper threshold: ' + '%.2f' % self.goal_thr, (10, 50),
|
|
||||||
cv2.FONT_HERSHEY_DUPLEX, 1, (0, 255, 0))
|
|
||||||
if self.last_detection:
|
|
||||||
cnts = sorted(self.last_detection,
|
|
||||||
key=lambda x: x[1])
|
|
||||||
if cnts[0][1] < self.goal_thr:
|
|
||||||
goal, score = cnts[0]
|
|
||||||
cnts = cnts[1:]
|
|
||||||
for cnt, sim in cnts[1:]:
|
|
||||||
print(sim)
|
|
||||||
cv2.drawContours(frame, (cnt,), -1, (0, 0, 255), 1)
|
|
||||||
cv2.putText(frame, '%.2f' % sim, contour_center(cnt),
|
|
||||||
cv2.FONT_HERSHEY_DUPLEX, 1, (0, 0, 255))
|
|
||||||
|
|
||||||
if goal is not None:
|
if goal is not None:
|
||||||
print(goal)
|
frame = frame.copy()
|
||||||
cv2.drawContours(frame, (goal,), -1, (0, 255, 0), 2)
|
cv2.drawContours(frame, (goal,), -1, (0, 255, 0), 2)
|
||||||
cv2.putText(frame, '%.2f' % score, contour_center(goal),
|
|
||||||
cv2.FONT_HERSHEY_DUPLEX, 1, (0, 255, 0))
|
|
||||||
return frame
|
return frame
|
||||||
|
|
||||||
|
|
||||||
@@ -209,15 +179,8 @@ class BallFinder(object):
|
|||||||
return center, int(radius)
|
return center, int(radius)
|
||||||
|
|
||||||
def draw(self, frame, ball):
|
def draw(self, frame, ball):
|
||||||
frame = frame.copy()
|
|
||||||
if ball is not None:
|
if ball is not None:
|
||||||
|
frame = frame.copy()
|
||||||
center, radius = ball
|
center, radius = ball
|
||||||
cv2.circle(frame, center, radius, (255, 255, 0), 2)
|
cv2.circle(frame, center, radius, (255, 255, 0), 1)
|
||||||
# for i in range(1, len(self.history)):
|
|
||||||
# if self.history[i - 1] is None or self.history[i] is None:
|
|
||||||
# continue
|
|
||||||
# center_now = self.history[i - 1][0]
|
|
||||||
# center_prev = self.history[i][0]
|
|
||||||
# thickness = int((64 / (i + 1))**0.5 * 1.25)
|
|
||||||
# cv2.line(frame, center_now, center_prev, (0, 0, 255), thickness)
|
|
||||||
return frame
|
return frame
|
||||||
|
|||||||
@@ -15,11 +15,11 @@
|
|||||||
[
|
[
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
159
|
89
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
180,
|
180,
|
||||||
62,
|
73,
|
||||||
255
|
255
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
@@ -28,8 +28,8 @@
|
|||||||
"ball_min_radius": 0.01,
|
"ball_min_radius": 0.01,
|
||||||
"field": [
|
"field": [
|
||||||
[
|
[
|
||||||
17,
|
31,
|
||||||
57,
|
60,
|
||||||
60
|
60
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -41,11 +41,6 @@ def hsv_mask(hsv, hsv_lower, hsv_upper):
|
|||||||
else:
|
else:
|
||||||
return cv2.inRange(hsv, tuple(hsv_lower), tuple(hsv_upper))
|
return cv2.inRange(hsv, tuple(hsv_lower), tuple(hsv_upper))
|
||||||
|
|
||||||
|
|
||||||
def contour_center(contour):
|
|
||||||
M = cv2.moments(contour)
|
|
||||||
return int(M['m10'] / M['m00']) - 30, int(M['m01'] / M['m00']) + 30
|
|
||||||
|
|
||||||
class InterruptDelayed(object):
|
class InterruptDelayed(object):
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user