Почему щелчок правой кнопкой мыши открывает раскрывающееся меню в моем окне OpenCV imshow ()? - PullRequest
1 голос
/ 17 июня 2019

Я пытаюсь запустить Образец OpenCV Grabcut в моей системе:

  • OpenCV версия 4.1.0
  • Python версия 3.6.8
  • IDLE версия 3.6.8
  • Ubuntu 18.04.2

Это информация о сборке от cv2.getBuildInformation(): build information

В сценарии Grabcut Sample мне нужно «нарисовать прямоугольник вокруг объекта с помощью правой кнопки мыши». По какой-то причине выпадающее меню появляется, когда я щелкаю правой кнопкой мыши (это я щелкаю и держу правую кнопку мыши):

drop down

Этого раньше не было, но, поскольку я переформатировал свой компьютер и переустановил OpenCV, я получил это выпадающее меню. Окно imshow тоже выглядит иначе. Я попытался установить множество пакетов видеокодеков ( из этого урока ), но это не помогло.

Это выпадающее меню мешает функциям обратного вызова мыши. Как мне избавиться от этого выпадающего меню?

Я установил OpenCV с помощью команды pip3 install opencv-contrib-python. Я знал, что мне не хватает некоторых пакетов, поэтому я попытался установить (, но не смог - «не удалось найти какой-либо пакет с помощью regex ...») эти пакеты из этого руководства :

sudo apt-get install python-devel numpy
sudo apt-get install gcc gcc-c++
sudo apt-get install gtk2-devel
sudo apt-get install ffmpeg-devel
sudo apt-get install gstreamer-plugins-base-devel

1 Ответ

1 голос
/ 18 июня 2019

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

Если вы предпочитаете использовать Qt и не возражаете немного изменить исходный код opencv и перестроить его, это похоже на изменение метода DefaultViewPort::contextMenuEvent() в файле modules/highgui/src/window_QT.cpp, чтобы пропустить построение меню и просто вернуться, возможно, сработает (иначе это возможно построить меню из-за некоторого флага, который вы добавляете). В настоящее время бэкэнд Qt highgui автоматически создает меню, используя любые действия, доступные в обычном меню.

Вот ссылка на метод в текущей основной ветке opencv по состоянию на 2019-06-18:

https://github.com/opencv/opencv/blob/1d2ef6b2a14fd5f80277d64b14e4a9a2faddc7d8/modules/highgui/src/window_QT.cpp#L2697

который имеет этот код:

void DefaultViewPort::contextMenuEvent(QContextMenuEvent* evnt)
{
    if (centralWidget->vect_QActions.size() > 0)
    {
        QMenu menu(this);

        foreach (QAction *a, centralWidget->vect_QActions)
            menu.addAction(a);

        menu.exec(evnt->globalPos());
    }
}

Альтернативой, которая может работать без перекомпиляции, может быть использование перетаскивания влево для выбора при проверке удерживаемой дополнительной клавиши-модификатора (например, shift или ctrl).

Кстати, я не проверял ни один из этих подходов, так что удачи! : -)

UPDATE: Если вы все еще хотите Qt, но не нуждаетесь в необычных опциях меню и дополнительном поведении и тому подобном, похоже, вы можете добавить флаг CV_GUI_NORMAL при создании окна, чтобы отключить функции CV_GUI_EXPANDED Qt.

...