Для части 2 нажмите здесь, а для части 1 нажмите здесь.

В этой части сначала я покажу некоторые операции обработки событий мыши на изображении, а также некоторые на видео.

Теперь давайте начнем со списками событий мыши в OPEN CV —

evt=[i for i in dir(cv2) if 'EVENT' in i]
print(evt)
#output
['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']

Здесь мы делаем список событий, которые вы можете видеть в выводе.

Итак, как и в первых двух частях, мы должны импортировать cv2, чтобы мы могли работать над ним. Здесь мы будем обрабатывать некоторые события мыши на изображении или видео, например, при нажатии правой кнопки на изображении и т. д.

Сначала мы создадим функцию, и в этой функции мы напишем, после какого события мыши мы хотим сделать. Итак, вот код, и я объясню его построчно —

def handling_click_event(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print(x,',',y)
        font=cv2.FONT_HERSHEY_COMPLEX_SMALL
        string=str(x)+','+str(y)
        cv2.putText(img,string,(x,y),font,1,(255,0,255),2)
        cv2.imshow('image',img)

В приведенной выше функции (handling_click_event) мы передаем пять параметров — событие — какое событие происходит на изображении, x — координата x, где мышь будет находиться во время события, y — координата y, где находится мышь будет во время события, флаги — конкретное условие, когда происходит событие мыши, например, любая клавиша клавиатуры и параметр — это пользовательские данные, которые мы передадим, когда будем вызывать эту функцию.
В функции мы должны проверить, что событие, входящее в параметр, совпадает с тем, которое мы хотим, а затем мы напишем, что делать с событием, поэтому для этого мы проверяем событие с условием if (в приведенном выше коде мы проверяя, нажимаем ли мы левую кнопку мыши), а затем в условии, если мы печатаем координаты.
Хорошо, стоп………, Сначала давайте узнаем, что мы будем делать после нажатия левой кнопки, поэтому мы хотим показать координаты этой точки, но где? где была нажата мышь.
Снова давайте перейдем к коду, чтобы мы были на координатах печати, после этого мы должны поместить координаты этой точки на изображение, для этого мы будем использовать putText() метод. Я объяснял этот метод уже в предыдущих частях. В этом методе мы задаем координаты x и y из параметра, потому что…. Я думаю, вы понимаете.

После этого мы должны вызвать функцию обратного вызова (где мы передаем метод в качестве аргумента в методе). Итак, позвольте мне показать вам код — —

img=cv2.imread('catt.png')
cv2.imshow('image',img)
cv2.setMouseCallback('image',handling_click_event)

cv2.waitKey(0)
cv2.destroyAllWindows()

Здесь я специально объясню функцию setMouseCallback(), потому что другие вещи вы знаете очень хорошо. мы читаем изображение и показываем его в окне с именем изображение, так что это изображение, где вы будете делать вещи и получать результат. Мы будем использовать функцию setMouseCallback(), в которую будет передаваться имя окна (помните, что вы будете давать то же имя окна, в котором находится ваше изображение, ни то, что оно не будет работать) и функцию, которую мы сделали.

Так что запустите свой код, я уверен, что вы получите результат.

Вы также можете сделать для правой кнопки. Остается только сделать еще одно условие if и поместить его в свою функцию. См. пример —

# put it in your function.

if event == cv2.EVENT_RBUTTONDOWN:
    blue=img[y,x,0]
    green=img[y,x,1]
    red=img[y,x,2]
    font=cv2.FONT_HERSHEY_COMPLEX_SMALL
    string1=str(blue)+','+str(green)+','+str(red)
    cv2.putText(img,string1,(x,y),font,1,(255,0,0),2)
    cv2.imshow('image',img)

Изображение результата после —

После этого я хочу, чтобы, когда мы нажимаем на любую часть изображения, он делал круг в этой точке, а когда мы нажимаем второй раз на любую часть изображения, он создает линию с первой и второй точкой. Вы получаете то, что я говорю. Давайте посмотрим код, и тогда мы в нем разберемся —

def event_handling_for(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDOWN:
        cv2.circle(image,(x,y),3,(0,0,244),-1)
        points.append((x,y))
        if len(points) >=2:
            cv2.line(image,points[-1],points[-2],(255,0,0),5)
        cv2.imshow('image',image)    
        

В приведенном выше условии функции if мы рисуем круг (метод circle()) в этой точке (где щелкает мышь) и добавляем эту точку в список (именованные точки). Поэтому для создания линии мы должны есть две точки для этого, мы проверяем, чтобы длина точек списка была равна 2 или больше 2, после чего, если условие совпало, мы создадим линию (метод line()) с двумя последними точками в список, потому что методы добавления добавляют элемент последним.

Затем мы вызовем функцию cv2.setMouseCallback(), как в первый раз.

результат -

Итак, настало время сделать некоторые дополнительные вещи с обработкой событий. Здесь мы будем использовать видео для обработки событий.

На этот раз я хочу показать цвет определенной области (видео) в другом окне.

def click_event_for_color(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDOWN:
        blue=frame[y,x,0]
        green=frame[y,x,1]
        red=frame[y,x,2]
        mycolorimage=np.zeros((512,512,3), np.uint8)
        mycolorimage[:]=[blue,green,red]
        cv2.imshow('mycolorimage',mycolorimage)

В приведенном выше примере мы создаем синюю, зеленую и красную переменные, в которых мы сохраняем каналы каждого (пояснение — см., когда мы делаем только кадр [y, x], тогда мы получаем некоторый цвет (x, x, x) этого координаты x, y в формате BGR, поэтому здесь, когда мы будем делать кадр [x, y, 0], он даст только значение индекса 0, которое имеет синий цвет и т. д.). Затем мы создаем массив нулей (это для окна черного цвета), а затем мы меняем цвет всего окна (синий, зеленый, красный). После этого мы показываем окно изображения с именем mycolorimage.
Мы делаем это для видео, поэтому я также должен объяснить вызывающую часть. Вот код — —

image_capture=cv2.VideoCapture(0)
while True:
    ret, frame=image_capture.read()
    cv2.imshow('video',frame)
    if cv2.waitKey(1) & 0xFF == ord('m'):
        cv2.destroyAllWindows()
        break

    cv2.setMouseCallback('video',click_event)

Вы очень хорошо знали весь код, потому что я объяснил его в первых двух частях.
Здесь единственное изменение состоит в том, что я вызываю функцию в цикле while, потому что видите, видео представляет собой набор изображений, поэтому, когда вы нажмете в любом месте вашего видео, тогда в то время в реальном времени вы нажали на изображение, поэтому функция cv2.setMouseCallback() будет запущена, и вы знаете процесс.

Итак, надеюсь, вам понравилось.

В части 4 мы рассмотрим больше.

благодаря.