Команда выполнения, когда сценарий удара останавливается

Положение вниз имеет отличную форму, вы можете использовать shapematch , чтобы обнаружить наличие этой формы.
Для этого вам понадобится справочная форма. Я создал это, обнаружив края, сохранил это изображение и использовал MS Paint, чтобы оставить только необходимую форму.
Код ниже показывает, как определить форму. Он выводит положение шестерни на терминал и рисует форму, если она находится в нижнем положении.

Shapematch может обрабатывать вращение, но вам может потребоваться проверить и настроить некоторые параметры, если вы хотите использовать это в какой-то автоматизации.

Результат: enter image description here

Изображение эталонного снаряжения: 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()

5
задан Josh Hunt 30 October 2008 в 09:58
поделиться

3 ответа

trap 'killall afplay' EXIT

9
ответ дан 18 December 2019 в 12:03
поделиться

Необходимо поместить a trap оператор в Вашем сценарии удара:

trap 'killall afplay' EXIT

Обратите внимание однако, что это не будет работать, если процесс удара будет отправлен a KILL сигнал (9), поскольку для процессов не возможно прервать тот сигнал.

2
ответ дан 18 December 2019 в 12:03
поделиться

Использовать trap.

trap "kill $pid" INT TERM EXIT

Также избегайте killall или pkill, так как это могло уничтожить несвязанные процессы (например, от другого экземпляра Вашего сценария или даже другого сценария). Вместо этого поместите PID игрока в переменную и уничтожьте только тот PID.

4
ответ дан 18 December 2019 в 12:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: