Положение вниз имеет отличную форму, вы можете использовать shapematch , чтобы обнаружить наличие этой формы.
Для этого вам понадобится справочная форма. Я создал это, обнаружив края, сохранил это изображение и использовал MS Paint, чтобы оставить только необходимую форму.
Код ниже показывает, как определить форму. Он выводит положение шестерни на терминал и рисует форму, если она находится в нижнем положении.
Shapematch может обрабатывать вращение, но вам может потребоваться проверить и настроить некоторые параметры, если вы хотите использовать это в какой-то автоматизации.
Изображение эталонного снаряжения: https://i.stack.imgur.com/s6E9C.jpg [ 1110]
Код:
import numpy as np
import cv2
# load image of reference shape
image_reference = cv2.imread("ReferenceGear.jpg",0)
# threshold to remove artefacts
ret, img_ref = cv2.threshold(image_reference, 200, 255,0)
# detect contours in image
im, ref_cnts, hierarchy = cv2.findContours(img_ref, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# store the contour of the reference shape in a variable
ref_cnt = ref_cnts[0]
# load image
image = cv2.imread("gear.png")
# detect edges in image
edges = cv2.Canny(image,50,50)
# detect contours of edges in image
im, contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# for each edge-contour in the image: try to match with te reference.
# if the value is very small, it is a good match. store the result in a variable
found = False
for cnt in contours:
ret = cv2.matchShapes(cnt, ref_cnt,3,0.0)
if ret < 0.001:
cv2.drawContours(image, [cnt], 0, (255), 2)
found = True
break
if found:
print("Gear is in down position")
else:
print("Gear is in up position")
# show image and reference
cv2.imshow("image", image)
cv2.imshow("image_reference", image_reference)
# release resources
cv2.waitKey(0)
cv2.destroyAllWindows()
Необходимо поместить a trap
оператор в Вашем сценарии удара:
trap 'killall afplay' EXIT
Обратите внимание однако, что это не будет работать, если процесс удара будет отправлен a KILL
сигнал (9), поскольку для процессов не возможно прервать тот сигнал.
Использовать trap
.
trap "kill $pid" INT TERM EXIT
Также избегайте killall
или pkill
, так как это могло уничтожить несвязанные процессы (например, от другого экземпляра Вашего сценария или даже другого сценария). Вместо этого поместите PID игрока в переменную и уничтожьте только тот PID.