Компьютерное зрение OpenCV3 и Qt5: 1–5
Компьютерное зрение OpenCV3 и Qt5: 1–5

1. Опен КВ и Введение в Qt

существуют самые основные формы и формы,“компьютерное зрение»да Термин, используемый для обозначения всех методов и алгоритмов, используемых для придания визуальных ощущений цифровым устройствам. что это значит? Ну, это именно то, на что это похоже. В идеале компьютеры должны иметь возможность видеть мир через объектив стандартной камеры (или любого другого типа камеры, если уж на то пошло), и, применяя различные алгоритмы компьютерного зрения, они должны быть в состоянии обнаруживать и даже распознавать и подсчитывать лица. объекты на изображении, обнаруживать движение в видеопотоке, а затем выполнять больше операций, которые на первый взгляд могут ожидать только люди. поэтому,хотетьучитьсякомпьютерное зрениеиз реального смысла, лучше знать компьютерное Для достижения упомянутого идеала существует метод развития целей зрения, чтобы цифровые устройства имели возможность видеть и понимать окружающую среду. Примечательно изда, большую часть времени компьютерное. зрениеи Обработка изображений взаимозаменяема киспользовать (хотя исторические исследования по этой теме могут доказать, что верно обратное). Но да, тем не менее, существует На протяжении всей книги мы по-прежнему Воляиспользовать «компьютерное Термин «зрение», потому что сегодня это более популярный и широко распространенный термин в сообществе информатики, и потому что, как мы увидим позже в этой главе, «обработка изображений» да OpenCV Модуль библиотеки, который мы также рассмотрим на следующих страницах этой главы, также будет рассмотрен в отдельной полной главе.

компьютерное зрениеда Самое популярное добро в информатике сегодня Один из предметов Живизиз, он используется в различных приложениях, начиная от обнаружения раковой ткани в медицинских инструментах и ​​заканчивая созданием блестящих музыкальных клипов и фильмов из видеороликов. Программное обеспечение, работающее с детектором объектов военного уровня, может помочь реализовать детектор дорожных знаков в конкретном месте Кусочка на карте, что поможет беспилотному автомобилю найти дорогу. Что ж, очевидно, что мы не можем закончить все возможности названия компьютерного зрения, но мы можем быть уверены, что это интересная тема и она будет актуальна еще долгое время. Также стоит упомянуть изда, Рынок труда быстро расширяется.,иэтосуществоватьрастет день ото дня。

существоватькомпьютерное зрение Разработчик и Экспертиспользоватьиз Самые популярные добро В Евизинструменте есть два самых известных сообщества с открытым исходным кодом: OpenCV. и Qt Также в названии вашей книги. Каждый день тысячи разработчиков по всему миру, от авторитетных компаний до инновационных стартапов, используют эти две платформы для создания приложений для самых разных отраслей (например, тех, которые мы упомянули), и это именно то, чему вы чему-то научитесь. эта книга.

В этой главе мы рассматриваем следующие темы:

  • представлять Qt,Даоноткрытьисходный кодичерезплатформаизразработка приложенийрамка
  • представлять OpenCV, кроссплатформенная платформакомпьютерная платформа с открытым исходным кодом. зрениерамка
  • каксуществовать Windows,MacOS и Linux Установить в операционную систему Qt
  • как добраться из Windows,MacOS и Linux из исходного кода, построенного на операционной системе OpenCV
  • Конфигурация вашей среды разработки в сочетании с использованием Qt и OpenCV для создания приложений.
  • использовать Qt и OpenCV Создайте свое из Нет-приложение.

Что необходимо?

Это наиболее очевидный вопрос после того, что было сказано во введении к этой главе, но ответ на него также является нашим первым шагом в изучении компьютерного зрения. Эта книга предназначена для разработчиков, знакомых с языком программирования C++ и желающих без особых усилий разрабатывать мощные и красивые приложения компьютерного зрения, которые хорошо работают в различных операционных системах. Цель этой книги — отправиться в увлекательное путешествие по различным темам компьютерного зрения, уделяя особое внимание практическим упражнениям и постепенно развивая полученные знания.

иметь достаточно C++ Любой, у кого есть опыт, знает, что использование raw C++ кода и зависит от конкретного OS из API Прийти к написанию визуально богатого приложения непросто. Поэтому почти каждый C++ Разработчики (или, по крайней мере, серьезно занимающиеся C++ Серьезные разработчики) используют ту или иную рамку, чтобы упростить этот процесс. Qt да Самый широкийдляизвестныйиз C++ рамка. На самом деле, это предпочтительно или не предпочтительно. С другой стороны, если ваша цель — разработать приложение, обрабатывающее изображения и визуализирующее набор данных, то OpenCV рамкавозможно да Нет.one (также дамост добро пожалуйста) адрес. Поэтому именно поэтому в этой книге основное внимание уделяется Qt и OpenCV в сочетании с причиной. Если не используется Qt и OpenCV Настолько мощная и рамочная, что невозможно обеспечить разную производительность для настольных и мобильных платформ, лучшую и компьютерную производительность. зрениеприложение.

Подвести В общем, пожалуйста, убедитесь, что у вас есть хотя бы C++ Среднее знание языков программирования. Если вы не знакомы с терминологией добрый, абстрактный добрый, наследование, шаблон и указатель добрыйиз, пожалуйста, сначала прочтите «читасвязанный». C++ из Книга。 Для всех других тем, особенно для всех практических тем, эта книга гарантирует, что вы охвачены всеми примерами. Все учебные пособия снабжены четкими пояснениями (или относятся к конкретным страницам документации). Конечно, чтобы получить права Qt и OpenCV Как реализовать модульдобрыйиз, очень подробно и углубленно, и вам нужно ознакомиться с дополнительными ресурсами, исследованиями, а иногда даже с базовыми математическими расчетами или с тем, как использовать Qt и OpenCV Выполнять низкоуровневое понимание. Реальная производительность компьютеров и операционных систем совершенно выходит за рамки этой книги. Да,Для Эта книга охватывает все алгоритмы и методы,Ваша Воля вкратце изучите их использование,использовать Способ,Рекомендации по времени и адекватности,кчтобы ты могк Продолжайте идти глубже Исследовать。

Введение в Qt

Вы слышали о нем и, возможно, даже существовали, даже не подозревая об этом. Он является основой для многих всемирно известных коммерческих приложений и приложений с открытым исходным кодом, таких как VLC Player,Calibre ждать. Qt рамка считается большинством так называемых богатств 500 Сильная компания использует, мы даже не можем дать ей определение. Это популярный процесс среди многих команд разработчиков приложений и компаний по всему миру. Итак, мы начнем со вступления и продолжим дальше.

Сначала давайте кратко представим Qt рамки, которые помогут нам не сбиться с пути. Ничто не заставит вас полюбить фреймворк больше, чем четкое представление обо всем этом. Следовательно, Qt Framework — это среда разработки приложений с открытым исходным кодом, в настоящее время разрабатываемая Qt Создание и управление компанией, он широко используется в создании богатых приложений и в платформенных приложениях, которые можно найти запускать на очень небольшом количестве различных операционных систем или устройств без какой-либо нагрузки. для разбит дальше, с открытым исходным кодом - одна из наиболее очевидных частей. Это означает, что вы можете получить доступ Qt из всех исходных кодов. иметь богатый внешний вид, мы имеем в виду Qt Рамка на депозите существует достаточно ресурсов и функций, чтобы писать очень красиво и применять. Что касается последней части, кроссплатформенности, это в основном означает, что, например, если вы используете Microsoft Windows Операционная система Qt приложение для разработки рамкимодульидобрый, вы можете настроить его как есть MacOS или Linux Скомпилировать его руководить Строить. , не меняя (почти) никакого кода, если вы не используете ничего, кроме Qt Или может быть конкретная платформа из библиотеки.

На момент написания Qt рамка (сокращенно илик) Qt)изверсиякнигадля Версия 5.9.X, содержащая множество инструментов, может использоваться для разработки приложений практически любого назначения. Qt Модули разделены на следующие четыре основные категории:

  • Qt Essentials
  • Дополнения Qt
  • дополнительные модули
  • Модуль предварительного просмотра технологий

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

Qt Essentials

это Qt Обещание можетсуществоватьвсе затронутоподдерживатьплатформа Использовать наизмодуль。 Они в основном Qt изBasic и содержит почти все Qt приложениеиспользоватьизбольшинстводобрый. Qt Essential модульвключить все Универсальныймодульидобрый. 确实хотеть УведомлениеУниверсальныйслово,потому чтодля Это правильнода Этимодульизиспользовать。 Ниже приводитсядля быстрого Исследоватьсуществующиймодульи поставкакссылка на публикациюиз简хотеть Список表:

модуль

иллюстрировать

Qt Core

этодругоймодульиспользоватьизядро, не связанное с графикойдобрый.

Qt GUI

этографикапользовательинтерфейс(GUI)компонентыизбазадобрый. К ним относятся OpenGL。

Qt Multimedia

это Аудио,видео,транслироватьикамера Функция издобрый.

Qt Multimedia Widgets

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

Qt Network

это упрощает сетевое программирование,Более портативный издобрый.

Qt QML

это QML и JavaScript языкиздобрый.

Qt Quick

Даондекларативныйрамка,Для использования пользовательского интерфейса создайте высокодинамичное приложение.

Qt Quick Controls

это многоразовое использование на основе Qt Quick из UI Элементы управления для создателяClassic израбочий столстильпользовательский интерфейс.

Qt Quick Dialogs

Эти типы создают системные диалоговые окна в приложениях Qt Quick и взаимодействуют с ними.

Qt Quick Layouts

Эти макеты используются для организации пользовательского интерфейса на основе Qt Quick 2 изпроектизпроект。

Qt SQL

этоиспользовать SQL руководить Интеграция с базой данныхиздобрый.

Qt Test

это для юнит-теста Qt Приложение и библиотека отличные.

Qt Widgets

этоиспользовать C++ расширение виджета Qt GUI издобрый.

связанный Подробнее,Пожалуйста, обратитесь кздесь

пожалуйста, обрати внимание,Невозможно охватить все вопросы в этой книге.,и Вероятно, нетдаонхорошая идея,И существовать большую часть времени,нас Воля坚持нас需хотетьизлюбоймодульидобрый; Однако к концу книги вам будет легко исследовать ее самостоятельно. Qt Весь мощный измодульидбрый. В следующей из главы вы, Воля, узнаете, как существовать ваш изпроект, включенный в м одулидбровый, поэтому сейчас существует, давайте не будем тратить слишком много времени на беспокойство и просто сосредоточимся на учебе. Qt Истинное значение слова «из» и его существование составляют содержание нашего сознания.

Дополнения Qt

Этот модуль может быть доступен на всех платформах или недоступен. Это означает, что они используются для разработки конкретных функций, а не Qt Essentials из Универсального характера. Эти типизмодульные примеры Qt 3D,Qt Поддержка печати, Qt WebEngine,Qt Bluetooth и т.п. ожидание. Вы всегда можете обратиться к Qt Документ кполучить Полный список этих модулей, на самом деле их слишком много, чтобы их можно было перечислить здесь. существовать большую часть времени,Вам нужно только просмотреть краткое описание использования учемодулиз.

связанныйэтоиз Подробнее,Ты можешькссылказдесь

дополнительные модули

Эти модули предоставляют дополнительные функции и улучшают Qt из Коммерческая лицензия. даиз, как вы уже догадались, эти модули существуют только Qt изплаченная версия доступна в этой книге и существует Qt из Версии с открытым исходным кодом и Бесплатные версии не представлены в этой книге, но они являются основной целью издапомощь нашего Заканчивания очень специфических задач, которые вообще не требуются в этой книге. Вы можете использовать Qt Страница документации для получения списка.

связанныйэтоиз Подробнее,Ты можешькссылказдесь

Модуль предварительного просмотра технологий

Как следует из названия,Этимодульв целостностьсуществовать не гарантирует правильную работу во всех случаях из。 Они могут содержать или не содержать bug или другие проблемы, и они все еще находятся в стадии разработки и для тестирования Обратная связь из предварительного просмотра. Как только модуль будет разработан и достаточно доработан, его можно найти упомянутое ранее из другого доброго псевдонима, используемого, и доброго псевдонима, удаленного из Технического предварительного просмотра. На момент написания эти типизмодули существовали. Qt Речь, модуль целей существования увеличивает пару Qt Приложение для преобразования текста в речь на китайском языке с поддержанием. Если ты хочешь стать зрелым человеком Qt Разработчик, то всегда сосредотачивайтесь на Этимодульобщийдаонхорошая идея。

связанныйэтоиз Подробнее,Ты можешькссылказдесь

Платформы, поддерживаемые Qt

Когда мы говорим о разработке приложений,Платформа может иметь много разных значений,включать OS Тип,ОС версиякнига,компилятортип,компиляторверсиякнигаипроцессориз Архитектура(32 бит, 64 Биты, ARM ждать). Qt Поддерживает многие, если не все, известные платформы и обычно достаточно быстр, чтобы ловить новые платформы по мере их выпуска. На момент написания статьи следующее (Qt 5.9)Платформы, поддерживаемые Список Qt. Обратите внимание, что вы не можете использоватьздесь упоминать всю платформу, но можете обучаться Qt Насколько мощна Трансплатформа:

платформа

компилятор

аннотация

Windows

Windows 10 (64-разрядная версия)

MSVC 2017,MSVC 2015,MSVC 2013,MinGW 5.3

Windows 10 (32-разрядная версия)

MSVC 2017,MSVC 2015,MSVC 2013,MinGW 5.3

Windows 8.1 (64-разрядная версия)

MSVC 2017,MSVC 2015,MSVC 2013,MinGW 5.3

Windows 8.1 (32-разрядная версия)

MSVC 2017,MSVC 2015,MSVC 2013,MinGW 5.3

Windows 7 (64-разрядная версия)

MSVC 2017,MSVC 2015,MSVC 2013,MinGW 5.3

Windows 7 (32-разрядная версия)

MSVC 2017,MSVC 2015,MSVC 2013,MinGW 5.3

MinGW Строить gcc 5.3.0(32 Кусочек)

Linux/X11

openSUSE 42.1(64 Кусочек)

GCC 4.8.5

RedHat Корпоративная версия Linux 6.6(64 Кусочек)

GCC 4.9.1

devtoolset-3

RedHat Корпоративная версия Linux 7.2(64 Кусочек)

GCC 5.3.1

devtoolset-4

Ubuntu 16.04(64 Кусочек)

Canonical Предоставить из GCC

(Linux 32/64 Кусочек)

GCC 4.8,GCC 4.9,GCC 5.3

MacOS

macOS 10.10、10.11、10.12

яблоко Предоставить из Clang

Встроенныйплатформа:Встроенный Linux,QNX,INTEGRITY

Встроенный Linux

GCC

ARM Кортекс-А, с GCC изинструментChainизIntel Board

QNX 6.6.0、7.0(armv7le и x86)

QNX Предоставить из GCC

Хозяин: РХЭЛ 6.6(64 Кусочек),RHEL 7.2(64 Кусочек),Windows 10 (64-разрядная версия),Windows 7 (32-разрядная версия)

INTEGRITY 11.4.x

Зависит от Green Hills Предоставить из INTEGRITY

Хост: 64-битный Linux

двигатьсяплатформа:Android,iOS,Универсальный Windows платформа(UWP)

Универсальный Windows платформа(UWP)(x86,x86_64,armv7)

MSVC 2017,MSVC 2015

Хост: Windows 10

iOS 8、9、10(armv7,arm64)

яблоко Предоставить из Clang

хост macOS 10.10

Android (уровень API: 16)

Google Предоставить из GCC,MinGW 5.3

Хозяин: РХЭЛ 7.2(64 Кусочек),macOS 10.12,Windows 7 (64-разрядная версия)

ссылказдесь

Как вы увидите в следующем разделе «Волясуществовать», мы «Волясуществовать». Windows Использовать на Microsoft Visual C++ 2015 (или начинается здесь, сокращенно для MSVC 2015)компилятор,потому чтодля Qt и Он широко поддерживается OpenCV (о котором вы узнаете позже). Мы тоже будем в Linux Использовать на GCC, существовать MacOS Операционная система Использовать на Clang。 Все они бесплатны, имеют открытый исходный код и Зависит. от Предлагается поставщиком операционной системы. Хотя мы в основном разрабатываем систему Воляда Окна, но только Windows Если есть какие-либо отличия от других версий, мы их представим. Linux и MacOS Операционная система. Поэтому на протяжении всей книги скриншоты по умолчанию Воляда. Windows из дефолтных скриншотов и существующих между ними нет серьезных отличий из где предоставлено Linux и MacOS скриншот,И не только путь да,Кнопка Небольшие различия между цветами и т.п.

Qt Creator

Qt Creator используется для разработки Qt Приложение IDEинтегрированная среда разработки)изимя。 В этой книге мы также будем использовать IDE Создайте проект сборки. Знаменитое изда, может киспользовать любое другое IDE (например. Visual Studio или Xcode) создать Qt применить, и Qt Creator не строить Qt Приложениехотеть求,ида Qt Программа «Установить раму» поставляется с легким и мощным IDE。 по умолчанию. Следовательно, у него естьиз Самое большое преимуществодалегко Qt Интеграция с фреймворком.

Ниже приводится Qt Creator из Скриншот, показывающий режим кода редактированияиз IDE。 В следующей главе мы объясним, как использовать Qt Creator из Подробности,Хотя мы также попробуем Волясуществовать тест позже в этой главе из раздела.,Не вдаваясь в подробности:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-kkOvmk3L-1681869945426) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/61cbbcd2-ea76-4767-8bf2-2098174f0f8b.png)]

Введение в OpenCV

Теперь пришло время представить OpenCV,Открытый исходный кодкомпьютерное зрение Библиотекаилирамка (если вам нужно), потому что для OpenCV Они сами по себе взаимозаменяемы и могут встречаться и в этой книге. Однако в большинстве случаев мы просто будем придерживаться OpenCV。 Все в порядке,Давайте сначала послушаем, что это на самом деле означает,Затемсуществовать需хотетьизместный для этогоруководитьавария。

OpenCV даана библиотека с открытым исходным кодом и кросс-платформенная для разработки компьютерного зрениеприложение. Ориентированный на скорость и производительность, он содержит сотни алгоритмов в различных модулях. Этимодуль Также частьдля Два видатип:MainиExtraмодуль。 OpenCV Основные только модули OpenCV Все модули создаются и поддерживаются сообществом, и они да OpenCV Предоставить из Пакет по умолчаниюизчасть。

Это связано с OpenCV из Дополнительные В отличие от модулей, которые более-менее да Нет сторонних библиотек и оберток из оберток, эти сторонние библиотеки и интерфейса Воля в них интегрированы. OpenCV В разработке. Ниже Приводится несколько отличается от модулятипиз Пример, и каждый из них руководить кратко иллюстрировать. Примечательно изда, OpenCV Количество модулей (иногда даже порядок да) может меняться со временем, поэтому лучше по возможности запоминать из маленького да и просто заходить OpenCV Страницы документации достаточно. Неправильный Кусочек, или если что-то не существует.

Основные модули

вот некоторые OpenCV хозяинмодульиз Пример。 Обратите внимание, что они только OpenCV Среди нескольких модулей (вероятно, это самый обширный модуль), хотя эта книга охватывает все эти модули, эта книга не существует, но она есть. OpenCV Содержит содержание, имеющее смысл для изучения, как мы существовали ранее в этой главе. Qt Я что-то в этом увидел. Вот они:

  • Основные функцииилиаббревиатурадляcoreмодуль Включатьвседругой OpenCV модульиспользоватьиз всех базовых структур, констант ифункций. Например, в этом модуле определено понятие «существующие» OpenCV Matдобрый,существоватьиз остальной части книги,нас几乎Волясуществоватькаждый OpenCV Примерсерединаиспользовать Должендобрый. Нет. 4 глава,“MatиQImage”Воля Прикрой этоитесно связанныйиз OpenCV модульки Qt рамкаиз соответствующей детали.
  • изображениеиметь дело силиimgprocмодуль Содержит множество дляизображениефильтр,Алгоритм преобразования изображений,Как следует из названия,он используется для общегоизображениеиметь дело с。 Мы Волясуществовать Нет. 6 Глава «OpenCV серединаизизображениеиметь дело с”серединапредставлятьэтотмодульи Что Функция。
  • 2D особенностьрамкамодульилиfeatures2dВключатьиспользовать Вособенностьизвлекатьисоответствоватьиздобрыйиметод。 Они Волясуществовать Нет. 7 Глава, руководить подробно изложен в разделе «Характеристики и дескрипторы».
  • видеомодуль Включатьиспользовать Вхозяин题изалгоритм,Например, оценка движения,вычитание и трассировка фона. Модульк и OpenCV издругойдобрыйпохожиймодуль,Волясуществовать Нет. 9 глава,“видеоанализировать”серединапредставлять。

Дополнительные модули

как упоминалось ранее,Дополнительные модулихозяинхотетьда Нет.трехсторонний Библиотекаизобертка,этот意味着это们только Включатьинтегрированный Этимодульнеобходимыйизинтерфейсилиметод。 Примердополнительные модули Волядаtextмодуль。 Этот модуль содержит изображения или для существования OCRоптическое распознавание символов)серединаиспользоватьтекст Обнаружениеизинтерфейс,И вам, Воля, также нужны эти сторонние модули, чтобы руководить этой работой.,поэтому Нет涉и Эти Нет.трехсторонниймодуль。 Не входит в эту книгу, но вы всегда можете просмотреть ее. OpenCV Документ кполучить Дополнительные обновленный список модулей и способы его использования.

связанныйэтоиз Подробнее,Ты можешькссылказдесь

OpenCV поддерживатьизплатформа:как упоминалось ранее,существуют разработки приложений,платформане толькода Операционная система. Поэтому нам необходимо знать OpenCV какие операционные системы поддерживаются, архитектура процессора и компилятор. OpenCV да высота по платформеиз, почти как Qt Аналогичным образом вы можете настроить систему для всех основных операционных систем, включая Windows,Linux,macOS,Android и iOS) разработка OpenCV приложение. Как мы увидим позже, мы будем Windows Использовать на MSVC 2015(32 Кусочек)компилятор,существовать Linux Использовать на GCC, существовать MacOS Использовать на Clang。 Также необходимо отметить изда, нам нужно самим использовать OpenCV из исходного кода для сборки OpenCV,Потому что для в настоящее время,Пока что для вышеуказанного компилятор предлагает предварительно построить двоичный документ. Но да, как вы увидите позже, Воляиз, если у вас есть правильный инструментиллюстрировать, вы можете легко выполнить любую сборку операционной системы. OpenCV。

Установить Qt

существоватькнига节середина,Проводим необходимые действия,ксуществовать Полные настройки на вашем компьютере Qt SDK (Комплект разработки программного обеспечения). Мы начнем с Windows Настройки в операционной системе Qt Начни и запиши,когда понадобится. Linux(существуем из-за случаядля Ubuntu, но для всех Linux Версия релиза почти такая же)и MacOS Операционная система. Итак, начнем.

Подготовить Установить Qt

дляспособный Установитьииспользовать Qt, нам нужно сначала создать Qt счет. Хотя это и не является обязательным, тем не менее настоятельно рекомендуется, поскольку вы получите доступ ко всему с помощью этой единой бесплатной учетной записи. Qt。 дляхотеть Установитьиз Qt из Любая последняя версия, которая вам нужна Воля Qt Учетные данные учетной записи создаются только тогда, когда Qt Его можно использовать только после создания учетной записи. для этого, прежде всего, вам нужно использовать свой любимый доступ из браузера Qt веб-сайт. Связьсуществоватьздесь

Даэтоизскриншот:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-QDTI6m05-1681869945427) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/60ac20d4-7d32-462c-b005-5671d08c06f8.png)]

существоватьздесь,тыдолжениспользовать“Авторизоваться”кнопканижеиз“создавать Qt Страница учетной записи для использования вашего адреса электронной почты. Процесс практически одинаков для любого онлайн-аккаунта, такого как создатель. Вас могут попросить ввести изображение проверочного кода, чтобы доказать, что вы не робот, или нажать на ссылку активации в электронном письме. Заканчивать Qt После того, как запрос из процесса, вы Воля сами из Qt Пользователь учетной записи, это ваш адрес электронной почты и пароль. Пожалуйста, запишите это, так как оно понадобится вам позже. С этого момента мы зовем вас для Qt Учетные данные учетной записи.

Где его взять?

На этом этапе мы начинаем загрузку Qt Требуется разработка иинструмент. Но с чего начать? Qt проходить Qt На странице загрузки представлены все официальные релизы из Версии. здесьдаон Связь

Если Открыть браузер и перейти на предыдущую веб-страницу,Воля увидит очень простую веб-страницу (хорошо похожую на программу просмотра файлов),Затемты需хотетьотсерединас ХОРОШОвыбирать合适издокумент:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-fBOjL6eM-1681869945427) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/f660b231-48ae-4b25-a118-552ea9fcdffe.png)]

Все официальные инструменты Qt опубликованы здесь.,И ты, Воля, видишь,Last ModifyСписок Воля Всегдасуществоватьизменять。 Некоторые записи встречаются реже, другие — чаще. в настоящий момент,Мы не будем подробно останавливаться на содержимом каждой папки и их назначении.,Но да, как вы увидите далее в этой книге, «Волясуществовать»,Почти все, что нам нужно, находится в одном файле Установить,иqtв папке。 поэтому,проходитьщелкнутькаждыйвход,Перейдите кк Папка загрузки:qt/5.9/5.9.1/

Вы обнаружите, что тот же контент был добавлен в URL-адрес браузера.

ты должен отметить,Когда вы посетите эту страницу, возможно, появится более новая версия изверсии.,или Эта копия может быть больше недоступна,поэтомуты需хотетьотвперед面упомянулиз Qt Страница начать загрузку, а затем постепенно Qt versionпапка。 или ВОЗ,Вы можете использовать Qt скачатьхозяин页серединаизСсылка на архиввсегда иметь доступквпередиз Qt Версия.

Ниже приводится Вам необходимо скачать издокумент из предыдущей папки: для Windowsqt-opensource-windows-x86-5.9.1.exe для macOSqt-opensource-mac-x64-5.9.1.dmg для Linuxqt-opensource-linux-x64-5.9.1.run

этопродвигать Строить Qt Библиотека,и содержатькаждыйупомянулиз Операционная системавесь Qt SDK。 Это означает, что вам не придется строить его самостоятельно. Qt библиотеки могут их использовать. Эти файлы установки обычно содержат следующее содержимое:

  • Qt Creator(версиякнига 4.3.1)
  • Каждая операционная система поддерживает всю архитектуру компиляторов из готовых библиотек:
    • Windows Рабочий стол, Windows Mobile
    • рабочий стол Linux
    • MacOS рабочий столи iOS
    • Android(существоватьвсеплатформаначальство)

Пользователи Windows:Qt Пакет установки также включает в себя MinGW компилятор,Да Зависит от нас Воляиспользовать другой компилятор, а именно MSVC 2015 год, так что вы фактически не имеете к этому никакого отношения. Хотя установить его не помешает.

Как установить?

Вам необходимо выполнить загрузку из Установить файл, чтобы начать установку. Если вы используетеизда Windows или MacOS операционная система, затем Просто бегискачатьиздокумент. Да,Если вы используетеизда Linux,но Может能需хотеть先делатьскачатьиз.runфайл вдляисполняемый файл,Затем Чтобы быть практичнымбегатьэто。 Можно найти в Linux Выполните в системе следующую команду, чтобы сделать исполняемый файл установщика:

Язык кода:javascript
копировать
chmod +x qt-opensource-linux-x64-5.9.1.run

или ВОЗ,Ты можешьк Простой地Щелкните правой кнопкой мышищелкнуть.runдокумент,И используйте диалоговое окно «свойство», чтобы сделать его исполняемым:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-RLfoDLL8-1681869945428) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/6cc75c84-7645-4be9-9dbf-7787a676c7e8.png)]

пожалуйста, обрати внимание,Даже если ничего не скачано,Вам все еще необходимо работающее подключение к Интернету.,Вот этотдадля Понятно确认тыиз Qt Учетные данные учетной записи. Запустить Установить программу Волядля отображения следующей серии необходимых вам диалоговых окон. Если в диалоговом окне достаточно изиллюстрировать, убедитесь, что вы прочитали прочитанное и предоставили необходимое содержимое, а затем нажмите «Далее», «Согласен» или добрую кнопку, чтобы продолжить. Как показано на следующем снимке экрана, вам необходимо предоставить Qt учетные данные для продолжения установки. Эти диалоговые окна одинаковы во всех операционных системах:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-wDY29W8z-1681869945428) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/2b7735a9-b235-4884-a098-d362c9b6eda4.png)]

Остальные диалоговые окна здесь не показаны.,Но они почти говорят сами за себя.,и,Если вы когда-либо существовали, установите любое приложение на любом компьютере.,Тогда вы обязательно увидите доброе похожее из диалогового окна,ив целом Нет需хотетьверно Чторуководитьпредставлять。

Пользователи Windows

Установить Windows версия Qt , убедитесь, что в диалоговом окне «Выбор компонента» msvc2015 32 Кусочек» рядом с флажком из. Оставшаяся часть не является обязательной, но стоит отметить: «Установить всю платформу» (или существовать). Qt позвонил комплекты) часто требуют слишком много места и в некоторых случаях влияют Qt Creator изPerformance. Итак, просто убедитесь, что выбрали все, что ваша Воля действительно использует. Что касается этой книги, то это только то, что вам действительно нужно. msvc2015 32 битовые варианты.

Пользователи Windows: важные моменты из:тывозвращаться需хотеть Установить По меньшей мере启использовать Понятно C++ рабочий стол Функция развитияиз Visual Studio 2015。 Microsoft для Visual Studio Предоставляются лицензии на различные типы. Ты можешькскачать社округверсиякнигаиспользовать В教育глазиз,Этого дляиз Примера определенно хватит,идабесплатно Предоставить из,Даиспользовать Enterprise,Professional или другой типиз Visual Studio Тоже ок, пока у них есть MSVC 2015 32 Кусочеккомпилятор。

Пользователи MacOS

Если вы не в Mac начальство Установить XCode,носуществоватьдля Mac OS Установить Qt Когда Воля сталкивается со следующим диалоговым окном (или очень добрым диалоговым окном, в зависимости от вашего использования). MacOS версиякнига).

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-Q2ayThl2-1681869945428) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/3db86241-bef3-4207-89e3-92bafcca2317.png)]

Неудачная изда,Просто нажать кнопку «Установить» недостаточно.,Хотя это кажется очевидным,Да Установитькнопка Сравнивать Установить Xcode Это занимает гораздо меньше времени. Вам все равно необходимо пройти, нажмите «получить» Xcode" прямо из App Store получать Xcode чтобы гарантировать, что Mac начальство Установить Понятно Xcode,или ВОЗсуществовать Установить Qt Вы столкнетесь со следующими проблемами:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-61BctAdY-1681869945428) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/83c22d3c-2ade-479d-822b-f61a6e93e5b5.png)]

использовать App Store Установитьдо настоящего времениверсиякнигаиз Xcode (на момент написания Xcode 8.3.3 уже доступно) и продолжайте Qt Установить。

В диалоговом окне «Выбор компонента» убедитесь, что вы выбрали хотя бы MacOS Версия. ты Нет需хотеть Что余изкомпоненты,Но да Установить они не причиняют вреда,Помимо того, что оно может занимать много места на вашем компьютере.

Пользователи Linux

существоватьдля Linux Установить Qt , в диалоговом окне «Выбор компонента» убедитесь, что выбран (по крайней мере) «Рабочий стол». GCC(32 Кусочекили 64 Кусочек, в зависимости от вашей операционной системы). Вы заметите, что по умолчанию Воля Установить Qt Creator и никакие опции проверять не нужно.

Установить Заканчиватьназад,Ты Волясуществоватькомпьютерначальство Установитьк Внизприложение:

  • Qt Creator:Данассуществовать整книга Книгасередина Воляиспользуется для строительства Приложениехозяинхотеть IDE。
  • Qt Assistant:этотприложениеиспользовать ВПроверять Qt помощьдокумент. это обеспечивает вид Qt Документация и полезные функции. Тем не менее, Qt Creator возвращатьсяпоставлять Понятноначальство Внизискусство Взаимно关изпомощь,итоже есть у себяиз Встроенный и очень удобный.изпомощь Зритель。
  • Qt Designer:Это используется дляиспользовать Qt виджетдизайн GUI。 Аналогично, Qt Creator Этот дизайн также встроен, но если вы предпочитаете использовать другой IDE Вместо того, чтобы да Qt Создатель, ты еще можешь киспользовать Designer прийти на помощь GUI процесс проектирования.
  • Qt Лингвист: Эта Воляда очень полезна, если вы хотите создавать многоязычные приложения. Qt Linguist Помогает упростить перевод и интегрировать переведенные файлы в ваши файлы.

для Windows и Пользователи MacOS, это да Qt Удалить историю с окончанием, но да Пользователи Linux все еще нужно сделать еще несколько вещей, а именно: установить разработку приложений, инструменты для сборки и некоторые Linux необходимыйизбегатьчасбиблиотека. Qt всегдаиспользовать Операционная система Предоставить изкомпилятористроитьинструмент。 По умолчанию Линукс Версия дистрибутива обычно не включает этот инструмент, поскольку для него предназначен только Зависит. от Разработчикиспользовать,и未одеяло普Универсальныйсемьяиспользовать。 поэтому,хотеть Установитьэто们(еслиеще нет Установить),Скачать Заказ можно из терминала проектк:

Язык кода:javascript
копировать
sudo apt-get install build-essential libgl1-mesa-dev

Вы всегда можете обратиться к Qt Страница документации получатьвсе Linux Выдача версии обязательна, но да,существовать в этой книге мы предполагаем выдачу версии для Ubuntu/Debian。 Однако обратите внимание, что, как правило, все Linux Выпуски очень похожи.

связанныйэтоиз Подробнее,Ты можешькссылказдесь

Проверьте установку Qt

Теперь вы можете безопасно бегать Qt Creator ииспользоватьэтосоздаватьвыдающийсяизприложение. Сейчас существуют, давайте убедимся, что мы из Qt Установитьправильныйбегать。 Не беспокойтесь сейчас о деталях, потому что мы представим все подробности в этой книге, особенно если вы не знаете, что происходит за кулисами, не волнуйтесь. Просто беги Qt Creator ив соответствии с ВнизпоказыватьизбольшойNew Projectкнопка,Как показано ниже:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-iN5IvLjI-1681869945429) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/af055e80-4a21-4800-8f41-442231a3d06d.png)]

существование появляется следующим в окне,Выберите «Применить»,“Qt Widgets Применить», а затем нажмите «Выбрать», как показано на следующем снимке экрана:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-iFF1uTuW-1681869945429) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/f8cadd85-d247-4ebf-80dc-17a0f2f0020d.png)]

существовать в следующем окне,Вам необходимо указать имя и папку (Волясуществовать где создательтестпроекта),Затем Нажмите «Далее» продолжается. Если вы хотите для Qt проектиспользовать специальную папку, убедитесь, что установлен флажок «Использовать как проект Кусочек по умолчанию». Вам нужно сделать это только один раз, и тогда все файлы окажутся в этой папке. Теперь существует, нам нужно только ввести имя и путь, потому что для этого нам нужен только тест Qt Установить и нажать Далее. Ниже вы видите скриншот доброго похожего контента:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-zHWchdwc-1681869945429) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/762b92eb-d656-47f6-a459-af6db76b22f7.png)]

существовать в следующем окне,ты需хотетьвыберите один Место谓из Kit построить свое предприятие. выберите одинкDesktop Qt 5.9.1началоизимя,Затем нажмите «Далее». В ответ на Qt Установить процесс выбора компонентов,У вас может быть несколько вариантов существования здесь.,и Выбирать决Всистеманачальство Установитьиз Операционная системаикомпилятор,У вас может быть несколько пакетов инструментов.,ЧтоимякDesktopначало,поэтомуубеждатьсявыбиратьнас Волясуществоватькнига Книгасерединаиспользоватьизкомпилятор,Как показано ниже:

  • Windows начальствоиз msvc2015 32 Кусочек
  • MacOS начальствоиз Clang
  • из GCC в Linux

После выбора правильного инструмента в соответствии с вышеупомянутым инструментом,Можетк Нажмите «Далее»продолжатьруководитьдействовать:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-FgrLhZ6w-1681869945429) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/d3909ddb-764f-45b9-8a9d-2d5da50c355c.png)]

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

[Передача изображения по внешней ссылке не удалась. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-WI9d2I4C-1681869945430) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/e4ba211e-2cc0-45a2-8fad-525be8bae0a9.png)]

существоватьнаконецодинокноначальствощелкнуть“Заканчивать”кнопканазад,ты Воля Входить Qt Creator серединаиз“редактировать”модель。 Мы представим в следующей главе Qt Creator из разных аспектов,поэтому,сейчассуществовать,Толькощелкнуть“бегать”кнопка(илив соответствии сCtrl + R)Прямо сейчас Можетначинатькомпилировать(и清нулевой)тыизтестприложение,Как показано ниже:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-S1NZ0RCI-1681869945430) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/d98e09b0-ad61-43fb-a545-7588ab79b165.png)]

В зависимости от скорости компьютера, Заканчиватьпроцесс Сборка Воли занимает некоторое время. Через некоторое время вы должны увидеть тест (и в первую очередь) Qt Приложение работает. Это просто пустое приложение, так выглядит скриншот ниже, его цель — убедиться, что мы Qt Установитьможетв соответствии спредварительно期бегать。 Очевидно, существуют разные из операционной системы, пустые из Qt Приложения могут выглядеть немного по-другому, и разные визуальные параметры могут влиять на отображение общего цвета или окна. Однако ваше новое приложение должно выглядеть точно так же, как окно, показанное здесь (очень похоже):

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-MmvvUDrb-1681869945430) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/b603d19a-b7a5-4156-bb2f-7b345c225b67.png)]

Если ваше приложение не отображается, обязательно прочтите «Читатьиллюстрировать» еще раз. Также убедитесь, что нет конфликтов Qt Установитьили Другие возможные помехи Qt Установитьизнастраивать。 связанный Qt Creator или Другие Qt инструмент неожиданная строка для ответа, всегда обращайтесь к странице документации и Qt Сообщество. В течение долгого времени Qt Всегда являясь проектом с открытым исходным кодом, он вырос для большой и лояльной группы людей, которые стремятся существовать и делиться своими знаниями и ответами в Интернете. Qt Одноранговый пользователь сталкивается с проблемами. Поэтому обратите пристальное внимание на Qt Сообщество да хорошая идея, так как для вас уже есть доступные для доступа Qt Форум из объединения Qt счет. Датыдляпродолжатьруководить Qt Установитьпроцессисоздаватьизпользовательимяипароль。

Установить OpenCV

существуютэта главаиз этой части,Вы, Воля, узнаете, как собрать OpenCV из исходного кода. Как вы видите за Волясуществоватьиз,иикнига节иззаголовок напротив,наси Нетдадействительнокдобрый похож на режим Qt УстановитьизПриходить Установить OpenCV。 Дапотому чтодля OpenCV в целом Нетдлявсекомпиляториплатформа Обеспечить предварительное Строитьдвоичныйдокумент,ина самом делеэто根книга Нетдля MacOS и Linux Обеспечить предварительное Строитьдвоичныйдокумент. существовать OpenCV издо настоящего времени Win пакет, который содержит только 64 Кусочек MSVC 2015 из готовых двоичных файлов, эти двоичные файлы и Воляиспользоватьиз 32 Кусочекверсия не совместима, поэтому создайте свою OpenCV Приходите учиться, как руководить Установитьда очень хорошую идею. Он также имеет сборки, соответствующие вашим потребностям: OpenCV рамка Библиотекаиз Преимущества. Возможно, вы захотите исключить некоторые параметры, чтобы упростить OpenCV Установить,или ВОЗМожет能хотетьдлядругойкомпилятор(Например MSVC 2013)руководить Строить.поэтому,Причин много требует, чтобы вы сами собирали исходники OpenCV。

Подготовьтесь к сборке OpenCV

互联网начальствоизбольшинствооткрытьисходный кодрамкаи Библиотека,или ВОЗПо меньшей мереданадеюсь сохранить IDE Нейтрален по отношению к библиотеке и библиотеке (то есть может киспользовать любую IDE руководить Конфигурацияи Строитьпроект,к И работает независимо от конкретного IDE-изпроекта),использовать CMake илидобрыйпохожийизmakeсистема。 Я думаю, это также ответит на такие вопросы, как «Что именно мне нужно?» CMake? ”и“для чего они не могут просто предоставить библиотеку и использовать ее Заканчивать? «Проблема доброгоиз похожа на другие проблемы. Поэтому нам нужно CMake можетиспользоватьисточник Конфигурацияистроить OpenCV。 CMake даанское кроссплатформенное приложение с открытым исходным кодом, которое позволяет Конфигурации создавать проекты с открытым исходным кодом (или приложения, библиотеки и т. д.), и вы можете найти Загрузите ииспользовать на всех операционных системах, упомянутых в предыдущем разделе. На момент написания этой книги она была доступна на сайте CMake 网站Страница загрузкискачать CMake 3.9.1 версия。

Прежде чем двигаться дальше, убедитесь, что «Установить Существовать» загружено и установлено на вашем компьютере. CMake Установить Нет ничего особенного, на что следует обратить внимание, за исключением того, что вам нужно убедиться, что вы установили Установить. GUI версиякнигаэтотодин事实снаружи,Данас Волясуществуют в следующей частииспользоватьизсодержание,иэтода Предоставить из Связьсерединаизпо умолчаниюпараметры. Ранее.

Где взять OpenCV?

OpenCV существоватьего сайтиз“выпускать”под страницейподдерживатьего официальныйи Стабилизироватьверсиякнига:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-BCp1Yn9E-1681869945430) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/324afce6-fba7-400b-997e-476f4d4e00ee.png)]

существоватьздесь,Вы всегда можете найти приложения для Windows,Android и iOS последней версии с исходным кодом OpenCV.,документипредварительно Строитьдвоичныйдокумент. По мере выхода новой версии они будут добавлять в верхней части страницы. На момент написания этой книги существовала версия 3.3.0 да OpenCV издо настоящего времениверсиякнига,Это данас Воляиспользоватьиз Версия. Итак, без лишних слов, вам следует приступить к руководить и подать клик 3.3.0 версияиз «Источник» — ссылка для скачивания исходного кода. Воляsource zipдокументскачатьприезжатьтывыбиратьизпапкасередина,Добыча воляиц,И запишите путь извлечения,потому чтодляпозженас Воляиспользоватьэто。

Как построить?

Сейчас существуют, у нас есть сборка OpenCV Все необходимые документы у нас в наличии CMake GUI приложение для запуска процесса. Если это правильно, установите CMake, вы сможете скачать его с рабочего стол, меню «Пуск» или док-станция — это зависит от вас из Операция система.

Пользователи Linux должен запустить проект в существующем терминале и затем продолжать руководить OpenCV Строить. Это в основном OpenCV сам из зависимостей, требующих существования Конфигурация Кусочек перед его сборкой:

Язык кода:javascript
копировать
sudp apt-get install libgtk2.0-dev and pkg-config 

После запуска приложения CMake GUI вам необходимо настроить следующие две папки:

  • “исходный кодсуществоватьгде”папкаотвечатьнастраиватьдлятыскачатьиизвлекать OpenCV исходный кодиз Кусочекнабор
  • Может к Воля "генерировать бинарные файлы из КусочекSET" установить папку для любой папки,Дав целомсуществоватьисходный кодв папке Создайтеимядляbuildизребенокпапкаи Воляего выбордлядвоичныйдокументпапка

После установки этих двух папок,Вы можете нажать кнопку «Конфигурация», чтобы двигаться дальше.,Как показано на следующем скриншоте:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-buoV5aND-1681869945430) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/cc3d2eb5-459b-4b2d-a083-c8728000a9e1.png)]

Нажатие кнопки «Настроить» запустит процесс настройки. Если папка сборки еще не существует, вас могут попросить указать папку, и вам нужно будет ответить на нее, нажав кнопку «да». Если вам все еще кажется, что вы просто повторяете то, что написано в книге, не волнуйтесь. Все это усвоится, когда вы продолжите читать эту книгу.сейчассуществовать,让настолькососредоточиться насуществовать сборку на вашем компьютере и Установить OpenCV。 Учтите, что этот процесс установки не так прост, как нажатие нескольких кнопок «следующие шаги», и как только вы начнете, используйте OpenCV и все будет иметь смысл. Поэтому в окне появится следующее существование, выберите правильный изгенерировать и нажмите "Заканчивать". связанныйкаждый правильный тип генерации в операционной системе, см. киллюстрировать:

Пользователи Windows:ты需хотетьвыбиратьVisual Studio 142015。пожалуйстаубеждатьсяты未выбирать ARM или Win64 версиякнигаили Другие Visual Studio Версия. MacOS и Пользователи Linux:ты需хотетьвыбиратьUnix Makefile

Ты Волясуществовать CMake После просмотра краткого описания процесса «Заканчивать» вы можете установить различные параметры для конфигурации вашего устройства. OpenCV Строить. 有многопараметр需хотеть Конфигурация,поэтомунас Воля直接影响那些直接影响насизпараметр。

убеждаться选серединаBUILD_opencv_worldрядом с опциейизфлажок。 Это позволит всем OpenCV модуль встроен в единую библиотеку. поэтому,Если вы используетеизда Windows, есть только один, содержащий все OpenCV Функция из DLL документ. Как вы увидите позже, когда захотите развернуть компьютерное При этом применяется зрение. Из преимуществ можно использовать только один DLL Просто файл. Конечно, очевидным недостатком этого является то, что размер вашего приложения будет немного больше. Да То же,Простота в развертывании «Волясуществованк» оказывается еще более полезной.

После изменения параметров сборки необходимо еще раз нажать кнопку «Настроить». Ждем повторной настройки Заканчивать,наконецщелкнуть“генерировать”кнопка。 Эта Воля заставляет тебя из OpenCV Внутреннюю версию можно скомпилировать. существуют в следующей части,еслииспользовать Windows,MacOS или Linux операционной системы, вам нужно выполнить что-то другое из Заказ. поэтому,Они есть:

Пользователи Windows:Перейти кты先впередсуществовать CMake Средние настройки из OpenCV строитьпапка(существоватьнасиз Примерсерединадляc:\dev\opencv\build)。 Должен быть один Visual Studio 2015 решение (т. MSVC проектизтип), вы легко сможете выполнить и построить OpenCV。 Вы также можете нажать сейчас CMake начальство“генерировать”кнопкарядомиз“Открытьпроект”кнопка。 Вы также можете просто запустить Visual Studio 2015 И Открытьyou только для OpenCV Создайте документ решения.

Открыть Visual Studio После этого вам необходимо Visual Studio В главном меню выберите «Пакетная генерация». СразусуществоватьBuildВниз:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-p7YQk38a-1681869945431) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/93a01570-7e06-4113-b9c1-9adb6fc68bf3.png)]

убеждатьсясуществоватьBuildСписоксерединадляALL_BUILDиINSTALL启использовать Понятнофлажок,Как показано на следующем скриншоте:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-USx6bmC3-1681869945431) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/4f696460-eea4-4f6b-8bcf-107d4fc5bf1d.png)]

для MacOS и Пользователи Linux:существоватьпереключиться насуществовать CMake серединавыбиратьизBinariesпапканазад,запустить экземпляр терминала и выполнить каказ. Чтобы переключиться на определенную папку,ты需хотетьиспользоватьcdЗаказ。 Входить OpenCV Папка сборки (должна быть да Открыть CMake После выбора «Домашняя папка») необходимо выполнить каказ. система Воляхотеть求тыпоставлятьуправлятьпароль,Просто укажите пароль,Затемв соответствии сEnterПрямо сейчас Можетпродолжатьстроить OpenCV:

Язык кода:javascript
копировать
 sudo make

Эта Воля запускает процесс Сборка может занять некоторое время в зависимости от скорости вашего компьютера. После того, как все библиотеки будут построены, индикатор выполнения достигнет 100%。

После долгого ожидания остался всего один Заказ для MacOS и Пользователи Исполнение Linux. Если вы используетеизда Windows, вы можете отключить Visual Studio IDE и перейдите к следующему шагу.

MacOS и Пользователи Linux:строить Заканчиватьназад,существовать до закрытия экземпляра терминала,пожалуйстасуществоватьвсе еще Кусочек В OpenCV buildпапкасерединаиз Состояние Вниз执ХОРОШОк Вниз Заказ:

Язык кода:javascript
копировать
sudo make install

для Нет Пользователи Windows, этот последний Заказ Воля убедитесь, что на вашем компьютере есть Установить OpenCV и полностью доступен. Если вы ничего не пропустили в этом разделе, можете продолжить. Вы готовы использовать OpenCV рамка Приходитьстроитькомпьютерное зрениеприложение.

Настройка установки OpenCV

Помните, мы упомянули OpenCV Кроме того, вы хотите научиться выживать Qt серединаиспользоватьэто吗? Ну, Qt Предоставляет очень простой метод использования. найти втыиз Qt Любая сторонняя библиотека, включенная в проект, например. OpenCV。 дляспособныйсуществовать Qt серединаиспользовать Для OpenCV вам необходимо использовать специальный файл под названием PRO документ. PRO Файл да используется для добавления модуля Нет. и Воля, который содержит существование. Qt проектсерединаиздокумент. Обратите внимание, что вам нужно сделать это только один раз, чтобы существовать из оставшейся части вашего проекта. Qt Очень важная (но очень простая) часть конфигурации.

первыйсуществоватьтывыбиратьизпапкасередина Создайтетекстдокумент. Я рекомендую использовать OpenCV Создайте такую ​​же папку из папки, чтобы для этого можно было обеспечить все необходимые преимущества. будути OpenCV Все соответствующие файлы помещаются в одну папку. Но да, технически говоря, файл может находиться где угодно на компьютере. Волядокумент重命имядляopencv.priииспользоватьлюбой Редактирование текстаустройство Воля Что Открыть,Затемсуществовать PRO Напишите в файле следующее содержимое:

Пользователи Windows:приезжатьв настоящий моментдляконец,тыиз OpenCV Файл библиотеки должен быть таким же, как и ваш предыдущий файл. CMake Настройки включены OpenCV в папке сборки. buildпапкасередина Должен быть одинимядляinstallизребенокпапка,Чтосередина Включатьвсенеобходимыйиз OpenCV документ. Фактически, теперь вы можете удалить все остальное и просто сохранить эти файлы, если вам нужно освободить место на вашем компьютере, но да Воля OpenCV Всегда полезно хранить исходный код на своем компьютере, он нам особенно нужен для последних нескольких глав, а Воля охватывает более продвинутые версии. OpenCV тема. Следовательно, это да PRO из содержимого в файле (обратите внимание на путь разделителя, существование всегда требуется независимо от того, какую операционную систему использовать) PRO документсерединаиспользовать/):

Язык кода:javascript
копировать
INCLUDEPATH += c:/dev/opencv/build/install/include 
Debug: { 
LIBS += -lc:/dev/opencv/build/install/x86/vc14/lib/opencv_world330d 
} 
Release: { 
LIBS += -lc:/dev/opencv/build/install/x86/vc14/lib/opencv_world330 
} 

Незачемиллюстрировать,существоватьвперед面изкодсередина,Если существуют Конфигурация CMake, используйте другие папки,Вам нужно заменить путь.

MacOS и Пользователи Linux:Только Воляк Внизсодержание放入opencv.priдокументсередина:

Язык кода:javascript
копировать
 INCLUDEPATH += /usr/local/include 
 LIBS += -L/usr/local/lib \ 
    -lopencv_world 

Пользователи В Windows есть еще одна вещь — да Воля. OpenCV DLLsпапкадобавить вPATH环境переменнаясередина。 Только Открыть“системасвойство”окно,ЗатемсуществоватьPATHсерединадобавить водинновыйвход。 это们в целомиспользовать;отдельный,поэтомупосле Толькодобавить водинновыйиз Прямо сейчас Может。 Обратите внимание, что этот путь относится только к Windows Зависит от операционной системы и можно найти в который найден OpenCV изDLLдокумент,отиупрощать Понятнопроцесс сборки。 Linux и MacOS изпользователю не нужно ничего с этим делать.

Проверьте установку OpenCV

Самый худший момент позади,нассейчассуществовать Подготовитьидти глубже Исследоватькомпьютерное мир зрения и начни использовать Qt и OpenCV Постройте захватывающее изприложение. Хотя последний шаг называется «тест OpenCV", но на самом деле это да, Воля хочет писатьиз Нет.а Qt + OpenCV Приложение настолько простое, насколько кажется на первый взгляд. существования В этом разделе мы ничего не беспокоим о том, как все работает и что происходит за кулисами, а лишь следим за тем, чтобы мы делали это правильно. нфигурация всего содержимого и предотвращение бесполезной траты времени. Конфигурация, связанная с проблемами содержания, описана далее в книге. еслитыужев соответствии с照иллюстрироватьруководить Понятновседействоватьикправильныйиз顺序执ХОРОШОПонятновсеобратитесь к令,Так что до сих пор для существования,Вам не нужно ни о чем беспокоиться,Дабольшинствопроверять,Это данассейчассуществоватьхотеть做из。

поэтому,нас Воляиспользоватьодин Нет常Простойизприложение Приходитьпроверятьнасиз OpenCV Установите, приложение Воля берет файл изображения с жесткого диска для чтения и отображает только его. Аналогично, не беспокойтесь о каких-либо деталях, связанных с кодом, поскольку все эти детали рассматриваются в следующих главах, и просто сосредоточьтесь на текущей задаче, а именно: OpenCV Установить。 Первый запуск Qt Создатель, затем создайте приложение «Новое из Консоли». существоватьтест Qt Установить До этого вы уже играли в очень похожий изквест. Вам необходимо следовать именно изиллюстрировать, за исключением того, что вы должны использовать Qt Widget снаружи,возвращатьсядолженубеждатьсявыбиратьQt Console Application。 Повторите все шаги, как и раньше, до последнего шага. Qt Creator режим редактирования。 если询问тысвязанныйстроитьсистемаизинформация,пожалуйставыбиратьqmake,По умолчаниюдолжен быть выбранqmake,поэтомуты Толькохотетьпродолжатьвперед进Прямо сейчас Может。 убеждатьсядлятыизпроект命имя,НапримерQtCvTest。 На этот раз вместо того, чтобы нажимать кнопку «Проектировать», дважды щелкните по проекту. PRO Файлы для вас найти в Qt Creator Найдите файл в Проводнике в левой части экрана и затем «Существупроектиз». PRO Добавьте следующие строки в конец файла :

Язык кода:javascript
копировать
    include(c:/dev/opencv/opencv.pri) 

пожалуйста, обрати внимание,на самом деле,Даотвечатьвсегда避免изжестко закодированныйтип,Как мы увидим в последующих главах «Волясуществовать».,нас Воляписать适использовать Ввсе Операционная системаболее сложнаяиз PRO документ. Не нужно менять ни одной строки; Да,Зависит только для нас дасуществоватьтест usiz OpenCV Установить,поэтомусейчассуществовать Можеткруководить Некоторыйжестко закодированный Приходитьупрощать Некоторыйиметь значение,Не перегружая вас деталями конфигурации.

поэтому,Вернемся к тому, что мы делаем,когдатыпроходитьв соответствии сCtrl + Sдержать PRO документчас,ты заметишьбыстрыйизпроцессисуществоватьпроект Просматриватьустройствоиopencv.priдокумент Воля出сейчассуществовать资источникуправлятьустройствосередина。 Ты можешьк随часотэтот处Изменятьopencv.priизсодержание,Да Ты можешь能навсегда远Нет需хотетьэтот样做。 Не обращайте внимания на добрый комментарий в строке и убедитесь, что вы PRO Файлы и существуют здесь из файлов похожи:

Язык кода:javascript
копировать
 QT += core 
 QT -= gui 
 CONFIG += c++11 
 TARGET = QtCvTest 
 CONFIG += console 
 CONFIG -= app_bundle 
 TEMPLATE = app 
 SOURCES += main.cpp 
 DEFINES += QT_DEPRECATED_WARNINGS 
 include(c:/dev/opencv/opencv.pri) 

проектиз PRO Эта простая строка кода в файле, по сути, является результатом всей работы, описанной в этой главе.сейчассуществовать,нас Толькосуществоватьнасхотетьиспользовать Qt и OpenCV Строитькаждыйкомпьютерное зрениепроект включает в себя этот простой фрагмент кода для к Воля OpenCV добавить а именно Qt проектсередина。

существуют в следующей главе,нас Воляизучать Qt серединаиз PRO файл и весь предыдущий код. Но да, теперь существование давайте двигаться дальше, зная, что за нас отвечает файл проектиз Конфигурация. Итак, последняя строка почти не требует пояснений и просто означает, что мы хотим Qt проект Добавить OpenCV Содержит заголовочный файл библиотеки.

сейчассуществовать,тына самом деле Можеткписать Некоторый OpenCV код. Открытьтыизmain.cppдокументи Изменять Чтосодержание,Сделайте его похожим на этот добрый:

Язык кода:javascript
копировать
 #include <QCoreApplication> 
 #include "opencv2/opencv.hpp" 
 int main(int argc, char *argv[]) 
 { 
    QCoreApplication a(argc, argv); 
    using namespace cv; 
    Mat image = imread("c:/dev/test.jpg"); 
    imshow("Output", image); 
    return a.exec(); 
 } 

По умолчанию,тыизmain.cppдокументотвечать Долженуже经иметьвперед面кодсерединаизбольшойчастьсодержание,Даты заметишьвершинаизincludeХОРОШОи Возьмите с меня ответственностьизкомпьютерчитать Выбиратьипоказыватьтестизображениеизтри ХОРОШО。 Вы можете заменить любой другой путь к изображению (просто сохраните его на данный момент). JPG или PNG файл), очень важно убедиться, что файл изображения сохранен и доступен, в противном случае, даже если файл изображения правильный, мы все равно можем потерпеть неудачу. Весь код в значительной степени не требует пояснений, но еще раз: Зависит только для нас датест OpenCV версии, поэтому вам сейчас не стоит заморачиваться с этими кодами, поэтому просто нажмите кнопку "запустить" для отображения вашего изображения. файл. На вашем компьютере вы должны увидеть что-то похожее на скриншот ниже:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-sQtc0h0R-1681869945431) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/17265ab6-8412-4937-8e97-06202d21059b.png)]

Подвести итог

существования В этой главе вы познакомитесь с компьютерным зрениеиз общих понятий и Qt и OpenCV рамка, и дал им общую структуру модуля, а также вкратце дал им возможность существования всей важности платформы во всех платформах. Оба поддерживаются. Вы также узнали, как существовать существовать на компьютере Qt к И как его собрать из исходного кода OpenCV。 К этому моменту вы должны чувствовать себя достаточно уверенно, чтобы даже попробовать некоторые другие сборки, помимо стандартных сборок, упомянутых в этой главе. OpenCV。 Всегда полезно исследовать некоторые неизвестные, но глубокие части этих огромных файлов, просто просматривая содержащиеся в них папки и файлы. Наконец-то вы узнали, как Конфигурация компьютера киспользовать. Qt и OpenCV Создавайте приложения и даже создайте Нет.а приложение. существуют В следующей главе вы, Воля, сначала создадите консольное приложение, а затем Преемник. Qt виджетприложение,кучитьсясвязанный Qt Creator из Подробнее. Вы также узнаете Qt проектизструктуракикаксуществовать Qt и OpenCV Межплатформенная интеграция между фреймворками. Следующая глава Воляда актуальное компьютерное в этой книге. Развитие зрения и Программирование Примеризстартов и Волядля всей книги Практический пример закладывает основу.

2. Создайте наш первый проект Qt и OpenCV.

с Qt и OpenCV рамкапредставляет Сообщество открытого исходного кода и мир к существуют уже давно, но только недавно люди начали осознавать преимущества Воляиспользования, и эта комбинация существуетсуществующеекомпьютерное зрение Очень популярен среди специалистов добро пожаловать。 。 Нам повезло, потому что мы находимся на том этапе истории развития этих двух рамокизиз, существования этих двух рамок, где они выросли достаточно, чтобы их можно было легко комбинировать практически без каких-либо усилий. Стабильность этих рамок больше не является проблемой, поскольку они иногда используются для создания очень чувствительных к закупкам аппаратных средств. Даже краткий поиск в Интернете может доказать это. Поскольку мы Волясуществовать изучаем из этой главы, Qt Creator Стал почти полностью зрелым из IDE, которая предоставляет очень простой механизм использования OpenCV интегрированныйистроитькомпьютерное зрениеприложение.сейчассуществовать,насуже经учиться Понятно Нет. 1 Глава «OpenCV и Введение в Встречаются все "Установи Конфигурация в Qt", мы Воля специализируемся только на использовании. Qt и OpenCV строитьприложение.

существоватькнига章середина,Мы Воляпроходить изучим связанный Qt Creator IDE и как его использовать, создадим проектиз и начнем работать своими руками.,потому чтодлясуществоватькнига Книгаиз Что余частьи Место Строитьлюбойсодержаниесередина,насна самом деле Всеиспользовать Qt Creator。 ты научишьсяэто Предоставить извсе好处,И изучите, для чего она существует, ее простота,Появлениеи Чувствоватьначальство Вседа Нет常强большойиз IDE。 ты научишься Qt Creator Подробное описание настроек и способы их изменения в соответствии с вашими потребностями. Вы также узнаете Qt файлы проекта, исходный код, пользовательский интерфейс ожидания. существовать Внизодин章Нет. 3 глава,“создаватьвсестороннийиз Qt + OpenCV проект", мы Волясуществовать в следующей главеиспользовать Qt Creator Все закулисные детали при создании приложения. , но в этой главе мы также представим некоторые полезные детали, которые помогут вам получить четкое представление о реальной структуре. существоватьсоздавать Приложениеначальство Внизискусствосередина Воля Крышкавсе Этихозяин题,Вам будет легко повторить эту главу, изучите здесь те же задачи для лучшего понимания.

ты должен отметить,Эту главу Воля узнал из содержания Воля помощь вы сэкономите много времени,Датолькокогдатысуществоватькомпьютерначальстводействительноповторить Понятновсе Этиина самом делеобщийдапытатьсяиспользоватьэточас,Вот почему. Вы можете использовать Qt Creator руководить C++ программирование, даже для не- Qt приложение.

наконец,нас Воляпроходить Создайтедействительныйизкомпьютерное Приложения для зрения и воля В завершение этой главы к изображениям применяются некоторые основные алгоритмы обработки изображений. книга章изглазиздаделатьтыдлякнига Книгаиз Что余часть做好Подготовить,И познакомим вас с некоторыми ключевыми словами, с которыми Воля встретится в,Например, сигнал,слот,виджетждать.

В этой главе мы рассматриваем следующие темы:

  • Конфигурацияииспользовать Qt Creator IDE
  • создавать Qt проект
  • Qt Creator серединаизвиджет
  • Создайте кроссплатформенный файл проекта Qt + OpenCV.
  • использовать Qt Creator Дизайн пользовательского интерфейса
  • использовать Qt Creator писать код интерфейса пользователя

Что такое Qt Creator?

Qt Creator и Qt рамка — это не то же самое, что да. даиз,Даверноиз; это только да Зависит от Qt рамкасоздаватьиз IDE。 Это сбивает с толку многих людей, которые несколько незнакомы с этими терминами. Итак, что это на самом деле означает? существует Очень простое определение, что означает: Вы можете использовать Qt Creator или любой другой IDE создать Qt приложение. существовать когда-нибудь, когда Qt возьмите на себя ответственность, когда рамка наполнится добрымфункцией Qt из Люди решают использовать отличное из Qt рамкакнига身создать IDE и вуаля! Один без операционной системы и C++ компилятортипиз IDE родился. Qt Creator даон IDE поддерживает это Qt Он лучше интегрирован, имеет открытый исходный код (по сути, это означает, что вы можете получить его бесплатно), он кроссплатформенный и в значительной степени включен в состав IDE Требуется для ВСЕХ инструментов. Да Qt Creator серединавырезать Приветсияиз Скриншот:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-TOFmQRdr-1681869945431) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/ea50a35d-77a4-4b97-b23d-19f54a2a8421.png)]

пожалуйста, обрати внимание,Мы обязательно будем использовать все возможности Qt Creator.,Дасуществоватьидти глубже Исследовать Извперед先知道этоиз Функциядаонхорошая идея。 Ниже приводится Qt Creator Некоторые из наиболее важных особенностей:

  • использоватьсессия Управление несколькими IDE состояние
  • Управление несколькими Qt проект
  • Дизайн пользовательского интерфейса
  • Изменить код
  • существоватьвсе Платформы, поддерживаемые Qtначальствостроитьибегатьприложение
  • Отладка приложения
  • Контекстно-зависимая помощь

В зависимости от того, что вы считаете важным, вы можете найти добавить в список больше элементов, но предыдущий из упомянутых в списке по сути да IDE(интегрированная среда разработки)изопределение,этоотвечать Должендапоставлятьразработка приложенийнеобходимыйизи绝верно必хотетьизвсе Функция изинструмент。 Кроме того, вы всегда можете проверить Qt Документация для изучения Qt Creator из Другие функции.

Обзор IDE

существуют В этом разделе мы, Воля, бродим Qt Creator из разных частей. При переезде на новое место лучше всего сначала подумать о своем окружении. тыодинначинать Вероятно, нет会Уведомлениеприезжать Эти差异,Дана самом деле,Да Нет常Взаимнопохожийиз Состояние,ты Воляпостепенно осознавать。 Ты Волясуществовать整книга Книгасерединаиспользовать Qt Creator окружающая среда, и прочитайте существование, прочтите эту книгу из всего процесса, по сути, воляиспользовать ее, и после того, как вы надеетесь, что ваша карьера будет существовать в долгосрочном личном проекте, или Исследовать。 Итак, давайте прогуляемся, начнем трогать вещи и посмотрим, что происходит на самом деле.

Вернемся к этой главе с картинкой. Вы существуете, видите здесь изда Qt Creator из начального экрана, или позже Воля увидит его да Qt Creator изрежим приветствия。 Вы можете заметить, что даже если вы установите ту же версию из этого Qt, цвет иконки здесь тоже немного другой на компьютере. Нетиспользовать担Сердце,Как вы увидите позже Воляиз вот так,это Толькодаонхозяин题,ты Воляизучатькакв соответствии сс己изстильипредпочтенияверно Чторуководить Изменять。 Фактически, на протяжении всей книги вы увидите, что из существования Qt Различные темы скриншотов, но имейте в виду, что это внешний вид и функциональность не имеют к этому никакого отношения. Qt Creator издизайнделать Что Можно найти в котором переключаться между разными моделями чрезвычайно быстро и легко управлять. Переключение в каждый режим практически полностью меняет Qt GUI Основное содержание находится в содержании, и оно полностью достигло своей уникальной цели. давайте посмотрим Qt какие модели и их использование.

Режим создания Qt

Qt Creator Имея шесть различных измоделей, вы можете помощь Открытьпроект, Изменить. код,Дизайн пользовательского интерфейсаждать. 让нас Просматриватьк Вниз Список表,Затемпытаться Проверятьэто们източное значение:

  • добро пожаловать
  • редактировать
  • дизайн
  • отлаживать
  • проект
  • помощь

Я уверен, что ты заметил,существуют, прежде чем мы опишем их более подробно,Вы можете использовать Qt Creator Переключаться между разными моделями руководить в левой части экрана, Как показано на следующем скриншоте:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-FLcJEkJA-1681869945432) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/ba90b615-0204-4c41-a271-1de7d5d319af.png)]

для Qt Creator Существуют специальные сочетания клавиш для выполнения почти всего, а также переключение между существующими различными моделями управления. Вы можете просто пройти мимо экрана, наведя курсор мыши, не тратя времени на изучение всего содержимого на экране. нажмите сочетание клавиш, и всплывающее окно сообщит вам о связанном содержимом дополнительную информацию, поэтому мы не будем описывать полный список сочетаний клавиш, потому что для Вы можете использовать Вышеупомянутый метод легко находит последние горячие клавиши. Как показано на скриншоте ниже, курсор мыши «Воля» застрял на существующем «шаблоне». кнопка «проектирование», она сообщает мне, что использует кнопкаиз (т. е. переключиться на шаблон). проектирования)исочетания клавиш,Прямо сейчасCtrl + 3

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-Sq6zHvNu-1681869945432) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/e321da07-1de6-4b16-88d9-33a51b33ab59.png)]

сейчассуществовать,нас Воляучитьсясвязанный Qt Creator середина Нет同модельи Чтоиспользоватьиз Подробнее. Следует отметить, что только листинг и перебор Qt Creator серединакаждый Функция из细节Нетсуществоватькнига Книгаизв рамках обсуждения,Данас肯定会Крышкакнига Книгасерединаиспользоватьиз Qt Creator из всех аспектов. Qt Creator исвязанный Qt почти весь контент разрабатывается быстро и лучше всегда сосредоточиться на странице документации и попробуйте новые функции или измененные функции самостоятельно.

режим приветствия

Да Открыть Qt Creator часизисходныймодель,Можетквсегдаиспользоватьлевая сторонаизWelcomeкнопка Воля Чтовыключательдля:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-ioTuGHrB-1681869945432) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/76f02d4d-e9b0-4c38-a9a7-0dd8216e6ce5.png)]

оэтотмодель,最重хотетьиз На что следует обратить вниманиедаэтона самом делеиметьтри种Нет同изребенокмодель,Они упоминаются следующим образом:

  • проект
  • Пример
  • гид

проект

Этот экран (или «добро пожаловать”модельизребенокмодель)Можетиспользовать Виспользовать“Новыйпроект”кнопкасоздаватьновыйиз Qt проект。 существовать Нет. 1 Глава «OpenCV и Введение в Qt», вы очень кратко испытали это из-за способа «Заканчивать». Если вы нажмете кнопку «Открытьпроект», вы также сможете сохранить все проекты Открыть на своем компьютере. Существует также список «Последние», который полезен как в качестве напоминания о том, что вы работаете над контентом, так и в качестве ярлыка для доступа к нему. существоватьэтотмодель Внизтакже有Может见изсессия,Да Qt Creator Некоторые из наиболее интересных функций. Сессия используется для хранения IDE изостояние и существованиек после необходимости восстановления состояния. В этой книге мы не будем заморачиваться разговорами, но если их правильно использовать, то они очень удобны и можно. найти в Экономит много времени при разработке.

С помощью Примера,существовать Qt Creator Разобраться в сеансе будет очень просто. Предположим, вы находитесь на определенном проекте и существуете. Qt Creator Я установил несколько точек останова в Открыть, установил несколько точек останова в коде и соответственно нажал. Такой какэтотдобрыйизвсеинформация Все存储существовать Место谓изсессиясередина,и Можеткпроходитьсуществоватьсессия Из间руководитьвыключатель Приходитьлегкий地恢复。

Если нажать кнопку «Новый проект»,Воля отображает окно «Новый проект»,Это окно позволяет вам выбрать проекттип (или шаблон) на основе контента, который вы хотите разработать. Вы увидите позже,нас ВолятолькоиспользоватьApplications/Qt Widgets ApplicationиLibrary/C++ LibraryПараметры,потому чтодля Траверсвсе Может能из Qt шаблон проекта выходит за рамки этой книги из. Однако, как показано на снимке экрана ниже, окно «Новый проект» содержит три раздела, которые вы можете просто выбрать, чтобы получить очень полезное описание каждого типа типа проекта. Использовать Нет.Один список и Нет.Два списка После нажатия на любой тип элемента (существовать на скриншоте ниже) его описание Воля появляется в трех панелях. ДавыбиратьQt Widgets Applicationпроекттипчас出сейчасизописывать(пожалуйста参见Внизкартина,尤Чтода 3 панель номеров):

  • длярабочий столсоздавать Qt приложения, в том числе основанные на Qt Designer изхозяинокно
  • предварительно选использовать Встроить Приложениерабочий стол Qt (если доступен)
  • поддерживатьплатформа:Рабочий стол

как вы видете,Там очень полезная информация,有助Втыучитьсяэтоттипизшаблон适использовать В哪种проект。 Попробуйте просмотреть все варианты, чтобы ознакомиться с проекттипом. 知道Может能изпроекттипдаонхорошая идея,Прямо сейчасделатьты Нет会立Прямо сейчасиспользоватьэто们。 Ниже На скриншоте показано окно «Новый проект»:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-OvZiHOXg-1681869945432) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/1a704eb5-fafe-4688-9271-ea7f003b598e.png)]

Пример

Даясуществовать Qt Creator середина最喜欢изчасть первая,без сомнения,Даучиться Qt И узнайте, как его использовать в одном из самых важных мест. Здесь много объяснений из Примера, достаточно одного клика руководить Строить. В примере также есть панель поиска, которую можно использовать для поиска различных ключевых слов.

гид

текущий,Эта часть контента очень похожа на,потому чтодляэтоцельсуществоватьтренироваться Qt разработчик, но главное отличие в том, что он содержит демо-видео. Обязательно просматривайте их время от времени, чтобы получить самую свежую информацию о новых функциях и о том, как их использовать.

существовать Входить Внизодин Режим создания Qt(Прямо сейчасрежим редактирование) прежде чем нам понадобится разработать новый проект. существуют из оставшейся части этой главы, мы воляиспользуем этот пример, потому что для оставшейся модели нужен проект, который мы будем использовать. Теперь вы уже знакомы с существующим режимом. приветствия,Ты можешькпродолжать Создайтеновыйиз Qt Widgets приложение. когда мы тестируем Qt и OpenCV Установитьчас,тыуже经существовать Нет. 1 Глава «OpenCV и Введение в Qt» имеет проект в создателе. Вам нужно повторить те же действия. на этот раз,Толькоубеждаться Воляпроект命имядляHello_Qt_OpenCVПрямо сейчас Может。 Даты需хотеть采Выбиратьизшаг:

  • существовать“добро В модели «предложить» нажмите кнопку «новый проект» или нажмите Ctrl + N
  • Выберите «Применить»,Затемсуществовать“Новыйпроект”окносерединавыбирать“Qt Widgets приложение".
  • ВоляпроектимянастраиватьдляHello_Qt_OpenCV,Затем выберите папку, в которой вы хотите существовать, где создавать. Если вы делали это раньше,и选середина Понятно“использоватьделатьпо умолчаниюпроект Кусочекнабор”флажок,но Незачемсуществоватьэтот处Изменятьлюбойсвязанный“существовать Чтосерединасоздавать”изсодержание。 Затем нажмите «Далее».
  • Выбирайте только израбочий Варианты комплектации столового инструмента в зависимости от вашей операционной системы система. Затем нажмите «Далее».
  • Сохраняйте добрую информацию без изменений. По умолчанию,этоотвечать ДолжендаMainWindow,Да Конечноиз,Затем Нажмите «Далее»。
  • Находясь на странице администратора проекта существования, просто нажмите Заканчивать.сейчассуществовать,Вы готовы,Вы можете следить за остальными темами в этой главе.

режим редактирования

использовать Qt Creator час,режим редактирование, пусть вы, Воля, проводите большую часть своего времени из модели. В основном он используется для кодов Qt Проект основан на текстовых исходных файлах и всем содержимом. тывсегда Можеткиспользоватьправая часть экранаиз“редактировать”кнопкапереключиться на“редактировать”модель,Как показано ниже:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-ltPbwlSJ-1681869945432) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/9eda3087-a836-460b-8b0f-f368ed6dde5d.png)]

первый,Давайте посмотрим на скриншот ниже:,Должен Экран快照涉исуществоватьрежим При редактировании видны разные панели. Как видите, есть три раздела. к1突出показыватьизчастьдахозяин编码область,2далевая сторона边столбец,3даправая боковая панель。 По умолчанию видна только левая боковая панель да, но да Вы можете использовать Стрелки с каждой стороны в нижней части экрана указывают на маленькую кнопку «Открыть», чтобы закрыть каждую боковую панель. окаждая панель (боковая панель и центр области основного кода), чтобы отмечать наиболее важные факты, да, можно киспользова тькаждый Стрелки в верхней части панели указывают на возможность разделения, копирования и изменения модели. сторона:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-7pAOC7Eg-1681869945433) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/89569636-6963-485c-b3e8-95b8df8901ea.png)]

хозяинкодредактироватьокругдаонлегкийизкодредактироватьустройство,Это позволяет код Заканчивать,Выделение кода и контекстно-зависимая помощь, это, по сути, самое важное содержимое того, что вам нужно в Воля. Посмотреть позже Воля, Вы можете использовать Первый выборизцвет,Шрифты и т. д.руководить Конфигурация。 Вы также можете киспользовать верхнюю часть кнопки «разделить» и разделить область кода раздела и обрабатывать несколько документов одновременно. Попробуйте ввести какой-нибудь код, который вы знаете, добрый или что-нибудь C++ код и поиграйтесь с кодом Заканчивать, а также попробовать провести код в браузере из курсора мыши Кусочек Qt добрыйначальствочасв соответствии сF1Приходитьиспользовать Контекстно-зависимая помощь。 Это ваши лучшие друзья на долгое время, особенно когда вы начинаете заниматься собой.

Вы можете выбрать различные параметры на левой и правой боковой панели:

  • проект: Содержит Открытьизпроект и список включенных в него файлов.
  • Открыть: Эти документы показывают только то, что у вас есть Открытьиздокумент. Ты можешькпроходитьщелкнутькаждыйкнопкарядомизXкнопка Воля Что关闭。
  • Закладки: отображает все закладки в вашем существующем коде, созданном. Использование и функцию Можно найти в процессе программирования и в после существованиятестиотлаживать при кодировании.
  • Файловая система. По сути, это панель браузера файлов. пожалуйста, обрати внимание,На этой панели отображаются все файлы в папке проекта (если вы установите флажок из связанных на панели,Даже скрытые файлы будут показаны),Также можно использовать для просмотра других папок на вашем компьютере.,ине толькодатекущийпроект。
  • добрыйвид:Можетиспользовать ВПроверятьтекущийпроектсерединадобрыйизслой次структура。
  • Аннотация: и «добрыйвид» — это другое.,Он показывает иерархию всех методов и символов в текущих файлах с открытым исходным кодом.,Вместо того, чтобы давесь проект. На предыдущем снимке экрана панель активируется на правой боковой панели панели.
  • тест: Эта Воля показывает все доступные изтесты в проекте.
  • Типи имеет иерархическую структуру: об этом можно догадаться по названию.,Его можно использовать для просмотра иерархии «добрыйиз», включая иерархию «из заголовка» и «з».

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

шаблон проектирования

Датыруководитьвсепользовательинтерфейсдизайниз Способ。 Вы можете использовать Qt Creator В левой части экрана кнопка «Дизайн» переключается на модель «Дизайн». пожалуйста, обрати внимание,Если эта кнопка отображается серым цветом (это означает, что эта кнопка неактивна),но需хотетьпервыйвыберите одинпользовательинтерфейсдокумент(*.ui),потому чтодляиспользоватьдизайнустройство Только能Открытьuiдокумент. дляэтот,Ты можешьк Дважды щелкните левую панель.(“проект”панель)серединаизmainwindow.uiдокумент:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-E099qAb2-1681869945433) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/f0a45ac6-e045-4bb2-a531-83acb65c4af4.png)]

шаблон дизайн содержит мощные GUI дизайнустройство Требуется для ВСЕХ инструментов. у него есть WYSIWYGТо, что вы видите, это то, что вы получаете)типиз GUI премьер, позволяет добавлять, удалять, премьерилиписать может добавлять или удалять из него Qt окновиджетизкод. пользовательский интерфейс.

Qt виджетда Qt Самый простой тип компонента в пользовательском интерфейсе. По сути, все в пользовательском интерфейсе (включая все окно), такое как кнопки, Этикетка, текстовые поля, все да. Qt виджет. Qt окновиджет ВседаQWidgetдобрыйизвсеребенокдобрый,Это позволяет им получать события ввода пользователя (например,,события мыши и клавиатуры),исуществоватьпользовательинтерфейсначальствос ХОРОШОрисовать(илирисовать)。 поэтому,Должно начинаться сQWidgetдобрыйсерединаребенокдобрыйизменятьлюбойиметь Может视Появлениеи打算放существоватьпользовательинтерфейсначальствоиз Qt добрый. существования На протяжении всей книги вы, Воля, многому научитесь Qt виджетдобрый,Да Некоторый Пример ВолядаQPushButton,QProgressBar,QLineEditждать. Их почти сразу можно узнать по именам. Обратите внимание, что все Qt добрый(没有любой明显изисключение)изимя ВсекQ(большой写)начало。

существоватьшаблон Есть один в разработке Qt Creator из Скриншот (показан ниже). Как показано здесь, оно очень похоже на то, что мы видим в разделе «Редактировать» модель, и экран разделен на три основные части. ты Можно найти в середине основной области любым способом перетаскивания, изменения размера, удаления или интуитивно понятным пользовательским интерфейсом. интерфейс. существовать Экранизлевая сторона,有Можеткдобавить впользовательинтерфейсиз Список виджетов. Вам следует попробовать перетащить некоторые из них (по сути, любой из них), просто чтобы пользователь в целом остался доволен и лучше понял, как это работает. существоватькнига Книгаизназад面,У нашего Волядизайн множество различных интерфейсов изпользователя,и постепенно знакомит вас со многими функциями,Дабольшинствос己пытаться Некоторыйдизайни По меньшей мере熟悉Некоторый Функция,Даоночень хорошийизхозяин意。 Все это чувствуется. существоватьправая часть экрана,ты Можно найти интерфейс впользователя для просмотра многослойного виджета и изменения каждого виджетизсвояства. Итак, если вы продолжите руководить и добавите некоторый виджет в интерфейс существующего пользователя, вы заметите, что всякий раз, когда вы выбираете другой виджет, свойство и его значение будут меняться в зависимости от этого конкретного виджета. существоватьздесь,Вы можете использовать все свойства:

и большинство других IDE Точно так же часто существует множество разных способов достижения одной и той же цели. Например,Вы можете использоватьредактировать установить размер виджета окна из кода, даже нерекомендуемым способом Измените это в тексте UI документ. Вы должны быть в состоянии принять решение, исходя из ваших конкретных потребностей, поскольку не существует одного лучшего метода, и все они подходят для разных ситуаций. Как правило, лучше всего установить первоначальные настройки в интерфейсе администратора и обновлять их по мере необходимости по всему коду. Ты Волясуществоватькнига章изназад面частьсерединаверноэтотруководитьучиться。

[Передача изображения по внешней ссылке не удалась. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-wDUgnwf3-1681869945433) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/9035e46e-8d1a-4f31-bae1-81152c3d5b48.png)]

существоватьпользовательинтерфейсдизайнустройствосередина央частьизнижний,Ты можешьк Видеть“действиередактироватьустройство”и“Сигналислотредактироватьустройство”。 Изучить, как они работают, к и на самом деле Qt из Как это работает, нам нужно сначала изучить Qt Среда сигнала и слота. поэтому,отопределение Сигналислотизконцепцияначинатьнасиз Нет.Встреча начинается,Тогда испытайте настоящий опыт из Примерруководства,Даон Нет常好изхозяин意。

Qt фреймворк в сравнении со стандартом C++ Самое главное в программировании — добавить механизм сигналов и слотов, что тоже делает Qt Так легко учиться и мощно по причинам. Это абсолютно верно Qt Самое важное из отличий между и другими рамками. Его можно рассматривать как для Qt из Метод передачи сообщений между объектами хороший (или, как следует из названия, только посылает сигналы). каждый Qt Объекты могут излучать сигналы, которые можно подключить к слоту другого (того же) объекта. Давайте разберем это дальше на простом примере. QPushButtonдаон Qt Класс виджета, к которому вы можете добавить Qt для создания кнопок в пользовательском интерфейсе. В нем содержится множество сигналов, в том числе очевидный сигнал прессы. с другой стороны,существоватьнассоздаватьHello_Qt_OpenCVпроектчасс动создаватьизMainWindow(кивсе Qt окно)Включатьодинимядляcloseизслот,Можетиспользовать ВПростой地关闭проектизхозяинокно 。 Я думаю, вы можете себе представить, что произойдет, если Волякнопкаиз нажмет на сигнал, подключенный к окну, и закроет щель. 有оченьмногометод Можетк Воля Сигналсоединятьприезжатьслот,поэтому,отсейчассуществоватьначинать,существоватьиз остальной части книги,Толькохотеть需хотетьсуществовать Примерсерединаиспользоватьэто们,Мы изучим каждый из них.

Дизайн пользовательского интерфейса

Начните здесь, чтобы узнать, как Qt виджетдобавить интерфейсы впользователей и заставить их реагировать на ввод пользователя и другие события. Qt Creator Предоставляет очень простой инструмент для дизайна. пользовательского интерфейсаидля Чтописатькод. Вы видели шаблон В разделе «Проектирование» доступны различные панели, поэтому мы можем начать с Примера. проходитьвыбиратьmainwindow.uiдокумент(Данасотрежим Входить в главное окно и зполь зовать файл интерфейса), сначала обязательно переключитесь на шаблон. проектирования(еслиеще нет Входитьшаблон проектирования)。

существоватьшаблон проектирования Вниз,ты Можно найти впользователь можно посмотреть на интерфейсеuseiz Qt Список виджетов. Большинство из этих видов использования сразу можно узнать по значкам и названиям, но есть и некоторые, специфичные для этого видажета. Qt из Виджеты. Да По умолчанию Qt Creator Скриншоты, представляющие все доступные макетивиджетиз:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-OejjIXH0-1681869945433) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/b2a3d25a-3b8b-4c34-bd86-82756775c599.png)]

Ниже приводитсяверно Qt Creator шаблон проектирования(илиотсейчассуществоватьначинатьаббревиатурадля Виджетиз кратко иллюстрировать доступен в Дизайнере, как показано на предыдущем скриншоте. Существующая модель дизайна, виджет сгруппирован по их ряду, чтобы из-за сходства руководить. Приступая к осуществлению операций со списком, пожалуйста, опробуйте изкаждые функции лично и ощутите внешний вид Воли при их размещении на интерфейсе существующего пользователя. дляэтот,Вы можете использоватьдизайн модель ВолякаждыйWindowвиджет Перетащите на окно:

  • макет:Этимакетиспользовать Вуправлятьокновиджетизпоказывать Способ。 существовать Появлениеначальство,это们да Нет Может见из(потому чтодляэто们НетдаQWidgetребенокдобрый),иэто们только影响добавить вэто们из Виджеты. Обратите внимание, что макет вовсе не является давиджетом, он используется для управления тем, как виджет отображается логически. Попробуйте разместить любой макетвиджет на интерфейсе существованияпользователя, а затем Существовать. ь Добавьте к нему несколько кнопок, чтобы показать виджет, чтобы увидеть, как его макетрукопривод меняется в зависимости от макетатипрукопривода. Просмотрите изображения каждого примера, чтобы научиться их изготовлять для себя.
    • Вертикальный макет:это们использовать Виметь Вертикальный макет,Прямо сейчасодин Список Виджеты. (Этот макет эквивалентен Qt добрыйсказатьдляQVBoxLayout)。 Ниже приводится Итиз Скриншот:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-uVFS1eC4-1681869945433) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/03a51bca-a3cd-471b-a05b-3f51dbd80cec.png)]

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-d1wYi6TQ-1681869945434) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/277d207f-a502-4427-b93f-edfbb10acda1.png)]

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-QxrQCue7-1681869945434) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/0ed52881-f4f9-4d6a-a812-5fccd5d1523f.png)]

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-aUHLNexV-1681869945434) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/01e370dc-fbb7-4018-b736-302ef72ceb75.png)]

  • разделитель:добрыйпохожий Вмакет,Они визуально незаметны,но повлияет Волядругойокновиджетдобавить выводит время из режима отображения. См. изображение «Пример» и убедитесь, что вы пытаетесь использовать виджет между двумя проставками. сепараторизтипдляQSpacerItem,Дав целом,это们绝Нет能直接существоватькодсерединаиспользовать。
    • уровеньразделитель:Эти Можетиспользовать Всуществоватьодин ХОРОШОсерединаиздвавиджет Вставьте пробел между:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-Li1prl3E-1681869945434) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/01e464f9-6116-4ff8-b3f6-e79437eed75e.png)]

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-8U6hCQuR-1681869945434) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/c90d84a7-39e2-4d85-9943-e79f63649ebd.png)]

  • кнопка:Эти Толькодакнопка。 Они используются для подсказки к действию. Ты можешь能会Уведомлениеприезжать,Флажок кнопки радио также присутствует в этой группе.,Дапотому чтодляэто们ВсенаследоватьсQAbstractButtonдобрый,Должендобрыйдаонабстрактныйдобрый,Предоставляет весь интерфейс, необходимый для доброгокнопкавиджета.
  • кнопка:Этикнопка Можетиспользовать Всуществоватьпользовательинтерфейсначальстводобавить встексти/илииконаиз Простойкнопка(Этот виджетиз эквивалентен Qt добрыйсказатьдляQPushButton)。
  • инструменткнопка:Этикнопкаикнопка Нет常Взаимнопохожий,нов целомдобавить колонка винструмент

Qt Итого окна 3 типа разные типизы (вообще говоря да Windows),это们существоватьвиджетящик для Недоступно в инструментах, но доступно в дакпроходить, щелкнув правой кнопкой мыши. Windows В окне создания добавьте или удалите их. дизайн-модель и выберите соответствующий проект из контекстного меню. Они есть:

1.менюстолбец(QMenuBar) 2.инструментстолбец(QToolBar) 3.состояниестолбец(QStatusBar

менюстолбецдапоказыватьсуществоватьокновершинаиз典型уровеньхозяинменюстолбец。 менюсередина Можетк Есть любое количествоизпроектиребенокпроект,каждыйпроектиребенокпроект Все Можетккурокодиндействие(QAction)。 ты Волясуществуют в следующей главеучитьсясвязанныйдействоватьиз Подробнее. Ниже приводитсяменюстолбец Пример:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-vehc4Hlc-1681869945435) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/3f2ff1ec-225f-482f-8382-324c193748a7.png)]

инструментстолбецдаон Можетдвигаться面板,Чтосередина Можетк Включатьиидентификация Задача Взаимноверноотвечатьизинструменткнопка。 Даон Примеринструментстолбец。 Обратите внимание, что они найти в Qt Переместитесь в окно или даже за его пределы:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-pFin1c0k-1681869945435) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/8ed42c6f-df0f-459f-a29d-692cd7a0cd04.png)]

панель состояния да Нижняя часть Простая горизонтальная информационная панель, для большинства оконных приложений универсальный. в любое времясуществовать Qt В новом главном окне создания нового типа эти три полосы типизации являются Волядобавить. в этом окне. Обратите внимание, что в окне может быть только одна строка меню и одна строка меню, но строк меню может быть любое количество. Если они вам не нужны, они вам понадобятся из иерархии объектов в правой части окна «Процессор». Сейчас существуют, с которыми вы уже знакомы Qt Есть три разных бара, доступных из «Qt добро пожаловать”модельсерединаиз ПримерсерединапоискApplication Example,дальше изучать их,к и да, можете ли вы настроить их дальше.

  • Заказ Связькнопка:Да Windows Vista Кнопка Стиль из Заказ Ссылки. Они в обычно используется в мастере существования вместо переключателя «Нажатькнопка», чтобы при нажатии кнопки «Заказать» а Когда добрый вариант напоминает переключатель «использовать», выберите вариант и нажмите «Далее» в диалоговом окне мастера существования. (Этот виджетиз эквивалентен Qt добрыйсказатьдляQCommandLinkButton)。
  • диалоговое окно кнопка окно:еслиты希望кнопка适отвечатьверноразговаривать框серединаиз Операционная системастиль,этот Воля Нет常有использовать。 это有助Вкодин种更Подходящийсистематекущийстильиз Способсуществоватьверноразговаривать框начальствопоказыватькнопка(Этот виджетиз эквивалентен Qt добрыйсказатьдляQDialogButtonBox)。
  • проектвид (на основе модели):этотбаза ВМодельвид控制устройство(MVC)шаблон проектирования; Их можно использовать для представления данных в различных моделях.

Если вы совершенно не знакомы с MVC шаблон планирования, тогда я предлагаю вам остановиться на мгновение и сначала прочитать подробное изложение главы, убедиться, что в нем есть хотя бы что и как использовать. MVC (особенно да Qt) имеет базовые знания. Qt в документацииимядля“Модель/видпрограммирование”изискусствоглава,Вы можете начать с Qt Creator Доступ к статье в модели из"помощь". Для целей этой книги нам не нужна очень подробная информация о MVC модельизпонимать。 Да,Зависит от Это очень важно в архитектуре, и вы обязательно встретите это в существующем проекте, поэтому я рекомендую вам потратить некоторое время на его изучение. но,существовать Нет. 3 глава,“создавать Всесторонний Qt + OpenCV проект", представляем Волю Qt и OpenCV Использовать шаблон Нет同 проектирования,Но наша Воля основное внимание уделяет изданию книги.,потому чтодляэтодаон Нет常Всестороннийхозяин题,и Траверскнига Книгасерединавсе Может能изшаблон проект Воля совершенно бесполезен.

  • проектвиджет(база Впроект):этотдобрыйпохожий Вбаза ВМодельизпроектвид,Нет同Из处существовать Вэто们Нетдабаза В MVC шаблон дизайн и они предлагают простоту из API добавить, удалить или изменить их из проекта
    • Виджет списка:добрыйпохожий ВСписок表вид,Даиметьбаза Впроектиз API,Можно добавить,удалитьи Исправлять Чтопроект(Этот виджетиз эквивалентен Qt добрыйсказатьдляQListWidget
    • виджет дерева:этотдобрыйпохожий В树形вид,Но имеет API, основанный на проектиз,Можно добавить,удалитьи Исправлять Чтопроект(Этот виджетиз эквивалентен Qt добрыйсказатьдляQTreeWidget
    • виджет таблицы:этотдобрыйпохожий В表вид,Даиметьбаза Впроектиз API для добавления, удаления и изменения своего проекта (виджетиз этого окна эквивалентен Qt добрыйсказатьдляQTableWidget
  • контейнер:Этиконтейнериспользовать Всуществоватьпользовательинтерфейсначальствоверновиджетруководить Группа。 контейнер содержит виджет, о чем можно судить по названию форка
    • групповое поле:Даонс титуломирамкаиз Простойгрупповое поле(Этот виджетиз эквивалентен Qt добрыйсказатьдляQGroupBox)。
    • область прокрутки:этотпоставлять Понятноодин Можетобласть прокрутки, идеально подходят для показа Зависит от ВЭкран尺寸小или Может见данные量большойи Не могущий完全Видетьизсодержание(Этот виджетиз эквивалентен Qt добрыйсказатьдляQScrollArea) 。
    • ящик для инструментов:Можетиспользовать ВВолявиджет Группасуществовать Нет同Параметры卡из Списоксередина。 Выбор каждой вкладки Воля показывает (разворачивает) ее содержимое и скрывает (сворачивает) содержимое других вкладок. (Этот виджетиз эквивалентен Qt добрыйсказатьдляQToolBox)。
    • Виджет вкладок:Можетиспользовать Всуществовать Параметры卡式页面серединапоказывать Нет同Группаиз Виджеты. осуществлять клик по каждой странице (или набору виджетов Windows) на связанных вкладках (виджет этого окна эквивалентен Qt добрыйсказатьдляQTabWidget),Вы можете переключиться на эту страницу.
    • Сложенные виджеты:и“Этикетка”окновиджетдобрыйпохожий,Давсегдатолькостраница(илиокновиджет Группа)Может见。 когдаты希望Воля Нет同изпользовательинтерфейсдизайнприезжатьодиндокументсерединаив соответствии спользовательдействоватьсуществоватьэто们Из间руководитьвыключатель(использоватькод)час,этот Функция特Не有использовать(Этот виджетиз эквивалентен Qt добрыйсказатьдляQStackedWidget)。
    • рамка:Можетиспользоватьделатьнасхотетьдля Чтостроитьрамкаизвиджетиззанимать Кусочексимвол。 Это окно эквивалентно Qt добрыйсказатьдляQFrame)。
    • виджет:иQWidgetдобрыйтакой же,этодавсе Qt виджетизбазакнигатип。 Этот виджет почти ничего не содержит, если мы хотим создать себе извиджеттип (помимо существующего извиджета). Qt виджет), это полезно.
    • область МДИ:Можетиспользовать Всуществоватьокноили Qt виджет(Этот виджетиз эквивалентен Qt добрыйсказатьдляQMdiArea)Внутрисоздавать Место谓из“многодокументинтерфейс”。

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-4mDaDc92-1681869945435) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/160c60f3-c13b-419f-ba4f-e3a3c132ac63.png)]

хотетьиспользовать Designer существовать область Чтобы создать новое окно внутри существующего, просто щелкните правой кнопкой мыши по пустому месту и выберите в меню «Добавить дочернее окно». Аналогично, «Следующее подокно», «Предыдущее подокно», «каскад», «Плитка» и «Подокно/Удалить» доступны только при щелчке правой кнопкой мыши «область». Действует только при наличии МДИ «виджетизпараметров».

QAxWidgetтолько适использовать В Windows OS начальствопользователь。 Да,Прямо сейчасделатьсуществовать Windows начальство,только ВоляQAxWidgetдобавить вокносерединатакже Не могущийделатьэто常工делать,потому чтодляэто依赖Всказатьдляaxcontainerиз Qt модуль。 В настоящее время вы можете пропустить этот виджетдобавить в окне не работает, но дасуществовать объясняется позже в этой главе, как это сделать. Qt Добавить другое из в проект Qt модульпосле,Ты можешькпозжесновапытаться。

  • Войти виджет:听起Приходитьточно такой же。 Вы можете использоватьк Внизвиджетполучатьпользователь Введите данные。
    • поле со списком:有чассказатьдля Вниз拉Список表; Его можно использовать для выбора элементов из списка, занимающего очень мало места на экране. В любое время отображается только выбранная опция. Пользователь может даже ввести собственное значение ввода, в зависимости от его конфигурации. (Этот виджетиз эквивалентен Qt добрыйсказатьдляQComboBox):
    • шрифтполе со списком:добрыйпохожий Вполе со списком,но Можетиспользовать Ввыбиратьшрифт系Список。 Список шрифтов, доступных на вашем компьютере, созданиз.
    • редактирование строки:Можетиспользовать Ввходитьипоказыватьодин ХОРОШОтекст(Этот виджетиз эквивалентен Qt добрыйсказатьдляQLineEdit)。
    • Редактирование текста:Можетиспользовать Ввходитьипоказыватьмного ХОРОШОбогатыйтекст Формат。 Важно отметить, что этот виджет на самом деле очень зрелый. WYIWYG богатый Редактирование текстаустройство(Этот виджетиз эквивалентен Qt добрыйсказатьдляQTextEdit)。
    • чистый Редактирование текста:Можетиспользовать ВПроверятьиредактироватьмного ХОРОШОтекст。 Можетк Воля Что视длядобрыйпохожий В记事книгаиз Простойвиджет(Этот виджетиз эквивалентен Qt добрыйсказатьдляQPlainTextEdit)。
    • спин-бокс:использовать Ввходить整числоили Дискретныйизнабор значений,Например月份имя(Этот виджетиз эквивалентен Qt добрыйсказатьдляQSpinBox)。
    • двойнойспин-бокс:добрыйпохожий Вспин-бокс,Даэтопринимать双精度ценить(Этот виджетиз эквивалентен Qt добрыйсказатьдляQDoubleSpinBox)。
    • Время Править:Можетиспользовать Ввходитьчас间ценить.(Этот виджетиз эквивалентен Qt добрыйсказатьдляQTimeEdit)。
    • Дата Править:Можетиспользовать Ввходитьдатаценить(Этот виджетиз эквивалентен Qt добрыйсказатьдляQDateEdit)。
    • дата/Время Править:Можетиспользовать Ввходитьдатаичас间ценить(Этот виджетиз эквивалентен Qt добрыйсказатьдляQDateTimeEdit)。
    • Циферблат:добрыйпохожий В滑块,ноиметь圆形идобрыйпохожий Циферблатизформа。 это Можетиспользовать Ввходитьобратитесь к定范围Внутриизцелое значение(Этот виджетиз эквивалентен Qt добрыйсказатьдляQDial)。
    • горизонтальные/вертикальные полосы:Можетдля добавленияуровеньи垂直滚动Функция(Этот виджетиз эквивалентен Qt добрыйсказатьдляQScrollBar)。
    • Горизонтальный/вертикальный слайдер:Можетиспользовать Ввходитьобратитесь к定范围Внутриизцелое значение(Этот виджетиз эквивалентен Qt добрыйсказатьдляQSlider)。
    • Редактирование последовательности клавиш:Можетиспользовать Ввходитьсочетания клавиш(Этот виджетиз эквивалентен Qt добрыйсказатьдляQKeySequenceEdit)。

Нетотвечать ВоляэтотиQKeySequenceдобрый Запутать,Должендобрый根книга Нетда Виджеты. QKeySequenceEditиспользовать Вотпользователь ТамполучатьQKeySequence。 существоватьиметьQKeySequenceпосле,нас Можетк Воля ЧтоиQShortcutилиQActionдобрыйобъединитьиспользоватьккурок Нет同изфункция/слот。 книга章позже Воляпредставлять Сигнал/слотизпредставлять。

  • показыватьвиджет:Можетиспользовать Впоказыватьвыходданные,Например числа,текст,изображение,датаждать:
    • Этикетка:Можетиспользовать Впоказыватьчисло字,текст,изображениеили Фильм(Этот виджетиз эквивалентен Qt добрыйсказатьдляQLabel)。
    • текстовый браузер:этоиText Editвиджет几乎такой же,Даиметьсуществовать Связь Из间导航из附加Функция(Этот виджетиз эквивалентен Qt добрыйсказатьдляQTextBrowser)。
    • Графический вид:Можетиспользовать Впоказыватьграфикасценаизсодержание(Этот виджетиз эквивалентен Qt добрыйсказатьдляQGraphicsView)。

нас整книга Книгасередина Воляиспользоватьиз最重хотетьизвиджет Может能даграфикасцена(илиQGraphicsScene),это Волясуществовать Нет. 5 глава,“Графический видрамка”серединаруководитьпредставлять。

Обратите внимание, что OpenGL да Совершенно отдельная и сложная тема в компьютерной графике, совершенно выходящая за рамки этой книги. Но да, как упоминалось ранее, лучше всего учиться Qt середина存существоватьизинструментивиджет,кудобныйтыруководитьдальшеиз Исследовать。

QML из Введение Волясуществовать Нет. 12 глава, “Qt Quick Приложение».сейчассуществовать,пожалуйстаубеждатьсянас没有существоватьпользовательинтерфейссерединадобавить влюбойQQuickWidgetвиджет,потому чтодлянас需хотеть Кпроектсерединадобавить вдругоймодуль才能делать Чтотолько常工делать。 В этой главе будет описано, как Qt проект Добавитьмодуль。

Hello_Qt_OpenCV

сейчассуществовать,нас МожеткначинатьдляHello_Qt_OpenCVпроект Дизайн пользовательского интерфейса。 Четкий список спецификаций проекта, а затем удобный для пользователя дизайн в соответствии с потребностями. UI,Затем нарисуйте интерфейс пользователя на бумаге (или, если это не так, проект,пожалуйста牢记существовать Сердце)всегдадаонхорошая идея。 , наконец-то начал использовать Designer Создайте его. Конечно, этот процесс требует наличия Qt виджетизопыткисоздаватьс己извиджетиздостаточноопыт,Но это произойдет в конце концов,Вам просто нужно продолжать практиковаться.

поэтому,первый,让нас回顾один Внизнас需хотетьразвиватьиз Приложениеспецификация。 Например:

  • этотприложениедолженможет Воляизображениеделатьдлявходить(приниматьизизображениетипдолжен По меньшей меревключать*.jpg,*.pngи*.bmpдокумент)。
  • Это приложение должно иметь возможность применять фильтры размытия. пользовательдолженможетвыбиратьсерединаценить模糊или Размытие по Гауссутип Приходитьфильтрвходитьизображение(использоватьпо умолчаниюизодин Группапараметр)。
  • этотприложениедолженможетдержатьвыходизображениеивыходизображениеиздокументтип(или Расширятьимя,другими словами),иэтодолжен Может Зависит отпользовательвыбирать(*.jpg,*.pngили*.bmp)。
  • Пользователь должен иметь возможность выбрать существование для просмотра вывода при сохранении и обсуждении.
  • При перезапуске приложения,отвечатьбронироватьи重новый加载пользовательинтерфейс Настройки включенывсе Параметры,включать模糊фильтрустройствотипкинаконец Открытьидержатьизизображениедокумент.
  • Когда пользователь хочет закрыть приложение,Их следует подсказать.

для нашей ситуации этого должно быть достаточно. В общем, не следует перегружать или недопоставлять. Да Дизайн пользовательского ВАЖНЫЕ ПРАВИЛА. этот意味着тыотвечатьубеждатьсявсехотеть求всеужеуспех满足,в то же время,Вы еще ничего не добавили в список запросов.

В таком списке требований (или спецификаций) может быть бесчисленное множество дизайнов интерфейса; Да,Данас Волясоздаватьизодин。 пожалуйста, обрати внимание,Данасизпрограммасуществовать执ХОРОШОчасиз Появление。 очевидно,Заголовок и стиль могут отличаться,Зависит от операционной системы,Но это в основном:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-4dFW0NOW-1681869945435) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/a9d09830-17fe-4be0-9970-b3dc3631da9c.png)]

это выглядит просто,Он содержит все компоненты, необходимые для этой задачи.,иинтерфейс几乎да Нет言с明из。 поэтому,Воляхотетьиспользоватьэтот Приложениелюдина самом делеи Нет需хотетьучитьсяоченьмного Функция,Им просто нужно угадать все поля ввода,Кнопка одиночного выбора,Флажки и другое использование.

При просмотре на существующем Дизайнере,Датакой жеиз UI:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-XwJHndS5-1681869945435) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/207946ce-73a4-4581-9ece-2e4eed7e2511.png)]

сейчассуществовать Должендлянасизпроектсоздаватьпользовательинтерфейс Понятно:

  1. Чтобы создать этот интерфейс пользователя, сначала нужно удалить строку меню, строку состояния и панель инструментов из главного окна, потому что для нас они не нужны. Щелкните правой кнопкой мыши верхнюю строку меню и выберите «Удалить строку меню». Затем щелкните правой кнопкой мыши в любом месте окна и выберите «Удалить столбец». Наконец, щелкните правой кнопкой мыши верхнюю панель инструментов и выберите «Удалить панель инструментов».
  2. Теперь существовать, существовать добавляет горизонтальный макет в ваше окно; Даначальствоодинизображениевершина Может见измакет。 Затем,существовать Чтосерединадобавить в Этикетка,редактирование строкикнопка, как показано выше.
  3. проходитьдвойной щелчок ЭтикеткаивходитьInput Image :Приходить Изменять Этикеткаизтекст。 (Это связано свыбирать Этикеткаииспользоватьправая часть экранаизсвойстворедактироватьустройство ВолятекстсвойствоценитьнастраиватьдляInput Image :такой же。)

几乎всеиметьtextсвойствоиз Qt виджет Всепозволятьиспользовать Чтотекструководитьэтот种типизредактировать。 поэтому,отсейчассуществоватьначинать,когданас说Change the text of the widget X to Yчас,этот意味着двойной щелчокинастраиватьтекстилииспользоватьдизайнустройствосерединаизсвойстворедактироватьустройство。 нас Можетклегко Воляэтот​​规но Расширятьприезжатьсвойстворедактироватьустройствосередина Может见изокновиджетизвсесвойство,и说Change the W of X to Y。 существоватьздесь,очевидно,Wдадизайн ВОЗизсвойстворедактироватьустройствосерединаизсвойствоимя,Xдавиджетимя,Yда需хотетьнастраиватьизценить. Это Волясуществоватьдизайн UI Когда для мы экономим много времени.

  1. Добавить групповой блок,Затемдобавить вдва Кнопка одиночного выбора,добрый выглядит как на картинке выше.
  2. Следующий,Добавить еще один уровеньмакет,Затемсуществовать Чтосерединадобавить вLabel,Line EditиPush Button。 Этот флажок «Волядасуществовать» находится чуть выше нижнего края, как видно из макета.
  3. наконец,существоватьокносерединадобавить водинфлажок。 Данижнийизфлажок。
  4. сейчассуществовать,в соответствии свперед面изизображение,Изменятьокноначальствовсевиджетизтекст。 тыиз UI Почти готов. Теперь вы можете пройти, нажав кнопку «Запустить» в левом нижнем углу экрана, чтобы попробовать. Убедитесь, что вы не нажимаете кнопку с ошибкой «запустить»кнопку. Даон:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-7meOW0Jx-1681869945436) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/b123b1f9-9824-41bf-9842-6e16c91cdb9d.png)]

Эта Воля производит то же самое из того, что вы видели раньше из обычного пользователя. интерфейс. Теперь, если вы попытаетесь изменить размер окна, вы заметите, что существует существование, изменяя размер окна, или когда вы максимизируете окно, все остается как есть и не реагирует на примененные изменения размера. хотетьделатьтыизприложениеокно响отвечатьбольшой小Изменять,ты需хотетьдляcentralWidgetнастраиватьмакет。 Также необходимо проверить размер экрана поле сделай это.

Qt виджетвсеиметьcentralWidgetсвойство。 Да Qt Дизайнер специально для Windows иконтейнервиджетизвещь. использоватьэто,Вы можете установить окно контейнерилиизмакет,Перетащите виджет окна макета без необходимости существования виджета центрального окна.,Просто используйте дизайн верхней панели инструментов:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-0MrWe7Cd-1681869945436) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/59ecd372-42c2-438d-b3bc-e00bf89a2ea6.png)]

Возможно, вы заметили четыре маленькие кнопки в инструменте (как показано на предыдущем скриншоте), и они выглядят точно так же, как измакет в инструментах иджетящик (показанный ниже):

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-ND2UwLw5-1681869945436) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/86f528aa-36f4-4362-9238-282c7e1ddf73.png)]

поэтому,让нас Сразу整книга Книгасерединаиз Простойбыстрый解释达成另один条规но。 в любое времянас说Set the Layout of X to Yчас,насизиметь в видудапервыйвыбиратьвиджет(на самом деледаконтейнервиджетилиокно),Затемиспользоватьвершинаинструментстолбецначальствоизмакеткнопкавыбиратьправильныйизмакеттип。

  1. Согласно описанию в предыдущем информационном поле,Окно выбора (это означает,щелкнутьокноначальствоизпустой Вместо того, чтобы далюбойвиджетначальствоизпустой)и Воля ЧтомакетнастраиватьдляVertical
  2. Сделайте то же самое с групповым полем; Но да, на этот раз Волямакет устанавливает уровень для. Теперь вы можете попробовать программу еще раз. Как вы можете видеть сейчас, он изменяет размеры всех своих окон и перемещает их при необходимости, не позволяя окну изменить свой размер. То же самое произошло с групповым полем в окне.
  3. Следующий需хотеть ИзменятьиздавиджетизobjectNameсвойство。 Эти имена очень важны, потому что длясуществовать C++ В кодеuse они используются для доступа к окну и взаимодействия с ним. для каждоговиджета, пожалуйста, используйте имя, показанное на скриншоте ниже. Обратите внимание, что на этом изображении показана иерархия объектов. тывозвращаться Можеткпроходитьдвойной щелчокверно象слой次структурапанельсерединаизвиджет Приходить ИзменятьobjectNameсвойство:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-plbRq50b-1681869945436) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/c4cb60b1-3d8d-4fad-b567-1a356158cf90.png)]

Теоретически,Ты можешькдляobjectNameсвойствоиспользоватьлюбой C++ Допустимо для имен переменных, но на практике всегда лучше использовать осмысленные имена. Учтите, что имена используемых в этой книге переменных или виджетов соответствуют тому же или схожему соглашению об именах. Это в основном Qt Разработчики следуют соглашению об именах, что также помогает улучшить чтение кода.

писать проекты Qt

сейчассуществовать,Интерфейс нашего изпользователя полностью дизайнен,Мы можем начать с написания кода приложения. Сейчас существуют,насизприложениепо сути Тольконодаонпользовательинтерфейс,этона самом деле Чтотакже Нет做。 Сначала нам нужно OpenCV добавить а именнопроектсередина。 существовать Нет. 1 Глава «OpenCV и Введение в Qt" ты видел Воля OpenCV добавить в Qt проектиз краткое введение. В настоящее время мы, Воля, принимаем дальнейшие меры и обеспечиваем их выполнение в соответствии с Нет. 1 章серединаизиллюстрироватьправильный Установитьи Конфигурация OpenCV,и Можно найти Скомпилировать и построить наш проект на всех трех основных операционных системах без каких-либо изменений. "ОткрытоеCV и Введение в Qt”。

поэтому,первыйсуществоватькодредактироватьустройствосередина Открытьпроектиз PRO Документ, это Воляда Qt Creator серединаиз“редактировать”модель。 возможно, ты заметил,этосказатьдляHello_Qt_OpenCV.pro。 Вам необходимо добавить следующий код в конец файла:

Язык кода:javascript
копировать
   win32: { 
      include("c:/dev/opencv/opencv.pri") 
   } 

   unix: !macx { 
      CONFIG += link_pkgconfig 
      PKGCONFIG += opencv 
   } 

   unix: macx { 
     INCLUDEPATH += "/usr/local/include" 
     LIBS += -L"/usr/local/lib" \ 
      -lopencv_world 
   } 

Обратите внимание на код из перед правой скобкой; win32выражать Windows Операционная система (только для настольных приложений, а не для Windows 8、8.1 или 10 идентификацияприложение),unix: !macxвыражать Linux Операционная система,unix: macxвыражать MacOS Операционная система.

тыизPROдокументсерединаизэтот段кодпозволять OpenCV Включатьсуществовать Внутриисуществоватьтыиз Qt Доступен в проекте. Помните, что мы существуем Нет. 1 Глава «OpenCV и Введение в Qt”серединасоздавать ПонятноодинPRIдокумент吗? Linux и Пользователи MacOS может удалить его, поскольку в этих операционных системах «существовать» больше не требуется. только Пользователи Windows может сохранить это.

пожалуйста, обрати внимание,существовать Windows OS середина,Ты можешьк Волявперед面изincludeХОРОШОзаменятьдля PRO Файл из содержимого, но такое существование на практике встречается нечасто. кроме того,Стоит напомнить изда,ты需хотетьсуществоватьPATHсередина Включать OpenCV DLLs папку, иначе приложение выйдет из строя при попытке запустить его. Но да, он все равно компилируется правильно ки Строить. чтобы быть более знакомым с Qt PRO Файл из контента, Можно найти в Qt в документациипоискqmakeичитатьчитатьсвязанныйсодержание。 Однако мы тоже будем в Нет. 3 глава,“создаватьвсестороннийиз Qt + OpenCV Краткое введение в руководство в «Проекте».

Мы не будем обсуждать точное значение этих строк кода в операционной системе.,Потому что это выходит за рамки данной книги.,Даценить得Уведомлениеи足к知道何часстроитьприложение(другими словами,компилироватьикомпилировать)。 ссылка), эти строки Воля конвертировать для всех OpenCV Включены заголовочные файлы, библиотеки и двоичные файлы, чтобы вы могли легко существовать в своем коде. OpenCV функция.

Теперь, когда у нас есть работа по Заканчивать Конфигурацию, давайте начнем изкаждые требования для пользователей и связанные с ними извиджетписатькод. 让насотinputPushButtonначинать。

отсейчассуществоватьначинать,нас Воляиспользовать Что唯одинизobjectNameсвойствоценить引использоватьпользовательинтерфейсначальствоизлюбойвиджет. Воляэто们视для Можно найти виспользовак получает доступ к этим именам переменных виджетизма в коде.

Данаспроектиз编码частьнеобходимыйизшаг:

  1. Снова переключитесь на дизайн,Затем Щелкните правой кнопкой мышищелкнутьinputPushButton。 Затем в появившемся меню выберите «Перейти в слот…». На дисплее Воля из окна отображаются все сигналы, излучаемые этим виджетом. выбиратьpressed(),Затемщелкнуть Конечно:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-Tp5M6uWe-1681869945436) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/fdabfeaf-d0a1-47d7-966b-d384aa1a8c31.png)]

  1. ты заметишь,Ваш да с машины дизайна автоматически переходит на машину с кодом восстановления. кроме того,сейчассуществоватьmainwindow.hдокументсерединадобавить в Понятноновыйфункция.
  2. существоватьmainwindow.hсередина,Добавлен следующий контент:
Язык кода:javascript
копировать
        private slots: 
          void on_inputPushButton_pressed(); 

Дас动добавить вmainwindow.cppизкод:

Язык кода:javascript
копировать
    void MainWindow::on_inputPushButton_pressed() 
    { 

    } 

поэтому,очевидно需хотетьсуществоватьтолькосоздаватьизon_inputPushButton_pressed()функциясерединаписать ОтветственныйinputPushButtonизкод. нравитьсякнига章вперед面Место述,Да Воля Сигналотвиджетсоединятьприезжать另одинвиджетначальствоизслотиз Различныйметод Изодин。 Давайте сделаем шаг назад и посмотрим, что происходит. Также обратите внимание на название «Создатьизфункциониз». inputPushButtonвиджетиметьодинсказатьдляодеялов соответствии с Внизиз Сигнал(потому чтодляэтодаонкнопка),Должен Сигналтолькосуществоватьодеялов соответствии с Внизчас才проблема。 существоватьнасизодининдивидуальныйокновиджет(MainWindow)серединасоздавать Понятноодинновыйслот,сказатьдляon_inputPushButton_pressed。 Очень удобно,Мысль из Нет.вопросда,еслияс己существоватьmainwindow.hиmainwindow.cppсерединаписать Понятно Этикод ХОРОШО,Вместо того, чтобы да Щелкните правой кнопкой мышищелкнутьвиджетивыбирать“Перейти кслот”,Что будет с Волей?,Ответда,Да точно такой же, как из. поэтому,в целом,в любое времяinputPushButtonвиджетпроблемав соответствии с Вниз Сигналчас,Qt Все会с动пониматьэто需хотетьсуществоватьon_inputPushButton_pressed()середина执ХОРОШОкод. существовать Qt развиватьсередина,этотодеялосказатьдляпо именисоединятьслот,этотолько遵循к Вниз约定с动Воля Сигналсоединять至слотon_objectName_signal(parameters)

существоватьэтот,objectNameотвечать Должензаменятьдля发送СигнализвиджетизobjectNameсвойствоизценить,signalзаменятьдля Сигналимя,parametersзаменятьдляточныйиз Сигнал编号ипараметртип。

сейчассуществоватьнас知道как Воляокноначальствоизокновиджетиз Сигналсоединятьприезжатьокнокнига身изслот,Другими словами,Теперь, когда мы знаем, что нам нужно добавить функцию и код сигнала для виджетизации окна.,Мы можем сэкономить время,и避免использовать Такой какThe code for the signal X of the widget YИздобрыйиз句ребенокруководитьповторитьиллюстрировать,этот意味着хотетьиспользоватьнастолькоизучатьизметоддобавить водин Ответственный Сигнализчас隙。 поэтому,существоватькнига例середина,для для Нет.a Пример,让насдляinputPushButtonвиджетизpressedСигналписатькод.

в соответствии с Приложениехотеть求,нас需хотетьубеждатьсяпользователь Можетк Открытьизображениедокумент. успех Открытьизображениедокументназад,нас会ВоляпутьписатьinputLineEditвиджетизtextсвойство,кудобныйпользователь Можетк Видетьихвыбиратьизвесьдокументимяипуть。 первый让нас看один Внизкодиз Появление,Затем逐步представлятьэто:

Язык кода:javascript
копировать
    void MainWindow::on_inputPushButton_pressed() 
    { 
      QString fileName = QFileDialog::getOpenFileName(this, 
        "Open Input Image", 
        QDir::currentPath(), 
        "Images (*.jpg *.png *.bmp)"); 
       if(QFile::exists(fileName)) 
       { 
         ui->->setText(fileName); 
       } 
    } 

хотетьдоступпользовательинтерфейсначальствоизвиджетили Другиеэлемент,Толькоиспользоватьuiверно象。 Например,Можеткпроходитьuiдобрыйипроходитьписатьк Вниз ХОРОШОПриходить Простой地доступпользовательинтерфейссерединаизinputLineEditвиджет:

ui-> inputLineEdit

Нет.один ХОРОШОна самом деледабольшойкодизупрощать Версия. Как вы узнаете из Волясуществовать, Qt Для удовлетворения ежедневных потребностей в программировании предусмотрен ряд удобных функций, таких как Воля, которые упакованы в очень короткие функции. первыйдавайте Посмотреть Что мы только что использовали Qt добрый:

  • QString:этот Может能да Qt Одна из самых важных и распространенных категорий. он представляет собой Unicode нить. Вы можете использовать Он используется для хранения, преобразования, изменения строк и бесчисленного множества других операций над строками. существоватьэтот Примерсередина,настолькоиспользоватьэто Приходить存储QFileDialogдобрыйчитать Выбиратьиздокументимя。
  • QFileDialog:Можеткиспользовать Приходитьвыбиратькомпьютерначальствоиздокументилипапка。 Он использует базовую операционную систему API, поэтому внешний вид диалогового окна может отличаться в зависимости от операционной системы. система.
  • QDir:этотдобрый Можетиспользовать Вдоступкомпьютерначальствоизпапкаиполучатьсвязанныйэто们из各种информация。
  • QFile:Можетиспользовать Вдоступдокументкиотдокументсерединачитать Выбиратьилиписатьдокумент.

Как упоминалось ранее, в «Воляде» есть очень краткое описание каждого доброгоиз.,инравитьсятыотвперед面изкодсередина Место见,Все они предлагают больше возможностей. Например,настолькосуществоватьQFileсерединаиспользовать Понятностатическийфункция Приходить检查документда Стоит ли сохранятьсуществовать。 насвозвращатьсяиспользовать ПонятноQDirдобрый Приходитьполучатьтекущийпуть(в целомдаприложениеотсерединабегатьизпуть)。 кодсередина唯один需хотеть БолееиллюстрироватьиздаgetOpenFileNameфункция. Нет.одинпараметротвечать ДолжендаparentВиджеты. этотсуществовать Qt очень важно, оно используется для автоматической очистки памяти, и если появляется диалоговое окно или окно, то родительское окно должно быть определено. Это означает, что каждый существующий объект также должен нести ответственность за очистку своих дочерних объектов при его уничтожении, если окно, то Зависит из родительского окна Открыть их. поэтому,проходить Воляthisнастраиватьдля Нет.одинпараметр,нас告诉компилятор(конечно Qt)этотдобрый ОтветственныйQFileDialogдобрый Пример。 getOpenFileNameфункцияиз Нет.二индивидуальныйпараметрочевиднодадокументвыбиратьверноразговаривать框окноиззаголовок,Внизодинпараметрдатекущийпуть。 нас Предоставить изнаконецодинпараметр Можетубеждатьсятолькопоказыватьприложениенуждатьсясерединаизтри种документтип:*.jpg,*.pngи*.bmpдокумент.

толькокогдапервый Воля Чтомодульдобавить ваш изпроект, а затем Воля, чей заголовочный файл содержит существующий ваш исходный файл, можно киспользовать только любой Qt добрый. к Qt модульдобавить в Qt проект,ты需хотетьсуществоватьпроектизPROдокументсерединадобавить вдобрыйпохожий Вк Внизсодержаниеиз ХОРОШО:

QT += module_name1 module_name2 module_name3 ...

module_name1ждать Можеткзаменятьдля Можно найти в Qt в документацииоказатьсяизкаждыйдобрыйиздействительный Qt модуль. Возможно, вы заметили, что проектиз PRO В файле сохранены следующие строки кода:

QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

этоттольковыражатьcoreиguiмодульотвечать Включатьсуществоватьтыизпроектсередина。 Это два самых основных Qt модуль, включающий множество Qt база础добрый. Нет Вторая строка означает, что если вы используетеиз. Qt рамкаизхозяинхотетьверсиякнига号высокий ВЧетыреиндивидуальный,новозвращатьсяотвечать Включатьwidgetsмодуль。 Дапотому чтодляк Вниз事实:существовать Qt 5 Извперед,widgetsмодульдаguiмодульизчасть,поэтому Незачем Воля Что ВключатьсуществоватьPROдокументсередина。 Что касается включаемого файла, то оно всегда совпадает с самим именем. Следовательно, для существования нашего случая нам нужно добавить существование к под добрый, к, чтобы предыдущий код работал в исходном коде. большинствоиз Кусочекнаборв целомдаголовадокументизвершина,поэтомусуществоватьнасиз例ребеноксередина Сразудаmainwindow.hдокумент. Убедитесь, что вершина существования имеет тип «к низу добрый»:

#include <QMainWindow> #include <QFileDialog> #include <QDir> #include <QFile>

Попробуйте и запустите программу, чтобы увидеть результаты. Затем закройте его и снова вернитесь к дизайнеру. Теперь существуют, нам нужно ккоддобавить вoutputPushButtonВиджеты. ТолькоповторитьиinputPushButtonтакой жеизпроцесс,Дана этот раз,существоватьoutputPushButtonначальстворуководитьэтотдействовать,И для его написания следующий код:

Язык кода:javascript
копировать
    void MainWindow::on_outputPushButton_pressed() 
    { 
      QString fileName = QFileDialog::getSaveFileName(this, 
       "Select Output Image", 
       QDir::currentPath(), 
       "*.jpg;;*.png;;*.bmp"); 
       if(!fileName.isEmpty()) 
       { 
         ui->outputLineEdit->setText(fileName); 
         using namespace cv; 
         Mat inpImg, outImg; 
         inpImg = imread(ui->inputLineEdit->text().toStdString()); 
         if(ui->medianBlurRadioButton->isChecked()) 
            cv::medianBlur(inpImg, outImg, 5); 
         else if(ui->gaussianBlurRadioButton->isChecked()) 
            cv::GaussianBlur(inpImg, outImg, Size(5, 5), 1.25); 
         imwrite(fileName.toStdString(), outImg); 
         if(ui->displayImageCheckBox->isChecked()) 
            imshow("Output Image", outImg); 
       } 
    } 

тывозвращаться需хотеть Кпроект ДобавитьOpenCVзаголовок。 Воляэто们добавить вmainwindow.hдокументвершинаиздобавить в Qt добрыйголоваиз Кусочекнабор,Как показано ниже:

Язык кода:javascript
копировать
    #include "opencv2/opencv.hpp"  

Теперь, когда он существует, давайте рассмотрим только что созданный нами код записи и посмотрим, что он на самом деле делает. как вы видете,на этот раз,нассуществоватьQFileDialogдобрыйизаголовоксерединаиспользовать ПонятноgetSaveFileNameфункция,ифильтрустройствотакже Есть разница. Данеобходимыйиз,кудобныйпользовательсуществоватьхотетьдержатьвыходизображениечас分Невыбирать Каждый видизображениетип,Вместо того, чтобы дасуществовать Открытьэто们час Видетьвсеизображение. В этот раз мы также не стали проверять файл историтьсуществовать, т.к. для этого Воля Зависит отQFileDialogс动Заканчивать,поэтомутолько检查пользовательданет确实выбирать Понятно某элемент Сразудостаточно Понятно。 существованиек В следующих нескольких строках мы пишем что-то конкретное OpenCV изCode, существующего В следующей главе, мы с Воля все больше и больше изучаем эти функции. существовать Нет. 1 Глава «OpenCV и Введение в Qt", у вас также есть очень небольшая доза этого, поэтому они до сих пор не совсем незнакомы. Но да, мы, Воля, еще раз кратко их обсудим и продолжим вступление. IDE иHello_Qt_OpenCVприложение.

всеOpenCVфункция Все Включатьсуществоватьcvимянулевой间середина,поэтомунасубеждатьсянасда OpenCV namespace cvизusing。 Затем,для Понятночитать Выбиратьвходитьизображение,насиспользовать Понятноimreadфункция. здесь важно обратить внимание на да OpenCV использовать C++ std::stringдобрый,и Qt изQStringотвечать Должен Конвертироватьдля Должен Формат,в противном случае,когдатыпытатьсябегать Долженпрограммачас会遇приезжатьошибка。 ТолькоиспользоватьQStringизtoStdStringфункция Прямо сейчас Может Заканчивать。 Уведомление,существуют В этом случае,QStringдаinputLineEditвиджетизtext()функциявозвращатьсяизценить.

Следующий,В зависимости от выбора типа фильтра,насиспользоватьmedianBlurилиgaussianBlurфункцияруководить Простойиз OpenCV фильтр.

пожалуйста, обрати внимание,существуют В этом случае,насдля Эти OpenCV Функцияиспользовать имеет некоторые параметры по умолчанию, но было бы лучше, если бы мы использовали виджет вращения, получивший их от пользователя. Также есть виджет-слайдер? также许даон Нет错из Циферблатвиджет? Заканчивать После этой главы попробуйте. Идея проста: она направлена ​​на то, чтобы вы научились самостоятельно открывать новые возможности в этих рамках. Тем не менее, вы Волясуществовать Нет. 3 глава,“создавать Всесторонний Qt + OpenCV проект» Узнайте, как использовать множество виджетов или даже создавать самостоятельно из Виджеты.

наконец,ужефильтризвыходизображениеoutImgодеялописать Место选документ. в соответствии сdisplayImageCheckBoxвиджетнастраиватьиз条件также会показыватьэто。

На данный момент у нас все еще есть два требования. Сначала да,существовать при закрытии программывсе вивиджетизсостояние сохранить существующее окно и перезапустить программу Открыть, когда Воля перезагрузится. Другой запрос (последний) дасуществовать пользователю предлагает ему закрыть программу. Начнем с последнего, потому что для этого нам нужно знать, как нужно выполнить «писатьсуществовать» при закрытии окна изкода. Это очень просто, потому что для Qt изQMainWindowдобрый(насизокно Местобаза Виздобрый)даQWidget,иэтоуже经иметьодинвиртуальный拟 C++ функцию, мы можем ее закрыть ииспользовать. Просто Воляк следующую строку кода добавьте втыизMainWindowдобрыйсередина:

Язык кода:javascript
копировать
    protected: 
      void closeEvent(QCloseEvent *event); 

этототвечать Должен Входитьmainwindow.hдокументсерединаиздобрыйопределение。 Выделенный слот на передней панели кажется хорошим местом.сейчассуществовать,переключиться наmainwindow.cppи Воляк Внизкод段добавить в Конец файла:

Язык кода:javascript
копировать
    void MainWindow::closeEvent(QCloseEvent *event) 
    { 
      int result = QMessageBox::warning(this, 
        "Exit", 
        "Are you sure you want to close this program?", 
        QMessageBox::Yes, 
        QMessageBox::No); 
        if(result == QMessageBox::Yes) 
        { 
          event->accept(); 
        } 
        else 
        { 
         event->ignore(); 
        } 
    } 

Я думаю, вы заметили, что у нас теперь есть еще две должности. Qt добрый, а это значит, что нам также нужно добавить заголовок вmainwindow.h。 Учтите следующее:

  • QMessageBox:в соответствии синформацияизглазиз,Его можно использовать для отображения простого значка,текстикнопкаизинформация
  • QCloseEvent:Дамного Qt событие(QEvent)добрый Изодин,Его цель — передать связанное событие закрытия окна из параметра

Код почти не требует пояснений, поскольку вы уже знаете предупреждение Функцияиз Нет о параметре дачто. Даиспользовать Приходить告诉 Qt насизMainWindowдобрый Ответственныйэтотинформация框。 Выбор пользователя из результата записывается, затем на основании этого результата событие закрытия принимается или игнорируется, очень просто. Помимо этого нам еще нужно сохранить настройки (виджет изтекстк&чекбокс ирадиобоксизсостояние) и загрузить их. нравитьсяты Место知,держатьнастраиватьизоптимальный КусочекнабордаcloseEventфункция. существоватькодизevent->accept();ХОРОШОИзвперед怎么样? 让нас КMainWindowдобрыйдобавить вдвачастныйфункция,одинчастныйфункция加载имядляloadSettingsизнастраивать,另одинчастныйфункциядержатьимядляsaveSettingsизнастраивать。 существования В этой главе мы, Воля, изучаем последние Qt добрый,этосказатьдляQSettings。 Итак, первая Воля, которая содержит строку добавить вmainwindow.hсередина,Затем Воляк Вниздвафункцияопределениедобавить вMainWindowдобрыйсередина,сновасуществоватьUi::MainWindow *ui;ХОРОШОтольконижеизmainwindow.hсередина,Среди частных членов существуют:

Язык кода:javascript
копировать
    void loadSettings(); 
    void saveSettings(); 

ДаloadSettingsфункциянеобходимыйизкод:

Язык кода:javascript
копировать
    void MainWindow::loadSettings() 
    { 
      QSettings settings("Packt", 
        "Hello_OpenCV_Qt", 
         this); 
      ui->inputLineEdit->setText(settings.value("inputLineEdit", 
        "").toString()); 
      ui->outputLineEdit->setText(settings.value("outputLineEdit", 
        "").toString()); 
      ui->medianBlurRadioButton 
        ->setChecked(settings.value("medianBlurRadioButton", 
        true).toBool()); 
      ui->gaussianBlurRadioButton 
        ->setChecked(settings.value("gaussianBlurRadioButton", 
        false).toBool()); 
      ui->displayImageCheckBox 
        ->setChecked(settings.value("displayImageCheckBox", 
        false).toBool()); 
    } 

Да ДаватьsaveSettingsиз:

Язык кода:javascript
копировать
    void MainWindow::saveSettings() 
    { 
      QSettings settings("Packt", 
        "Hello_OpenCV_Qt", 
        this); 
      settings.setValue("inputLineEdit", 
        ui->inputLineEdit->text()); 
      settings.setValue("outputLineEdit", 
        ui->outputLineEdit->text()); 
      settings.setValue("medianBlurRadioButton", 
        ui->medianBlurRadioButton->isChecked()); 
      settings.setValue("gaussianBlurRadioButton", 
        ui->gaussianBlurRadioButton->isChecked()); 
      settings.setValue("displayImageCheckBox", 
        ui->displayImageCheckBox->isChecked()); 
    } 

существовали при его постройке,需хотетьдляQSettingsдобрыйпоставлять Группа织имя(толькоделатьдля Пример,насиспользовать"Packt")иприложениеимя(существуем из-за случаядля"Hello_Qt_OpenCV")。 Затем,это Только记录тыпередача ДаватьsetValueфункцияизвсесодержание,ииспользоватьvalueфункция Воля Чтовозвращаться。 нас Место做из Толькода Воляхотетьдержатьизвсесодержаниепередача ДаватьsetValueфункция,Напримеродинредактирование строквиджет в тексте и т. д., а затем существует и перезагружает его при необходимости. пожалуйста, обрати внимание,QSettingsкартинаэтот样использоватьчас,О хранении Кусочек позаботимся сами.,ииспользоватькаждый Операционная системапо умолчанию Кусочекнабор Приходитьбронироватьидентификация ВПриложение Конфигурация。

сейчассуществовать,Только ВоляloadSettingsфункциядобавить вMainWindowдобрыйизструктураустройствосередина。 У вас должен быть такой конструктор:

Язык кода:javascript
копировать
    ui->setupUi(this); 
    loadSettings(); 

существоватьevent->accept()Извперед,ВоляsaveSettingsфункциядобавить вcloseEventПрямо сейчас Может。 Сейчас существуют, можно попробовать Нет.приложение. Попробуем запустить фильтр изображения. Выберите каждый из двух фильтров и посмотрите, чем они отличаются. Попробуйте использовать приложение и найти его проблемы. Попробуйте его улучшить, добавив к нему больше параметров и так далее. Ниже приводится Приложение работает на скриншоте:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-rmKHM3rm-1681869945437) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/802ca071-f806-4b88-a793-79d4753b30e0.png)]

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

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-43T8BdL6-1681869945437) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/3d9ac50d-0203-4e84-b410-36a70d9dc138.png)]

насписатьизпрограммаочевиднои Нет完美,Даэто Список出Понятнотыот Qt Creator IDE Почти все, что вам нужно для начала работы с каждой главой этой книги. Qt Creator серединавозвращаться有кроме тоготрииндивидуальныйModesеще нет见Проходить,нас Воля Пучокотлаживатьмодельипроектмодель留Давать Нет. 12 глава,“Qt Quick Приложения», где мы с Волей проводим углубленные исследования, тестиотлаживатькомпьютерное зрение Приложениеконцепция。 Итак, давайте кратко изучим Qt Creator из Нет常重хотетьиз“помощь”моделькиOptionsпосле,Завершите наше путешествие по IDE.

режим помощи

использоватьлевая сторонаизпомощькнопкапереключиться на Qt Creator изрежим помощи:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-F9BC27ng-1681869945437) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/4e4a85a0-824e-4b03-a901-c3dca818993f.png)]

о Qt Creator режим помощииз最重хотетьизиметь значениеда,Вы можете использовать Он предназначен для выяснения правильных фактов, помимо возможности поиска в буквальном смысле. Qt Связано со всем контентом и просмотром Каждый добрыймодулиз бесчисленное множество других примеров, каждыйдобрый Все需хотетьизмодуль。 для этого просто переключитесь на индексную модель и найдите приложение, которое вы хотите использовать. Qt добрый. Даон例ребенок:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-CgFeaHoT-1681869945437) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/986b0acf-0507-43d1-8b74-0b7a0ba0f9eb.png)]

как вы видете,Можеткиспользовать索引ипоискQMessageBoxдобрыйиздокумент页面。 Обратите внимание на первые две строчки после описания:

Язык кода:javascript
копировать
    #include <QMessageBox> 
    QT += widgets 

Это в основном означает,для ПонятносуществоватьпроектсерединаиспользоватьQMessageBox,долженсуществоватьисточникдокументсередина ВключатьQMessageBoxзаголовок,и Волявиджетмодульдобавить вPROдокументсередина。 Попробуйте поискать в этой главе все добрые и затем существув. документации Проверять Что Пример。 Qt Creator Также обеспечивает очень мощную изконтекстно-зависимую помощь。 Ты просто существуешь Qt добрыйначальствоиспользоватьмышьщелкнутьF1,этоиздокумент页面Все Волясуществоватьрежим редактирования Внизизкодредактироватьустройствосерединаполучать:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-p2UAW7DS-1681869945437) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/be421df1-8073-4360-a36a-f78d3d685d1b.png)]

Окно настроек Qt Creator

Вы можете нажать кнопку Кпроходитьинструмент,Затемщелкнуть Параметры,от Чтохозяинменюдоступ Qt Creator параметры. Qt Creator Обеспечивает очень высокий уровень настройки, поэтому вы найдете Qt Creator На странице и вкладке «Параметры» имеется множество параметров для настройки. для большинства людей (включая меня) Qt Creator Параметры по умолчанию делают почти все, что им нужно, но есть некоторые задачи, которые они не умеют выполнять. IDE из Состояние Вниз Воля Не могущий Заканчивать。 Рассмотрим следующий снимок экрана:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-boW61T73-1681869945438) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/d9c5fbd0-b530-4bc6-870d-12166f59a36a.png)]

Вы можете Переключение между страницами слева изкнопкасуществовать. Каждая страница содержит множество вкладок, но все они относятся к одной группе. Ниже приводится Каждая группа вариантов основного использования:

  • Окружающая среда: этот параметр обычно содержит Qt Creator Внешний вид связанныйиз настроек. ты Можно найти в Измените тему (существовать, упомянутую в начале этой главы), шрифт и размер текста, язык и все настройки здесь.
  • Редактирование текстовое сообщение: Этот набор настроек включает в себя все содержимое, связанное с кодом восстановления. существуют здесь, вы можете изменить такие настройки, как подсветка кода, код Заканчивать Ждать.
  • FakeVim: для ознакомления Vim редактироватьустройствоизлюди。 существоватьздесь,их Можно найти в Qt Creator включено в Vim стильизкодредактироватьируководить Конфигурация。
  • помощь: Как вы можете догадаться, он содержит и Qt Creator изрежим помощии Контекстно-зависимая справка, связанная с параметрами системы.
  • C++:существоватьздесь,Ты можешькоказатьсяи C++ Кодирование и код администратора, связанные с настройками.
  • Qt Быстро: Влияние можно найти здесь Qt Quick дизайнустройствои QML кодредактироватьизпараметры. Мы Волясуществовать Нет. 12 глава,“Qt Quick Узнайте связанное в «Приложении» QML из Подробнее.
  • генерироватьибегать:этот Может能да Qt Creator Самая важная страница опций. Настройки здесь напрямую влияют на ваш опыт создания приложений. Мы Волясуществовать, "Связь и развертывание" в Конфигурация некоторых настроек, существуютздесьты научишьсясвязанный Qt Средство статической ссылки на информацию.
  • отлаживатьустройство:Включатьи Qt Creator изотлаживать модель, связанную с настройками. Вы Волясуществовать Нет. 10 глава,“отлаживатьитест”серединаучиться Болееинформация。
  • дизайнер: доступен для конфигурации Qt Creator Другие шаблоны проектов и модель «дизайн», связанные с настройками.
  • Анализаторы: включают и Clang Анализатор кода, QML Анализатор и другие сопутствующие настройки. Их рассмотрение выходит за рамки этой книги.
  • версия Этот элемент управления: Qt и многие версии этой системы управления (например, Git и SVN) обеспечивает очень надежную интеграцию. существоватьздесь,Ты можешьк Конфигурация Qt Creator В иверсии это контролирует все настройки, связанные с.
  • Оборудование: как у вас существует Нет. 12 глава,“Qt Quick Приложение», как показано в разделе «Волясуществовать, где использовать его». Конфигурация Qt Creator руководить Android Разработка, включая все настройки, связанные с устройством.
  • Вставка кода: это можно использовать для конфигурации. Qt Creator Может использоваться для определенных сторонних сервисов, таких как задачи совместного использования кода и некоторых сторонних сервисов.
  • Qbs: покрыто Qbs Это совершенно выходит за рамки данной книги и нам не нужно.
  • настройки теста: включить Qt тест связанный с настройками и т.п. жду. Мы Волясуществовать Нет. 10 Представлено в главе (отлаживатьтест) Qt ваш тест Волясуществовать, где научиться для Qt Приложение для написания модульного теста.

Кроме этого, вы всегда можете киспользовать Qt Creator из инструмента фильтра немедленно существовать. Найдите необходимые настройки в окне «Параметры»:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-uAfdydgo-1681869945438) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/e1bc1c80-c2e9-4cb7-8e56-49eb86cc4b21.png)]

Подвести итог

Эта глава не только знакомит Qt Creator,И это именно то, что нам нужно,êЛегко переходите к следующему шагу и сосредоточьтесь на создании контента.,Вместо того, чтобы даповторитьизиллюстрироватьи Конфигурация Навык。 Мы научились использовать Qt Creator Приходить Дизайн пользовательского интерфейсаидляпользовательинтерфейсписатькод. Мы представляем некоторые из наиболее распространенных способов использования. Qt добрый, к и способ их упаковки различается и змодуль. проходитьучиться Нет同из Режим создания Qt и создание приложений одновременно, теперь мы можем больше практиковаться самостоятельно и даже улучшать их. Следующая глава Волядаус существует, который строит расширяемое на основе плагина компьютерное кадр из изображения одинглава, книга «Волясуществовать из» продолжает руководить до конца книги, до последней главы. существуют В следующей главе мы Воля узнаем Qt и OpenCV серединаizНет同шаблон проектирования,кикакиспользоватьдобрыйпохожийизмодель Приходитьстроить易Вподдерживатьи Расширятьизприложение.

3. Создайте комплексную Qt + OpenCV проект

Зависит Профессиональные приложения никогда не станут для в силу каких-то случайных обстоятельств. Они были такими с самого начала. конечно,Легче сказать, чем сделать,Даеслитыуже经知道каксоздавать Можетклегкий Расширять,поддерживать,Расширятьисделанный на заказиз Приложение黄金法но,этотвсе еще Раночень容易。 黄金法но Толькодаон Простойизконцепция,Счастливая изда Qt рамка уже имеет средства для реализации и строит приложение стандартизированным способом. пожалуйста, обрати внимание,В этом смысле,модульизменять Неттолько意味着Библиотекаили Нет同изисходный кодмодуль,иисуществовать意义начальство说модульизменятьдаобратитесь к Приложениекаждый Обязанностии Функция Вседанезависимый Вдругой Обязанностисоздаватьи Строить。 На самом деле это именно то, что Qt и OpenCV сам создаюиз путь. Изприложение модуля может быть легко расширено даже разными разработчиками из разных фониз. модульизменятьизприложение Можетк Расширятьдляподдерживатьмного Нет同изязык,Тема (стиль или внешний вид),или лучше изда,Множество различных функций.

существоватькнига章середина,Мы, Воля, берем на себя очень важную и жизненно важную задачу:,Прямо сейчасдляиспользовать Qt и OpenCV рамкаизвсестороннийкомпьютерное инфраструктура создания приложений для зрения (или архитектура). Вы научитесь создавать Qt Приложения, которые можно масштабировать даже после их развертывания (доставки пользователю). На самом деле это означает много вещей, в том числе как добавить новый язык в ваше приложение, как добавить новый стиль в ваше приложение и, самое главное, как создать его на основе плагина. Qt Приложения можно расширять, добавляя к ним новые.

Мы Воляпроходить траверс Qt структура проекта и содержит файлы для изучения сборки Qt Что обычно происходит при применении. Тогда мы научимся Qt и OpenCV Некоторые из наиболее распространенных изшаблонов проектирование, к выпуску рамки как использовать эти шаблоны проектированияиз Преимущества。 Затем мы, Воля, узнаем, как создатель может использовать расширение расширения из приложения. Также мы добавили новые стили и новые языки из информации в приложении «Воля Learn связанныйсуществовать». В конце этой главы мы, Воля, смогли создать комплексное и зкомпьютерное зрение Приложениебаза础,Приложение кроссплатформенное,многоязычный,На основе плагиниз,ииметь Можетсопределениеиз Появление。 Это базовое приложение Волясуществовать расширено в следующих двух главах: Нет. 4 глава,“MatиQImage”и Нет. 5 глава,“Графический видрамка”,Затемсуществоватьиз остальной части книгииспользоватьплагин,尤Чтодасуществовать Нет. 6 Глава «OpenCV Изучив «Обработку изображений», мы начали углубленно изучать компьютерное зрениехозяин题и OpenCV библиотека.

В этой главе мы рассматриваем следующие темы:

  • Qt проектные структуры Qt процесс сборки
  • Qt и OpenCV Китайский шаблон проектирования
  • из стиля в приложении Qt
  • Qt приложениесерединаизязык
  • какиспользовать Qt Linguist инструмент
  • каксуществовать Qt середина Создавайте и используйте плагины

фон

существовать Нет. 2 глава,»создавать из Нет.а Qt и OpenCV проект" вы научились создавать простые из Qt + OpenCV приложениеHello_Qt_OpenCV。 Проект почти включает в себя Qt Предоставить извсебазакнига Функция,Хотя мы не слишком много говорили о том, как Воляпроект встроен в приложение дляиз с пользовательским интерфейсом и (почти приемлемо). существуют В этом разделе,ты Научимся Что происходит за кулисами, когда вы нажимаете кнопку «Запустить». Это поможет нам лучше понять Qt Структура проекта и все файлы из целей в папке проекта. Сначала зайдите в папку Открытьпроект и просмотрите несколько документов один за другим. поэтому,нассуществоватьHello_Qt_OpenCVпапкасередина Включатьк Внизсодержание:

Язык кода:javascript
копировать
    Hello_Qt_OpenCV.pro 
    Hello_Qt_OpenCV.pro.user 
    main.cpp 
    mainwindow.cpp 
    mainwindow.h 
    mainwindow.ui 

Hello_Qt_OpenCV.proСписок表серединаиз Нет.одиндокументпо сутидастроитьпроектчас Qt разобраться с из Нет.документом. Это называется для Файлы проекта Qt,Внутри部из Qt программаqmakeОтветственныйиметь дело с Должендокумент. давайте посмотрим, да что.

#qmakeинструмент

qmakeинструментдаонпрограмма,Можетиспользовать*.proдокументсерединаизинформацияприйти на помощьсоздавать makefile。 этоттолько意味着,qmakeиспользовать Нет常Простойизграмматика(Взаимнодлядругойmakeсистемасередина更сложныйизграмматика),Все необходимое для корректной компиляции и сборки приложения,ивсе будутгенерироватьиздокумент放入Buildпапкасередина 。

генерировать Qt проект, это Воля сначала создать новую папку изгенерировать, по умолчанию эта папка ипроект папка Кусочек находится на том же уровне. существуем из-за случая,этотпапкаотвечатьиметьдобрыйпохожий Вbuild-Hello_Qt_OpenCV-Desktop_Qt_5_9_1_*-Debugизимя,Чтосередина*Можетк Нет同,Зависит от платформы,ты Можно найти Найдите его в той же папке, что и папка впроект. Qt(использоватьqmakeидругой Некоторый Ты Волясуществоватькнига章серединаизучатьизинструмент)и C++ компиляторгенерироватьиз Все файлы расположены в этой папке и ее подпапках. Это называется дляпроектизBuildпапка。 этоттакжедасоздаватьи执ХОРОШОПриложениеместо。 Например,Если вы используетеизда Windows,но Можно найти вBuildпапкаизdebugилиreleaseребенокпапкасерединаоказатьсяHello_Qt_OpenCV.exeдокумент(существоватьмногодругойдокументсередина)。 поэтому,отсейчассуществоватьначинать,нас Воля Долженпапка(и Чторебенокпапка)сказатьдляBuildпапка。

Например,насуже经知道существовать Qt PRO Файлы, содержащие следующую строку «к», будут добавлены в наше приложение. Qt изcoreиguiмодуль:

Язык кода:javascript
копировать
    QT += core gui 

让нассуществоватьHello_Qt_OpenCV.proдокументсерединадальше Просматривать; Следующие строки сразу привлекают ваше внимание:

Язык кода:javascript
копировать
    TARGET = Hello_Qt_OpenCV 
    TEMPLATE = app 

Эти ХОРОШОтольковыражатьTARGETимядляHello_Qt_OpenCV,Данаспроектизимя,TEMPLATEтипappвыражатьнасизпроектдаонприложение. У нас также есть следующее:

Язык кода:javascript
копировать
    SOURCES += \ 
        main.cpp \ 
        mainwindow.cpp 
    HEADERS += \ 
        mainwindow.h 
    FORMS += \ 
        mainwindow.ui 

Очевидно, это способ включения заголовочных файлов, исходных файлов и файлов интерфейса (форм). Мы даже Воля себе из кода добавим в PRO файл следующим образом:

Язык кода:javascript
копировать
    win32: { 
      include("c:/dev/opencv/opencv.pri") 
    } 
    unix: !macx{ 
      CONFIG += link_pkgconfig 
      PKGCONFIG += opencv 
    } 
    unix: macx{ 
      INCLUDEPATH += "/usr/local/include" 
      LIBS += -L"/usr/local/lib" \ 
    -lopencv_world 
   } 

Вы приехали, это да Qt Как просмотреть OpenCV и использовать его для Qt проектсередина。 существовать Qt Поиск в справочном указателеqmake Manual,кполучатьсвязанныйqmakeсерединавсе Может能из Закази Функция из Болееинформация,касвязанный Как это работает из Подробнее.

qmakeиметь дело с完насиз Qt После файла проекта начинается поиск источника проекта, упомянутого в документе. с Ран地,каждый C++ программасуществовать Чтоисточникдокумент Изодин(Нетсуществоватьголовадокументсередина)середина Всеиметьmainфункция(одининдивидуальныйи唯одинизmainфункция),насизприложениетакже Нетисключение。 насиз Приложениеmainфункцияда Зависит от Qt Creator с动генерироватьиз,это Кусочек Вmain.cppдокументсередина。 让нас Открытьmain.cppдокумент,Посмотрите, что включено:

Язык кода:javascript
копировать
    #include "mainwindow.h" 
    #include <QApplication> 
    int main(int argc, char *argv[]) 
    { 
      QApplication a(argc, argv); 
      MainWindow w; 
      w.show(); 
      return a.exec(); 
    } 

вперед两ХОРОШОиспользовать ВВключатьнастекущийизmainwindow.hзаголовокиQApplicationзаголовокдокумент. QApplicationдобрыйда Ответственный控制Приложениепоток управления,настраиватьждатьизхозяинхотетьдобрый. существоватьmainфункция Внутри,Вы существуете, видите здесь изда Qt каксоздаватьEvent Loopки Что底слой Сигнал/час隙механизмисобытиеиметь дело ссистемакак工делатьизбаза础:

Язык кода:javascript
копировать
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 
    return a.exec(); 

для самого простого способа описать это,создавать ПонятноQApplicationдобрыйиз Пример,и Воляприложениепараметр(в целомпроходить Заказ ХОРОШОилитерминальный пропуск)передача Даватьимядляaизновый Пример。 Затем,создаватьнасизMainWindowдобрыйиз Пример,Затем Воля Чтопоказывать出Приходить。 наконец,调использоватьQApplicationдобрыйизexec()функция,Комфортное приложение Входить в основной контур,И сохраняйте Открытьсостояние, пока окно не закроется.

Изучить цикл событий: Как это работает,пожалуйстапытатьсяудалитьнаконецодин ХОРОШО,Посмотрите, что произойдет. При подаче заявки вы можете заметить, что окно на самом деле появляется только на короткое время, а затем сразу же закрывается. Дапотому чтодлянасизприложение Нет再иметьсобытиецикл,это立Прямо сейчасприезжать达Приложениеконец,ивсесодержание Всеот Внутри存середина清除,поэтому Долженокноодеяло关闭。сейчассуществовать,Напишите строку Воля обратно,Как и следовало ожидать от,окно保持Открытьсостояние,потому чтодлятолькокогдасуществоватькодсерединаиз某индивидуальныйместо(любойместо)调использовать Понятноexit()функциячас,exec()функция才возвращаться,иэтовозвращаться Зависит отexit()настраиватьизценить ]。

сейчассуществовать,Перейдем к следующим трем файлам,У них одинаковое имя,но Расширятьимя Нет同。 это们даmainwindowзаголовок,источникипользовательинтерфейсдокумент.сейчассуществовать,Вы Волясуществовать Нет. 2 глава,»создавать из Нет.а Qt и OpenCV проект» в «Учиться» отвечает за код и интерфейс пользователя приложения из фактического документа. Это подводит нас еще к двум Qt Внутри部инструмент,сказатьдля元верно象компиляторипользовательинтерфейскомпилятор

Компилятор метаобъектов (MOC)

Мы уже знаем, что стандарт C++ В коде нет сигнала и слота "добрыйиз". Так,какпроходитьиспользовать Qt существовать C++ А как насчет наличия этих дополнительных функций в вашем коде? Это еще не все. Как вы узнаете позже, вы даже можете Qt верно象добавить вновыйсвойство(сказатьдлядинамичныйсвойство),и выполнять множество других операций,этот Нетдастандартный C++ Программирование функций. хорошо,Эти Можеткпроходитьиспользоватьимядляmocиз Qt Внутри部компилятор Приходитьиспользовать。 существовать Воля Qt Код фактически передается в реальный из C++ компилятор Извперед,mocинструмент会иметь дело стыиздобрыйголовадокумент(существоватьнасиз Примерсерединадляmainwindow.hдокумент),кгенерировать启использоватьвыше Qt Требуется для определенных функций. ты Можно найти вBuildпапкасерединаоказаться Этигенерироватьизисточникдокумент. ихизимя字кmoc_начало。

ты Можно найти в Qt в документациичитатьчитатьсвязанныйmocинструментизвсеинформация,Даздесьценить得один提издаmocпоискиметь Qt добрыйопределениеи ВключатьQ_OBJECTМакросизвсеголовадокумент. Макрос всегда должен содержать существование сигнала, слота и прочего. Qt поддерживать Функция из Qt сорт.

Данассуществоватьmainwindow.hдокументсередина Место Включатьизсодержание:

Язык кода:javascript
копировать
    ... 
    class MainWindow : public QMainWindow 
    { 
      Q_OBJECT 
      public: 
       explicit MainWindow(QWidget *parent = 0); 
     ~MainWindow(); 
    ... 

как вы видете,насизс动генерироватьиздобрыйголовадокументсуществовать Чточастныйчастьсерединауже经иметьQ_OBJECTМакрос。 поэтому,этотпо сутидасоздаватьделатьдляQObject(или любой другой Qt объект) изребенокдобрыйиздобрый (не только да окно доброе, но и вообще да любое Qt добрый)изстандартныйметод,Должендобрый Воляподдерживать Qt поддерживатьиз Функция,Например, сигналислот。

Теперь существуют, давайте продолжим смотреть, как это действует C++ доступ по коду Qt пользовательинтерфейсдокументсерединаиз Виджеты. еслитыпытатьсякEditмодельили любой другой Редактирование текстаустройство Проверятьmainwindow.uiдокумент,нона самом делеэто们датолько Включатьсвойствои Некоторыйдругойинформацияиз XML Файл, эта информация отображается только в связанном виде. Ответ существует в конце концов из Qt Внутри部компилятор,Ты Волясуществоватькнига章серединаверно Чторуководитьучиться。

Компилятор пользовательского интерфейса (UIC)

Всякий раз, когда создается интерфейс пользователя из Qt приложениечас,Сразу会执ХОРОШОсказатьдляuicиз Qt Внутри部инструмент Приходитьиметь дело с*.uiдокументи Воля Что Конвертироватьдля Можетсуществовать C++ кодсерединаиспользоватьиздобрыйиисточниккод. существуем из-за случая,mainwindow.hодеяло Конвертироватьдляui_mainwindow.hдокумент,Ты можешьксновасуществоватьBuildпапкасерединаоказаться Должендокумент. возможно, ты заметил Понятноэтотодинточка,Да让насупомянултыизmainwindow.cppдокументуже经Включать Понятноэтотголовадокумент. Проверьте самую верхнюю часть файла, и вы найдете следующие две строки, содержащие:

Язык кода:javascript
копировать
    #include "mainwindow.h" 
    #include "ui_mainwindow.h" 

тыуже经知道mainwindow.hдокументиз Кусочекнабори Кусочекнабор(существоватьProjectпапкасередина),итолькоучитьсяприезжатьui_mainwindow.hна самом деледа Кусочек ВBuildпапка Внутриизгенерироватьизисточникдокумент.

если Проверятьui_mainwindow.hдокументизсодержание,ты заметишьодинимядляUi_MainWindowиздобрый,у него естьдвафункция:setupUiиretranslateUisetupUiфункцияужес动добавить вmainwindow.hфункциясерединаизMainWindowдобрыйструктураустройствосередина。 Долженфункциятолько Ответственныйв соответствии сmainwindow.uiдокументсерединаизнастраиватьсуществоватьпользовательинтерфейсначальстворуководитьвсенастраивать。 Ты Волясуществоватькнига章позжеизсодержаниесерединаучитьсяretranslateUiфункциякисуществовать制делатьмногоязычный Qt Как это применить.

все будут Qt генерироватьиздокумент ВседержатьсуществоватьBuildпапкасерединапосле,Воля они передаются компилятору C++, как и любой другой C++ программаодин样,руководитькомпилировать,Затем СвязьприезжатьBuildпапкасерединаксоздаватьнасизприложение. Пользователи Windowsотвечать Уведомление,использовать Qt Creator При запуске приложения все DLL Все пути к файлам Зависит от Qt Creator анализировать,ДаеслипытатьсяотBuildпапкасерединабегатьпрограмма,Вы увидите несколько сообщений об ошибках,итыизприложение会崩溃или根книга Сразу Нет会запускать。 Вы Волясуществовать Нет. 10 глава, "отлаживатьтест" в разделе "отлаживатьтест" узнайте, как решить эту проблему, существуетздесь ваша Воля узнайте, как правильно доставить приложение Воля пользователю.

шаблон проектирования

Даже если предположить, что книгу прочитать не да“шаблон проект Даниэля», но напоминайте себе, для чего существует депозитный шаблон проектированиякидля Чтоуспехизрамка (напр. Qt) шаблону не разрешено широкое использование. проектированиявсе еще Рандаоночень хорошийизхозяин意。 Ну, во-первых, шаблон проектирование — это лишь одно из многих решений задач разработки программного обеспечения, но не единственное решение; На самом деле, в большинстве случаев это даже не самое быстрое решение. Затем шаблон Проектирование абсолютно позволяет решать проблемы разработки программного обеспечения наиболее структурированным способом, это помогает обеспечить добавление Все в программе имеет некие предопределенные структуры, похожие на шаблоны.

шаблон Проектирование имеет названия для различных задач, таких как создание объектов, способы их проектирования, обработка данных и т. д. Ожидание. Эрик Гамма Гамма, Ричард Хелм Хелм, Ральф Э. Джонсон E. Джонсон и Джон Фритсайд Vlissides)(сказатьдляБанда четырех)существовать Чтоимядля《шаблон Проектирование: Основы многоразового объектно-ориентированного программного обеспечения» в книге описаны многие из наиболее обширных вариантов использованияизшаблонов. проектирования。 Признан в шаблоне «Информатика» проектирование практический справочник. Если вы не знакомы с шаблоном планирование, затем существование. Прежде чем продолжить изучение этой главы, вам следует потратить некоторое время на изучение этой темы. учиться软件развиватьсерединаизпротивоположныймодельтакжедаонхорошая идея。 еслитыдакнигахозяин题изновый手,Вы можете быть удивлены, обнаружив некоторые антимоделизирующие универсалии.,иубеждатьсявсегда避免использоватьпротивоположныймодель至关重хотеть。

Ниже приводится Qt и OpenCV Во фрейме используются некоторые из наиболее важных шаблонов. спроектируем (в алфавитном порядке), к и реализуем эти шаблоны проектированияиздобрыйилифункцияиз简хотетьиллюстрироватьи Некоторый Пример。 Пожалуйста, обратите пристальное внимание на столбец «Пример» в таблице ниже, к обзору икаждыйшаблон. проектирования Взаимно关изнекоторыйдобрыйилифункция. несмотря на это,Эта книга существует в процессе обучения и различных,Ваша Воля учится на практикеиспользоватьиздобрый:

Зависит от В OpenCV рамка из рамок, и она не используется для создания повседневных приложений, сложных интерфейсов пользователей и т. д. из Универсальнойрамки, поэтому ее невозможно реализовать. Qt использованный шаблонвсе проектирования, И, для сравнения, OpenCV Лишь малая часть этих моделей была реализована. Особенно да Зависит от В OpenCV Преследуя цель скорости и эффективности, в большинстве случаев предпочтение отдается глобальной системе. Однако, поскольку скорость и эффективность не являются целью, существуют некоторые OpenCV хороший синий шаблон реализации проектирования,Напримерабстрактная фабрика。 связанный Пример,См. колонку «Примеры».

шаблон проектирования

иллюстрировать

ПримерCase

абстрактная фабрика

Это можно использовать в производителе под названием «Из фабрики добрый».,Фабрика добрый умеет всеми возможными способами создавать объекты и контролировать создание новых объектов.,Например防конецверно象иметь超Проходитьопределениечисло量из Пример。

В этой главе мы, Воля, узнаем, как использовать этот шаблон. проектирования Приходитьписать На основе плагиниз Qt приложение.DescriptorMatcherабстрактныйдобрыйсерединаизcreate()функцияда OpenCV Это шаблон проектированияиз Пример。

Заказ

использоватьэтотшаблон При проектировании вы можете использовать объекты для представления действий. Это позволяет использовать такие функции, как организация последовательности действий, запись действий, восстановление действий и т. д.

QAction:этотдобрыйпозволятьсоздаватьидентификацияиздействиеи Воля Что分配Давать Виджеты.Например,МожеткиспользоватьQActionдобрыйсоздаватьсиконаитекстизOpen Операция с файлом, которую затем можно назначить пункту главного меню и сочетанию клавиш (например, Ctrl + о) и так далее.

комбинация

Это используется для создателя Зависит. из подобъектов формируются из объектов. При изготовлении можно к Зависит Это особенно полезно, когда сложные объекты состоят из множества простых объектов.

QObject:Давсе Qt добрыйизбаза础。QWidget:Давсе Qt виджетиз Основы. Любая конструкция с древовидным дизайномиз Qt добрый Вседакомбинациямодельиз Пример。

внешний вид (или внешний вид)

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

QFile: их можно использовать для извлечения/записи документа. Qt добрый Вседавокруг Операционная система Низкий уровень API из упаковки они все имеют дашаблонский вид проектированияиз Пример。

Объем полета (или мост, или частная реализация)

Эта цель — избежать совместного использования данных между связанными объектами (если не требуется иное).

QString: может использоваться для хранения и операций. Unicode нить. Фактически, многие Qt добрый любит этишаблон дизайн, шаблон оформления Проектирование помогает существовать, когда необходима копия объекта, поскольку указатель передается в общее пространство данных, что приводит к более быстрому копированию объекта и меньшему использованию пространства памяти. Конечно, с большей сложностью изкод.

памятка

Это можно использовать для сохранения и (к) загрузки объектов изоляции.

Это шаблон проектирование эквивалентно написанию способного хранить Qt Объект из всех свойств и восстановление их ксоздает новое свойство,добрый.

Метаобъект (или отражение)

существует — шаблон проектированиясередина,Так называемый метаобъект используется для описания подробной информации об объекте.,к обеспечивает более надежный доступ к объекту.

QMetaObject: содержит только связанный Qt добрыйиз метаинформации. Крышка Qt Детали метаобъектных систем выходят за рамки этой книги, проще говоря, каждый Qt Все процедуры выполняются в первую очередь. Qt Компилятор метаобъектов (MOC)руководить Компилировать необходимые метаобъекты для кгенерации, а затем Зависить от фактического из объекта руководить составлением. C++ компилятор。

Единое государство

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

QSettings: используется для предоставления настроек приложения и сохранения/загрузки. У нас существует Нет. 2 глава,»создавать из Нет.а Qt и OpenCV проект" использовать QSettingsдобрый, к загружает и сохраняет два разных экземпляра одного и того же доброго.

MVC (контроллер представления модели)

Даодин种широкоиспользоватьизшаблон Проектируется для приложения Воля или механизма хранения данных (модель) и реализации и пользовательского интерфейса или представления данных (вид) и манипулирования данными (контроллер) отдельно.

QTreeView:Да Модельвидизформа деревавыполнить.QFileSystemModel:использовать Вбаза Вкнига地документсистемаизсодержаниеполучатьданные Модель。QFileSystemModel(или любой другойQAbstractItemModel)иQTreeView(или любой другойQAbstractItemView)изкомбинация Можеткпривести к MVC шаблон проектированияизвыполнить.

Наблюдатель (или публиковать/подписываться)

Этот метод используется, чтобы позволить объектам прослушивать (наблюдать) изменения в других объектах и ​​реагировать соответствующим образом.

QEvent:Давсе Qt Событие добрыйиз Основы. ВоляQEvent (и все его многочисленные детишки добрый) просмотры дляObserverшаблон проектированияиз Низкий уровеньвыполнить. С другой стороны, Qt поддерживатьsignalиslotмеханизм,Даиспользовать观察ВОЗшаблон Проектирование является более удобным и более совершенным методом. У нас существует Нет. 2 глава "Не создавать.экс Qt и OpenCV проект”серединаиспользовать ПонятноQCloseEvent(QEventизребенокдобрый)。

сериализатор

Существующийсоздавать можно использовать для чтения или при написании других издобрых объектов (или объектов) использовать эту модель.

QTextStream:Можетиспользовать Всуществоватьдокументили Другие IO читать, извлекать и писать текст на устройстве. QDataStream: можно использовать из IO Устройство и файлчитать принимает или записывает двоичные данные.

Синглтон

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

QApplication: может использоваться для обработки различными способами. Qt виджетприложение Точнее, в функции QApplication изinstance() (или глобальный указатель qApp) да Синглтоншаблон. проектированияиз Пример。OpenCV функция изcv::theRNG() (по умолчанию используется случайное число (RNG) для получения) реализация да Синглтон из Пример. Обратите внимание, что ГСЧ добрыйкнига身Нетда Синглтон。

Ссылки:

Язык кода:javascript
копировать
Design Patterns: Elements of Reusable Object-Oriented Software, by Eric Gamma, Richard Helm, Ralph E. Johnson and John Vlissides (referred to as the Gang of Four)

An Introduction to Design Patterns in C++ with Qt, second Edition, by Alan Ezust and Paul Ezust

в целом,Предыдущий из списка не следует считать полным списком готовых проектов.,потому чтодляэтотолькососредоточиться на Qt и OpenCV шаблон проекта, и этого достаточно только для этой книги. еслитыверно Долженхозяин题заинтересованный,Пожалуйста, рассмотрите возможность чтения, упомянутого в справочнике.,Дакаквперед面Местоупомянулиз,Что касается этой книги,Все, что вам нужно, это приведенный выше контрольный список.

检查начальствоодин Список表серединаупомянулизкаждыйдобрыйиздокумент页面даоночень хорошийизхозяин意。 Ты можешькдляэтотиспользовать Qt Creator режим Найдите индекс помощи и существования для каждого добрый, просмотрите коды каждыйдобрыйиз Пример или даже попробуйте их сами. Это не только обучение Qt изBEST WAYS AND daLearn Differentшаблон Проектирование — это один из лучших способов реально реализовать и построить проект.

Система ресурсов Qt

существуют в следующей части,ты Воляизучатькак Кнасизприложениедобавить встильимногоязычныйподдерживать,Дасуществоватьэтот Извперед,Мы должны быть знакомы с системой ресурсов Qt. суммируя,Да Qt Добавить воля шрифты, значки, изображения, файлы перевода, файлы таблиц стилей и другие файлы ресурсов. а именноприложение(и Библиотека)серединаизметод。

Qt поддерживатьиспользовать*.qrcдокумент(资источник收набордокумент)руководить资источникуправлять,Этидокумент Толькода XML Файлы, содержащие связанную информацию, должны существовать в файле ресурсов в нашем приложении. 让нас看один Простойиз Пример,исуществоватьнасизHello_Qt_openCVприложениесередина Включатьодиникона,клучшеучиться Система ресурсов Как работает Qtiz:

  1. убеждатьсяужесуществовать Qt Creator середина Открыть ПонятноHello_Qt_OpenCVпроект。 Выберите «Файл», а затем «Новый файл или проект». существует Новое окно файла, обязательно выберите из двух списков слева из Нет. Qt и выберите Qt 资источникдокумент. Рассмотрим следующий снимок экрана:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-my6OsWCX-1681869945438) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/72357ae5-bf43-49a7-8c5e-173b9b345065.png)]

  1. Нажмите кнопку «Выбрать...».,Затемсуществовать Внизодин Экрансередина,Воляимянастраиватьдляresources。 По умолчанию путь должен быть указан к папке дляизпроекта, поэтому оставьте все как есть. Нажмите «Далее», а затем нажмите «Заканчивать». наконец,Ты Волясуществоватьпроектсерединадобавить водинимядляresources.qrcизновыйдокумент. еслитысуществовать Qt Creator середина Открытьэтотдокумент(проходить Щелкните правой кнопкой мышищелкнутьивыбирать“существоватьредактироватьустройствосередина Открыть”),Волясуществовать Qt Creator Показать ресурс в.
  2. существоватьздесь,Вы можете использовать кнопку «Добавить»Открыть следующие две опции:

Добавить новый файл

добавить префикс

существоватьздесь,документ Сразудатыхотетьдобавить впроектсерединаизлюбойдокумент. Да,вперед缀по сутидаон伪папка(если需хотеть,нодаонконтейнер),Он содержит много документов. Обратите внимание.,Это не обязательно означает папку «из» или подпапку внутри папки проекта.,И это всего лишь способ сгруппировать файлы ресурсов в представлении.

  1. первыйщелкнуть“добавить префикс”,Затемсуществовать“вперед缀”字段серединавходитьimages
  2. Затем,Нажмите «Добавить файл»,Затемвыбиратьнеобходимыйизизображениедокумент(Сразунасиз Примери言,тыкомпьютерначальствоизлюбой*.jpgдокумент Все Можетк)。

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-TRovuUxF-1681869945438) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/bb8c362c-4c51-40cb-9827-ca4aeb7a2898.png)]

существоватьэтот Примерсередина,насиспользовать Понятнои Нет. 1 глава,“Qt и Введение в OpenCV”и Нет. 2 глава,»создавать из Нет.а Qt и OpenCV проект”。 Обратите внимание, что файлы ресурсов должны располагаться в папке проекта и в ее подпапках. В противном случае вы получите подтверждение, как показано на скриншоте ниже; еслидаэтот种Состояние,Пожалуйста, нажмите скопировать,Затем Воля资источникдокументдержатьсуществоватьпроектпапкасередина:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-5MhUNArm-1681869945438) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/886a03d2-124f-4cbe-94bd-5238b0912134.png)]

Вот и все.сейчассуществовать,когдатыстроитьибегатьHello_Qt_OpenCVприложениечас,изображениедокумент Воля Включатьсуществоватьприложениесередина,и Можетккартина Операционная системаначальство存существоватьиздокументодин样руководитьдоступ。 Но да, путь и обычный путь к файлу несколько отличаются. существоватьнасиз Примерсередина,test.jpgдокументизпутьнравиться Вниз:

Язык кода:javascript
копировать
   https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/test.jpg 

ты Можно найти в Qt Creator середина展开*.qrcдокумент,Затем Щелкните правой кнопкой мышищелкнутькаждый资источникдокумент,Затемвыбирать“копироватьпуть”или“копировать URL-адрес» копировать каждый файл по пути или URL。 Если требуется обычный путь, этот путь можно использовать, если требуется файл ресурсов; URL(Qt серединаизQUrlдобрый),URL будет полезно. Требуется особое внимание изда, Зависит от В Система ресурсов Qtда Qt из внутренних функций, поэтому OpenCV Возможно, будет невозможно получить доступ к ресурсам по этим путям и получить доступ к ресурсам. Однако эти файлы предназначены только для самого приложения (обычно используются для задач, связанных с интерфейсом), поэтому они могут вам никогда не понадобиться. OpenCV один起использовать。

сейчассуществовать,Ты можешькпроходить Воляновыйизображениедокументнастраиватьдлякнопкаикона Приходитьпытатьсяновыйизображениедокумент. пытатьсявыбиратьпользовательинтерфейсначальствоизлюбойкнопка,Затемсуществоватьсвойстворедактироватьустройствосерединаоказатьсяiconсвойство,Затемпроходитьв соответствии с Внизрядомиз小Вниз拉кнопкавыбирать“выбирать资источник”。сейчассуществовать,ты Тольковыбиратьдобавить вдлякнопкаиконаизизображение Прямо сейчас Может:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-73ZFEFai-1681869945439) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/a2d4517a-4f2d-41df-8428-7d427667aeb7.png)]

этотпо сутидаокак Воляиконанастраиватьдляподдерживатьиконаиз Qt Учебник виджетиз. Логика точно такая же, когда вы хотите включить в свое приложение любой другой типизированный ресурс и продолжать его эксплуатировать. Вам просто нужно предположить Система ресурсов Qtда какую-то вспомогательную файловую систему, а затем использовать ее из файлов, например существующую файловую систему. То же, что и обычные файлы.

Установите стиль приложения

Qt поддерживатьиспользоватьQStyleдобрыйи Qt Таблица стилей приложения в стиле. QStyleда Qt Все стили в базе добрый, инкапсулирует Qt пользовательинтерфейсизстиль。 КрышкаQStyleдобрый Нетсуществоватькнига Книгаизобсуждать范围Внутри,Но все же следует отметить,создаватьQStyleизребенокдобрыйисуществовать Чтосередина实сейчас Нет同изстильфункцияфинальныйда Изменять Появлениеиз最эффективныйметод。 Qt приложение. Но да, Qt Таблицы стилей также предоставляются для оформления приложения. Qt Таблица стилей по синтаксису почти и HTML CSSтаблица стилей каскада)такой же,Да网页стильсередина Нет Может分割изчасть。

CSS да Язык стилей, который можно использовать для определения внешнего вида объектов в интерфейсе пользователя. в целом,использовать CSS Этот файл помогает разделить базовую реализацию веб-страницы «Воля» и стиль. Qt Существует очень похожий подход к описанию внешнего вида виджетиз в своей таблице стилей. Если вы знакомы с CSS файл, затем Qt Таблицы стилей для вас проще простого; Да,Даже если вы однажды познакомились с этой концепцией,Пожалуйста, не волнуйся тоже,Даодин种易В,Простой и быстрый способ научиться из.

Давайте приведем простой пример, чтобы точно понять, что такое таблица стилей и как ее существовать. Qt серединаиспользоватьэто。 让насснова回приезжатьнасизHello_Qt_OpenCVпроект。 Открытьпроект и зайти в дизайн-мейкер. выбиратьокноначальствоизлюбойокновиджет,или Нажмите на пустой из Кусочек, чтобы установить виджет на само окно выбора.,Затем МожеткоказатьсяодинимядляstyleSheetизсвойство。 по сути,каждый Qt окновиджет(илиQWidgetребенокдобрый)Все ВключатьодинstyleSheetсвойство,Вы можете к Воля его настройки определить внешний вид каждого окна виджетиз.

щелкнутьinputPushButtonвиджет,и Воля ЧтоstyleSheetсвойствонастраиватьдляк Внизсодержание:

Язык кода:javascript
копировать
    border: 2px solid #222222; 
    border-radius: 10px; 
    background-color: #9999ff; 
    min-width: 80px; 
    min-height: 35px; 

использоватьoutputPushButton做такой жеизиметь значение; Да,на этот раз,существоватьstyleSheetсвойствосерединаиспользоватьк Вниз Заказ:

Язык кода:javascript
копировать
    border: 2px solid #222222; 
    border-radius: 10px; 
    background-color: #99ff99; 
    min-width: 80px; 
    min-height: 35px; 

Установив эти таблицы стилей в браузере существующего дизайна, вы увидите два новых образа. Это да Qt Средне простой стиль. Единственное, что вам нужно сделать, это знать, какие изменения стиля можно применить к тому или иному конкретному окну. существоватьвперед面из Примерсередина,Мы можем изменить внешний вид границы,фонцветиQPushButtonизсамый маленький Можетприниматьбольшой小。 Чтобы примерно изучитьк Воля, какой стиль следует применить к какому-либо оконному виджету, Можно найти в Qt режим помощи Внизчитатьчитать《Qt Справочник по таблицам стилей». Он уже должен быть на вашем компьютере, и вы можете получить к нему доступ в автономном режиме в любое время из индекса «помощь». существовать Там,ты Воляоказаться Qt Виджетиз всех возможных стилей, в том числе ясного из Примера, вы можете изменять его в соответствии с вашими потребностями и руководить копиями и какой вид внешнего вида вы хотите в существующем приложении. Данастолькоиспользоватьиздва Простойстиль表изрезультат。 как вы видете,Наша текущая кнопка просмотра выглядит по-другому:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-wsGQ2IXC-1681869945439) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/2a93ef2e-35fb-4859-8364-ba49e99aa684.png)]

существоватьвперед面из Примерсередина,насвозвращаться避免существоватьстиль表серединанастраивать适когдаизстиль规но。 Qt из правил стиля Зависит в таблицах стилей от Селектор и объявление состоит из. Селектор указывает стиль «Воляиспользовать» и «Звиджет», тогда как объявление объявляет только сам стиль «да». Аналогично, перед существованием у нас есть только объявление использования, а селектор да (неявно) получает таблицу стилей из Виджеты. Даон例ребенок:

Язык кода:javascript
копировать
    QPushButton 
    { 
      border: 2px solid #222222; 
      border-radius: 10px; 
      background-color: #99ff99; 
      min-width: 80px; 
      min-height: 35px; 
    } 

существоватьздесь,QPushButton(или ВОЗна самом деледа{довсесодержание)давыбиратьустройство,и{и}Из间изкодчастьдазаявление。

Теперь давайте взглянем на некоторые важные концепции при настройке таблиц стилей в Qt.

Тип селектора

Ниже приводится Можно найти в Qt Таблица стилей селектора。 При разумном и эффективном использовании они могут значительно сократить объем кода, необходимого для таблиц стилей и внесения изменений. Qt Приложение Появление:

Тип селектора

пример

иллюстрировать

Универсальный

*

Это все давиджет

тип

QPushButton

здесь указывается тип и его дочерний виджет окна добрыйиз

свойство

[text='Browse']

имеет указанный параметр свойства для указанного значения извиджет

добрый

.QPushButton

этоиметьобратитесь к定типизвиджет,Но не его сын, добрый

ID

#inputPushButton

этоиметьобратитесь к定типиobjectNameизвиджет

Преемник

QDialog QPushButton

Эти виджетда, другой виджетиз потомства (потомство)

ребенок

QDialog > QPushButton

Эти виджетды являются прямыми дочерними элементами другого виджетизма.

дочерний виджет

Лучше изда,дочерний виджетдасложныйвиджет Внутрииздочерний виджет。 один ПримердаQPinBoxвиджетначальствоиз КВнизи Кначальство箭головакнопка。 Можеткиспользовать::运算символвыберите их,Как показано ниже:

Язык кода:javascript
копировать
    QSpinBox::down-button 

Всегда не забывайте обращаться Qt Creator режим помощи Внизиз“Qt Ссылка на таблицу стилей» текст глава,кполучать (или БОЛЬШЕ или меньше) Каждыйвиджетиз полного списка дочерних элементов управления. Qt даон Нет断发展израмка,и会обычныйдобавить вновый Функция,поэтому没有Сравниватьэтос己издокумент更好изссылка Понятно。

псевдогосударство

Каждый виджет Windows доступен при определенном псевдосостоянии.,Например,зависать,в соответствии с Внизждать. Можеткиспользовать:运算символсуществоватьстиль表серединавыберите их,Как показано ниже:

Язык кода:javascript
копировать
    QRadioButton:!hover { color: black } 

Как и в случае с дочерними элементами управления, всегда обращайтесь к Qt Creator режим помощи Внизиз Qt стиль表ссылка,кполучатькаждыйвиджетиз适использоватьпсевдогосударство Список表。

каскад

Вы можете установить таблицы стилей для всего приложения, родительского и дочерних окон. существуют Фронт из Пример, мы установили только два дочерния Таблица стилей виджетиз. каждыйокновиджетизстиль Все Воля Выбирать决Вкаскад规но,этот意味着каждыйокновиджетвозвращаться Воляполучатьсуществоватьотецокновиджетилиприложение Средние настройки изстиль规но(еслидля Чтонастраивать Понятностиль表)。 Мы можем воспользоваться этим фактом, чтобы избежать повторной установки правил стиля для определенного окна во всем приложении.

сейчассуществовать,让наспытатьсяMainWindowсерединаизк Внизстиль表,этосуществоватьодин Простойиз Примерсерединаобъединить Понятноты学приезжатьизвсе知识。 убеждатьсяудалитьвсе先впереднастраиватьизстиль表(длядва“Просматривать”кнопка),исуществоватьокновиджетизstylesheetсвойствосередина Простой地использоватьк Внизсодержание:

Язык кода:javascript
копировать
    * 
    { 
      font: 75 11pt; 
      background-color: rgb(220, 220, 220); 
    } 
    QPushButton, QLineEdit, QGroupBox 
    { 
      border: 2px solid rgb(0, 0, 0); 
      border-radius: 10px; 
      min-width: 80px; 
      min-height: 35px; 
    } 
    QPushButton 
    { 
      background-color: rgb(0, 255, 0); 
    } 
    QLineEdit 
    { 
      background-color: rgb(0, 170, 255); 
    } 
      QPushButton:hover, QRadioButton:hover, QCheckBox:hover 
    { 
       color: red; 
    } 
    QPushButton:!hover, QRadioButton:!hover, QCheckBox:!hover 
    { 
      color: black; 
    } 

Если применить сразу, можно увидеть изменение внешнего вида. Вы также, Воля, заметили, что даже стиль виджетизма диалогового окна «Закрыть подтверждение» изменился, причина просто в том, что для нас существует таблица стилей, установленная в его родительском окне. Даскриншот:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-kcwzRl3o-1681869945439) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/6b77d252-7787-4787-bf5a-b7a6109c7d14.png)]

Излишне говорить,Ты можешькпроходить Волястиль表держатьсуществоватьтекстдокументсередина,Затемсуществоватьбегатьчас加载инастраиватьстиль表Приходить执ХОРОШОтакой жеиздействовать,Сразукартинанассуществоватькнига章назад面длявсестороннийкомпьютерное зрение Приложениебаза础строитьчас Место做из Таким образом。 Как упоминалось ранее в этой главе, вы можете даже найти в Сохраняет таблицу стилей по умолчанию в приложении (см. Система ресурсов Qt) и загружает его по умолчанию, таблицу стилей можно пропустить, если пользовательский файл хранится в определенном месте. компьютер. Таким образом, вы можете легко получить настраиваемое приложение. Вы даже можете разделить задачу и попросить профессионального дизайнера предоставить вам таблицу стилей, чтобы вам было проще. найти использовать в приложении. По сути это да Qt Стиль в приложении простой и простой.

Чтобы получить более подробную информацию о таблицах стилей в отношении синтаксиса и помощи, всегда лучше сосредоточиться на Qt Creator режим помощь Внизиз грамматики таблицы стилей глава,потому что для Qt Таблицы стилей в основном неспецифичны для Qt из и существуют в некоторых случаях и являются стандартными CSS Есть разница.

Многоязычная поддержка

существования В этом разделе Воля вы узнаете, как использовать Qt рамкисоздаватьподдержкумногоязычное издание. На самом деле, все сводится к тому, что один добрый предмет очень легко использовать. QTranslatorдобрыйдахозяинхотетьиз Qt добрый, отвечающий за обработку вывода (отображения) текста при интернационализации. Вам просто нужно убедиться в следующем:

  1. существоватьстроитьпроектчас,пожалуйстаиспользоватьпо умолчаниюязык(Например Английский)。 этот意味着,Тольковернопоказыватьизвсесодержаниеиспользоватьпо умолчаниюязыкиз句ребенокиодин词Прямо сейчас Может。
  2. убеждатьсяtr()функциясередина Включатькодсерединаизвсеискусство字заявление,или или конкретно,выбиратьдругойязыкчас需хотетьпереводитьизвсеискусство字заявление。

Например,существоватькодсередина,еслиты需хотетьписать Такой какOpen Input ImageИздобрыйизискусство字заявление(СразукартинасуществоватьHello_Qt_OpenCVПримерсередина Место做из Таким образом),Только Воля Чтопередача Даватьtrфункцияиписатьtr("Open Input Image")。 Инструмент дизайна не делает этого и применяется только к тексту внутри кода. При настройке свойства в существующем дизайне вам нужна только текстовая строка use.

  1. Убедитесь, что документ перевода указан в файле существующего проекта. дляэтот,ты需хотетьиспользоватьTRANSLATIONSПриходитьобратитесь к定это们,СразукартинапроектдокументсерединаизSOURCESиHEADERSодин样。

Например,Если вы хотите, чтобы приложение существовало, используйте перевод на немецкий и турецкий языки.,пожалуйста Воляк Внизсодержаниедобавить впроект(*.PRO)документсередина:

Язык кода:javascript
копировать
        TRANSLATIONS = translation_de.ts translation_tr.ts 

Убедитесь, что файл перевода для каждого всегда имеет четкое имя. Прямо сейчасчтобы ты могк随意命имя,такжебольшинствоиспользовать Включатьизязыккод Приходить命имяэто们(trвыражать土耳Что语,deвыражать德语,и т. д),нравитьсявперед面из Пример Место示。 Это также помогает Qt Linguist инструмент(Ты Волясуществоватьназад面изучать)учитьсяпереводитьизглаз标язык。

  1. использовать Qt изlupdateинструментсоздавать TS файлы (обновите их, если они уже существуют). lupdateда Qt инструмент,Можетсуществоватьвсеисходный коди UI Найдите в файле переводимый текст, а затем обновите создателей, упомянутых на предыдущем шаге. TS документ. Ответственныйпереводить Приложениелюди员Можеткиспользовать Qt Linguist инструментлегкий Открыть TS файлов и сосредоточьтесь на простом интерфейсе пользователя для перевода приложения.

lupdateКусочек В Qt Установитьизbinпапка Внутри。 Например,существовать Windows OS На пути из добрый выглядит так:

Язык кода:javascript
копировать
 C:\Qt\Qt5.9.1\5.9.1\msvc2015\bin 

Вы можете начать с Qt Creator серединасуществоватьпроектсередина执ХОРОШОlupdate,Толькосуществоватьхозяинменюсерединащелкнуть“инструмент/внешний/языкучёный/更новыйпереводить”(lupdate)。 Пользователи Windowsиз重хотеть На что следует обратить внимание:еслисуществоватьбегатьlupdateназад遇приезжатьлюбойвопрос,Это может быть вызвано сбоем установки Qt. Чтобы решить эту проблему,Толькоиспользоватьсреда разработкииз Заказ提示символбегатьlupdate。 еслив соответствии с照книга Книгасерединаизиллюстрироватьруководитьдействовать,но Можеткотначинатьменю执ХОРОШОDeveloper Command Prompt for VS2015,ЗатемиспользоватьcdЗаказпереключиться напроектпапка,Затембегатьlupdate,нравитьсяэтот处Место示(ПримерCaseдляHello_Qt_OpenCV Ранее мы создали проект):

Язык кода:javascript
копировать
        C:\Qt\Qt5.9.1\5.9.1\msvc2015\bin\lrelease.exe Hello_Qt_OpenCV.pro 

проектировать После этого Заказа, если вы Войдете в папку проекта, вы заметите, что текущее существование было заменено ранее указанным файлом существующего проекта. TS документ. 随着тыизприложение越Приходить越большой,обычныйбегатьlupdateНет常重хотеть,Он может извлекать новые строки, которые необходимо перевести.,идальше Расширятьмногоязычныйподдерживать。

  1. использовать Qt Linguist инструмент для перевода всех необходимых изниц. Он уже установлен на вашем компьютере, поскольку используется по умолчанию. Qt Установитьизчасть。 Тольковыбиратьдокумент/Открыть,ЗатемотProjectпапкасерединавыбиратьвсе TS Файл (только что созданиз) и Открыть им. еслиприезжатьв настоящий моментдляконец,тыуже经遵循ПонятносвязанныйHello_Qt_OpenCVпроектизвсеиллюстрировать,Затем существовать Qt Linguist в файле Открыть TS после,Вы должны увидеть следующий экран:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-zOydL6B6-1681869945439) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/3ef9dca9-121f-4ff6-99eb-1f039a1eca37.png)]

Qt Linguist Позволяет быстро и легко переводить все переводимые элементы проекта. Толькоиспользоватьпоказыватьизвсеязыкдлякаждыйпроектписатьпереводить,Затемиспользоватьвершинаизинструментстолбец Воля Что标记дляDone。 существоватьпокидать Qt Linguist инструмент, пожалуйста, обязательно руководите сохранением.

  1. использовать Конвертироватьназадиз TS Создан файл Сжатый из QM файловый и двоичный Qt языкдокумент. дляэтот,ты需хотетьиспользовать Qt lreleaseинструмент。

использоватьlreleaseиlupdateтакой же,тысуществоватьвперед面изшагсерединаучитьсяприезжать。 Просто все будутlupdateЗаказзаменятьдляlrelease,Вот и все.

  1. Воля QM файл (двоичный языковой файл) добавить в ресурсах вашего приложения.

Вы научились использовать Система ресурсов Qt。 Только СоздайтесказатьдляTranslationsизновыйвперед缀,Затемсуществовать Долженвперед缀Вниздобавить вновыйсоздаватьиз QM документ. Если правильно Заканчивать, проект должен содержать следующее содержание:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-BLiXoKvl-1681869945439) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/621d6ca1-afc4-4254-9576-869ddc8238ba.png)]

  1. сейчассуществовать,Ты можешькначинатьиспользоватьQTranslatorдобрыйсуществоватьтыизприложениесерединаиспользовать Различныйязык,возвращаться Можно найти запускать при существовании переключения между различными языками. 让насснова回приезжать ПримерпроектHello_Qt_OpenCV。 Существует множество способов использования переводчика в приложении, но сейчас мы начнем с самого простого метода. первый ВоляQTranslatorВключатьдокументдобавить вmainwindow.hдокументсередина,исуществоватьMainWindowдобрыйсерединаопределениедвачастныйQTranslatorверно象,Как показано ниже:
Язык кода:javascript
копировать
        QTranslator *turkishTranslator; 
        QTranslator *germanTranslator;  
  1. существовать调использоватьloadSettingsфункцияпосле,Воляк Внизсодержаниедобавить вMainWindowструктураустройствокодсередина:
Язык кода:javascript
копировать
        turkishTranslator = new QTranslator(this); 
        turkishTranslator 
          ->load(":/translations/translation_tr.qm"); 
        germanTranslator = new QTranslator(this); 
        germanTranslator 
          ->load(":/translations/translation_de.qm"); 
  1. сейчассуществовать,дачас候КнасизHello_Qt_OpenCVпроект Добавитьодинхозяинменю,ипозволятьпользовательсуществовать Этиязык Из间руководитьвыключатель Понятно。 ты Толькосуществовать Qt Creator шаблон Щелкните правой кнопкой мыши окно под проектированием и выберите «Создавать строку меню». Затем,существоватьвершинаменюстолбецсерединадобавить водинимядляLanguageизпроект。 Просто нажмите и введите следующее, чтобы добавить к нему три субтитра:

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

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-8Eei0Vpc-1681869945440) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/9722d5ae-2b7c-4dca-b49a-c59e484845e7.png)]

Внизу «Существующийдизайниз» вы можете найти действие «Редпресс». Очевидно, теперь у вас здесь есть три записи, которые автоматически отображаются в главном меню. это们каждый Всеверноотвечать Втысуществоватьхозяинменюсерединавходитьиз Каждый видязыкимя。

  1. Щелкните правой кнопкой мыши «Турецкий».,Затемвыбирать“Перейти кслот”,Затемот Список表серединавыбиратьtrigger(),Затемщелкнуть“Конечно”。 Другими словами (поскольку вы существует Нет. 2 глава,»создавать из Нет.а Qt и OpenCV проект”середина Местоучитьсяиз),дляactionTurkishверно象изкурокслотписатьк Внизкод ХОРОШО:
Язык кода:javascript
копировать
        void MainWindow::on_actionTurkish_triggered() 
        { 
          qApp->installTranslator(turkishTranslator); 
        }      
  1. дляactionGermanверно象добавить вк Вниз ХОРОШО。 по сути,повторитьиллюстрировать,но Воля Что适отвечать ВactionTurkishверно象:
Язык кода:javascript
копировать
        void MainWindow::on_actionGerman_triggered() 
       { 
         qApp->installTranslator(germanTranslator); 
       } 
  1. иверноactionEnglishверно象执ХОРОШОтакой жеиздействовать。 на этот раз,ты需хотетьотприложениесерединаудалитьпереводитьустройство,потому чтодля Английскийданас Приложениепо умолчаниюязык:
Язык кода:javascript
копировать
        void MainWindow::on_actionEnglish_triggered() 
        { 
         qApp->removeTranslator(turkishTranslator); 
         qApp->removeTranslator(germanTranslator); 
       } 
  1. Хорошо, теперь мы здесь существуем найти а именно Qt Весь переведенный связанный контент находится в приложении, за исключением того, что нам нужно убедиться, что исходный проект на экране был повторно переведен и практически перезагружен. дляэтот,нас需хотетьиспользоватьQMainWindowдобрыйизchangeEvent。 каждый разиспользоватьвперед面изinstallTranslatorиremoveTranslatorфункция Установитьили移除переводитьустройствочас,Language Changeсобытие Все会发送приезжатьприложениесерединаизвсеокно。 хотеть捕获этотсобытие,и обязательно перезагрузите окно при изменении языка,нас需хотетьсуществоватьпрограммасерединакрышкаchangeEventфункция. Просто Воляк следующую строку кода добавьте вmainwindow.hдокументсерединаMainWindowдобрыйиззащищенный член,Сразусуществоватьты先впередопределениеcloseEventиз Кусочекнаборпосле:
Язык кода:javascript
копировать
        void changeEvent(QEvent *event); 
  1. сейчассуществовать,Воляк Внизкод片段добавить втыизmainwindow.cppдокументсередина:
Язык кода:javascript
копировать
        void MainWindow::changeEvent(QEvent *event) 
        { 
          if(event->type() == QEvent::LanguageChange) 
          { 
            ui->retranslateUi(this); 
          }  
          else 
          { 
            QMainWindow::changeEvent(event); 
          } 
        } 

Предыдущий код означает только да,еслиchangeсобытиедаLanguage Change,но重новый Конвертироватьокно,в противном случае,один切Всеотвечать照常руководить。 retranslateUiфункциядаиспользоватьUICгенерироватьиз(пожалуйста参читатькнига章изUICчасть),это Толькодав соответствии сприложениесерединадо настоящего времени УстановитьизQTranslatorверно象настраиватьправильныйпереводитьизнить.

Вот и все. Теперь вы можете запустить свое приложение и попытаться переключиться между двумя языками. У нас уже есть Заканчивать Нет. Настоящее многоязычное приложение. Важно отметить, что то, что вы узнаете в этом разделе, в основном применимо ко всем Qt применить, ида制делатьмногоязычный Приложениестандартныйметод。 существуют использовать разные языки для более индивидуальной настройки, Воля следует почти такому же набору инструкций, но да Если не используется Ресурсные файлы Языковые файлы Воля встроены в приложение, было бы лучше, если бы язык загружался из определенного Кусочка из места на диске. 。 этотиметь更новыйпереводить甚至добавить вновыйязык(иметь Болеекод)из Преимущества,без необходимости пересобирать само приложение.

Создавайте и используйте плагины

существоватьприложениесерединаиспользоватьплагинда Расширять Приложение最强большойметод Изодин,люди们日常生活серединаиспользоватьизмногоприложение Всек益Вплагиниз Функция。 плагин Толькодаон Библиотека(Windows начальстводля*.dll,Linux начальстводля*.soждать),Можно найти Запуск загружается и используется, он выполняет конкретную задачу, но, конечно, он не может работать как отдельное приложение, это зависит от его использования в приложении. В этой книге мы также будем использоватьплагин Приходить Расширятькомпьютерное зрениеприложение.

существоватькнига节середина,нас Воляизучатькак Создайте Примерприложение(сказатьдляImage_Filter),Долженприложение Простой地加载ииспользоватькомпьютерначальствообратитесь к定папкасерединаизплагин。 Но да, существовать до этого, мы, Воля, научимся существовать. Qt серединасоздаватьв то же времяиспользовать Qt и OpenCV рамкаизплагин, потому что для нас скорее всего понадобится изплагиниспользовать OpenCV Библиотека, где можно творить чудеса компьютерного зрения. Итак, начнем.

первый,Нам нужно определить набор интерфейсов,кудобныйнасизприложениеиплагинверноразговаривать。 и C++ Средний интерфейс эквивалентен изда с чистой виртуальной функцией. поэтому,Нам в основном нужен интерфейс,Чтосередина Включатьнас期望существоватьплагинсередина Предоставить извсе Функция。 в целом,Это дасоздаватьплагиниз Способ,Таким же образом сторонние разработчики могут использовать приложения, разработанные другими. даиз,Они знают плагинизинтерфейса,Толькохотетьиспользоватьдействительный执ХОРОШОнекоторый Функция издействительныйкоднаполнение Прямо сейчас Может。

интерфейс

Интерфейс гораздо важнее, чем кажется на первый взгляд. даиз,Это в основномон Что Все Нет做издобрый,Да,это Список出Понятнонасизприложениесуществоватьвсечас间необходимыйизвсеплагинизэскиз。 Поэтому нам Нужно Убедитесь, что вы все поняли правильно с самого начала будут обязательные из функций включены в существующий интерфейс плагина, иначе добавить, удалить или изменить функции после к. Зависит На данный момент мы имеем дело с Примерпроектом, поэтому он может показаться не таким уж серьезным, но дасуществовать реальный проект, это обычно одни из ключевых факторов, определяющих масштабируемость приложения. поэтому,Теперь, когда мы знаем важность интерфейса,Сразу Можеткначинатьдля Примерпроект Создайтеинтерфейс。

Открыть Qt Создатель, и убедитесь, что Открыть какой-либо проект не существует. Теперь выберите «Файл/Новый файл» и «Проект» в главном меню. в окне появится существующий, выберите из списка слева (внизу списка) C++,ЗатемвыбиратьC++ Header File。 входитьcvplugininterfaceделатьдлядокументимя,Ран Преемник Продолжениеруководитьдействовать,直приезжать Входитькодредактироватьустройствомодель。 Воля кода меняет дляк следующего содержания:

Язык кода:javascript
копировать
    #ifndef CVPLUGININTERFACE_H 
    #define CVPLUGININTERFACE_H 
    #include <QObject> 
    #include <QString> 
    #include "opencv2/opencv.hpp" 
    class CvPluginInterface 
    { 
      public: 
      virtual ~CvPluginInterface() {} 
      virtual QString description() = 0; 
      virtual void processImage(const cv::Mat &inputImage, 
         cv::Mat &outputImage) = 0; 
    }; 

   #define CVPLUGININTERFACE_IID "com.amin.cvplugininterface" 
   Q_DECLARE_INTERFACE(CvPluginInterface, CVPLUGININTERFACE_IID) 
   #endif // CVPLUGININTERFACE_H 

Возможно, вы заметили, что добрый, похожий на киз, строка кода автоматически добавляется виспользовать Qt Creator создатьиз в любом заголовочном файле:

Язык кода:javascript
копировать
    #ifndef CVPLUGININTERFACE_H 
    #define CVPLUGININTERFACE_H 
    ... 
    #endif // CVPLUGININTERFACE_H 

Они гарантируют, что существование каждого заголовочного файла будет включено (и обработано) только один раз во время компиляции приложения. В принципе, есть много других способов. найти в C++ середина实сейчастакой жеизглаз标,но Да Самый широкий泛приниматьииспользоватьизметод,尤Чтода Qt и OpenCV Рамка получила высшую степень поддержки на платформе. и Qt Creator использовать вместе, всегда автоматически Воля его добавляет в заголовочный файл без выполнения каких-либо дополнительных действий.

Предыдущий код в основном да Qt Все необходимое в плагине интерфейса. Существует Примеринтерфейса, у нас есть только два простых типа функции, нам нужно подключиться к Я жду, но, как мы увидим позже, воля, параметры поддержки, язык и т. д., нам нужно и многое другое. Да,длянасиз Пример,Этого должно быть достаточно.

дляодин般из C++ Очень важное замечание для разработчиков: да, перед публичным участником он существует. C++ Известный как виртуальный деструктор, это один из наиболее важных методов, который многие люди забывают включить, не обращая на него особого внимания. Поэтому лучше проверить его истинное значение и запомнить, чтобы избежать утечек памяти, особенно дасуществоватьиспользовать. Qt плагинчас:

Язык кода:javascript
копировать
         virtual ~CvPluginInterface() {} 

По сути, все, что имеет виртуальные методы и предназначено для полиморфного использования. C++ База добрый должна содержать виртуальный деструктор. Это помогает гарантировать, что даже если базовый указатель добрыйиз обращается к дочернему элементу добрый, деструктор все равно сможет его вызвать (полиморфизм). К сожалению, для большинства C++ компилятор,существовать犯этот常见 C++ Вы даже не получите предупреждение, если допустите программную ошибку.

поэтому,насизплагининтерфейс Включатьодинимядляdescription()изфункция,Долженфункцияцельсуществоватьвозвращатьсялюбойплагинизописыватькисвязанный Долженплагиниз有использоватьинформация。 этовозвращаться ВключатьодинимядляprocessImageизфункция,Долженфункция ВоляOpenCV Matдобрыйделатьдлявходить,ивозвращатьсяодинделатьдлявыход。 очевидно,существоватьэтотфункциясередина,нас希望каждыйплагин执ХОРОШО某种изображениеиметь дело с,Фильтрация и другие операции,Затем Волярезультатпоставлять Даватьнас。

после,насиспользоватьQ_DECLARE_INTERFACEМакрос Волядобрыйопределениедляинтерфейс。 Если вы не включите этот макрос, Qt Воля Не могущий Волянасиздобрыйидентифицироватьдляплагининтерфейс。 CVPLUGININTERFACE_IIDотвечать Должендаиметьдобрыйпохожий包имя Форматиз唯один字символ串,Датыпо сути Можеткв соответствии сс己изпредпочтенияруководить Изменять。

убеждаться Воляcvplugininterface.hдокументдержатьприезжатьтывыбиратьизлюбой Кусочекнабор,Затем Воля Что关闭。сейчассуществовать,нас Воля Создайтеиспользоватьэтотинтерфейсизплагин。 让насиспользовать先впередсуществовать Нет. 2 глава,»создавать из Нет.а Qt и OpenCV Смотрите из когда "проект" OpenCV функция:medianBlur

плагин

сейчассуществовать,нас Воля Создайтеимядляmedian_filter_pluginизплагин,ДолженплагиниспользоватьнасизCvPluginInterfaceинтерфейсдобрый. Начните с выбора в главном меню «Файл», затем «Новый файл» и «Проект». Затем выберите «Библиотеки» и «C++». Библиотека», как показано на следующем снимке экрана:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-bPf2pyPk-1681869945440) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/3c960b11-343c-4601-9096-d5390935722e.png)]

Убедитесь, что в качестве «типа» выбрана «Общая библиотека».,Затемвходитьmedian_filter_pluginделатьдляимя,Затем Нажмите «Далее»。 Выберите тип комплектадлярабочего стол и нажмите вперед. существовать“выбиратьнеобходимыйизмодуль”页面середина,убеждатьсятолько选серединаQtCore,Затем нажмите «Далее» (последнее «Заканчивать»),без изменения каких-либо опций,До финального выхода Qt Creator от создателя кода.

По сути, мы создали Qt плагинпроект,ивозможно, ты заметил,плагинпроектные структурыприезжатьв настоящий моментдляконецнаспытаться Проходитьизвсеприложениепроект Нет常Взаимнопохожий(除Понятноэто没有 UI документ),Дапотому чтодляплагинна самом деле Нет能иприложениетакой же,Просто да он не может проектировать в одиночку.

сейчассуществовать,Волянассуществоватьначальствоодин步серединасоздаватьизcvplugininterface.hдокументкопироватьприезжатьновыйсоздаватьизплагинпроектизпапкасередина。 Затем просто щелкните правой кнопкой мыши папку проекта на панели «Проект» и выберите «Добавить существующие файлы» во всплывающем меню, чтобы добавить впроектсередина,Как показано ниже:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-4N1f3IZw-1681869945440) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/09784656-31f1-4aba-ac38-30ec71d92381.png)]

нам нужно сказать Qt Даонплагин,ине толькодалюбойбиблиотека. Здесь нам нужно скачать контентдобавить а именно*.PROдокументсередина。 Ты можешьк Воля Чтодобавить В проекте есть небольшой кусочек, но хочу его добавить вTEMPLATE = libХОРОШОдаонхорошая привычка:

Язык кода:javascript
копировать
    CONFIG += plugin 

Теперь существуют, нам нужно к OpenCV добавить а именноплагинпроектсередина。 К настоящему времени это должно быть для вас проще простого. Только Воляк Внизсодержаниедобавить вплагиниз*.PROдокументсередина,Сразукартина ИзвпередиспользоватьHello_Qt_OpenCVпроект Место做из Таким образом:

Язык кода:javascript
копировать
    win32: { 
      include("c:/dev/opencv/opencv.pri") 
    } 
    unix: !macx{ 
      CONFIG += link_pkgconfig 
      PKGCONFIG += opencv 
    } 
    unix: macx{ 
     INCLUDEPATH += "/usr/local/include" 
     LIBS += -L"/usr/local/lib" \ 
     -lopencv_world 
    } 

когдаты К*.PROдокументсерединадобавить в Некоторыйкод,или ВОЗиспользовать Qt Creator В главное меню (и другие ярлыки интерфейса пользователя) добавлены новые улучшенияили Qt 资источникдокументчас,Руководствобегатьqmakeдаоночень хорошийиз Привычка。 Если вы найдете Qt Creator Содержимое ипроекта не синхронизировано. Ты можешькпроходитьот“проект”панельиз Щелкните правой кнопкой мышименюсерединавыбирать“бегатьqmake”Приходитьлегкий Заканчиватьэтотдействовать,Как показано на следующем скриншоте:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-l8de5cQU-1681869945440) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/d98f4e88-7fdd-470a-89d5-4f7efac2936a.png)]

хорошо,сцена уже готова,нас Можеткначинатьдля Нет.один Qt + OpenCV добавить, написать код. Как вы увидите в следующей главе «Волясуществовать», мы в «Воляиспользовать плагин» добавили в наше приложение «добрые» функции; этот样,нас Воля Толькососредоточиться разработан плагин без добавления изкаждого функционала для изменения всего приложения. поэтому,Очень важно ознакомиться с процессом.

первый Открытьmedian_filter_plugin.hдокументируководитьнравиться Вниз Исправлять:

Язык кода:javascript
копировать
    #ifndef MEDIAN_FILTER_PLUGIN_H 
    #define MEDIAN_FILTER_PLUGIN_H 
    #include "median_filter_plugin_global.h" 
    #include "cvplugininterface.h" 
    class MEDIAN_FILTER_PLUGINSHARED_EXPORT Median_filter_plugin: 
      public QObject, public CvPluginInterface 
    { 
      Q_OBJECT 
      Q_PLUGIN_METADATA(IID "com.amin.cvplugininterface") 
      Q_INTERFACES(CvPluginInterface) 
      public: 
      Median_filter_plugin(); 
      ~Median_filter_plugin(); 
      QString description(); 
      void processImage(const cv::Mat &inputImage, 
         cv::Mat &outputImage); 
    }; 
    #endif // MEDIAN_FILTER_PLUGIN_H 

создаватьmedian_filter_pluginпроектчас,большинствовышекоддас动генерироватьиз。 Это дабазакнига Qt Библиотека добрый определение внешнего вида. Но да, только то, что мы добавили, делает это забавным изложением. Давайте рассмотрим предыдущий код и посмотрим, что такое настоящее добавление. в Этот добрый серединаизконтента:

  1. первый,нас Включать Понятноcvplugininterface.hголовадокумент.
  2. Затем,насубеждатьсяMedian_filter_pluginдобрыйнаследовать ПонятноQObjectиCvPluginInterface
  3. После этого мы добавили Qt Требуемый макрос — это Воля, которую наша библиотека распознает для плагина. этоттольковыражатьк Внизтри ХОРОШОкод,это们верноотвечать Втысуществоватькнига章Извперед学Проходитьиз Нет.одинQ_OBJECTМакрос,и По умолчанию Должно быть сохраненосуществовать Влюбой Qt добрыйсерединакпозволять Qt Конкретные функции (такие как сигналы и слоты). ВнизодиндаQ_PLUGIN_METADATA,это需хотетьсуществоватьплагинизисходный кодсередина恰好出сейчасодин次,для добавлениясвязанныйплагинизметаданные; наконецодинQ_INTERFACES需хотетьзаявлениесуществоватьплагинсередина实сейчасизинтерфейс。 Данеобходимыйиз Макрос:
Язык кода:javascript
копировать
        Q_OBJECT 
        Q_PLUGIN_METADATA 
        Q_INTERFACES 
  1. Затем,нассуществоватьдобрыйсерединадобавить в ПонятноdescriptionиprocessImageфункцияизопределение。 существоватьздесь,Наша Воля действительно определяет функцию плагиниз.,Вместо того, чтобы датолькоиметьзаявление Вместо того, чтобы да实сейчасизинтерфейсдобрый.
  2. наконец,нас Можетк Волянеобходимыйиз Изменятьидействительный实сейчасдобавить вmedian_filter_plugin.cppдокументсередина。 Убедитесь, что воляк следующие три функциидобавить вmedian_filter_plugin.cppдокументизнижний:
Язык кода:javascript
копировать
       Median_filter_plugin::~Median_filter_plugin() 
       {} 

       QString Median_filter_plugin::description() 
       { 
         return "This plugin applies median blur filters to any image." 
         " This plugin's goal is to make us more familiar with the" 
         " concept of plugins in general."; 
       } 
       void Median_filter_plugin::processImage(const cv::Mat &inputImage, 
         cv::Mat &outputImage) 
      { 
        cv::medianBlur(inputImage, outputImage, 5); 
      } 

настолькодобавить в Понятнодобрый析构устройствоиз实сейчас:descriptionиprocessImageфункция. как вы видете,descriptionфункциявозвращатьсясвязанныйплагиниз有использоватьинформация,существуют В этом случае,Это не сложная страница изпомощь,и Толькоданесколько слов。 processImageфункциятолько ВоляmedianBlurприложение Визображение,тыуже经(简хотеть地)существовать Нет. 2 глава,»создавать из Нет.а Qt и OpenCV проект”серединаиспользовать Понятно Долженизображение.

сейчассуществовать,ты Можно найти в После щелчка правой кнопкой мыши по проекту или нажмите «Перестроить» в пункте «Сгенерировать» в главном меню. Этот файл Воля Создайтеплагин, который мы Волясуществоватьиспользуем в следующем разделе, обычно существуетипроект находится на том же уровне папки. ДаBuildпапка,существовать Нет. 2 глава,»создавать из Нет.а Qt и OpenCV проект" в правительстве.

Зависит от операционной системы,плагиндокументиз Расширятьимя Можетк Нет同。 Например,существовать Windows начальствоотвечатьдля.dll,существовать MacOS и Linux начальствоотвечатьдля.dylibили.so,По этой доброй рекомендации.

плагин加载устройствоипользователь

сейчассуществовать,нас Воляиспользоватьсуществоватькнига Книганачальствоодин节серединасоздаватьизплагин。 Начнем с создания нового из Qt Widgets Примените проект, чтобы начать. нас命имядляPlugin_User。 имя生имя尔назад,Фильм Воля OpenCV рамкадобавить в*.PROдокументсередина(тыуже经достаточноучитьсяэтотсодержание),Однако Преемник продолжил: «Создательдобрый контент похож на интерфейс изпользователя, представленный ниже:

  1. очевидно,ты需хотеть Исправлятьmainwindow.uiдокумент,Чтобы это руководитьдизайнк, пусть это будет выглядеть вот так,и установите все имена объектов,Как показано на скриншоте ниже:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-4jNQJLpR-1681869945441) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/08d03304-663a-49d2-bc89-b68d12bb16fa.png)]

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

  1. Следующий,Воляcvplugininterface.hдокументдобавить в папку проекта, а затем используйте опцию «Добавить существующие файлы» Воля ее добавьте в впроекте, как в создателе плагина.
  2. Теперь мы можем начать работу с интерфейсом написания кода, затем загрузить его, проверить иисполь зовать плагин и зкодировать. Во-первых, Воля требует из заголовка добавить вmainwindow.hдокумент,Как показано ниже:
Язык кода:javascript
копировать
        #include <QDir> 
        #include <QFileDialog> 
        #include <QMessageBox> 
        #include <QPluginLoader> 
        #include <QFileInfoList> 
        #include "opencv2/opencv.hpp" 
        #include "cvplugininterface.h" 
  1. Затем,существовать};Извперед,КMainWindowдобрыйизчастныйчлендобавить водинфункция,Кажется, это хорошее место:
Язык кода:javascript
копировать
        void getPluginsList();  
  1. сейчассуществовать,переключиться наmainwindow.cppи Воляк Внизопределениедобавить вдокументвершина,Сразу послесуществоватьлюбойсуществующий#includeХОРОШОпосле:
Язык кода:javascript
копировать
        #define FILTERS_SUBFOLDER "/filter_plugins/" 
  1. Затем,Воляк Внизфункциядобавить вmainwindow.cpp,этотпо сутидаgetPluginsListфункцияиз实сейчас:
Язык кода:javascript
копировать
        void MainWindow::getPluginsList() 
        { 
          QDir filtersDir(qApp->applicationDirPath() + 
            FILTERS_SUBFOLDER); 
          QFileInfoList filters = filtersDir.entryInfoList( 
          QDir::NoDotAndDotDot | 
          QDir::Files, QDir::Name); 
          foreach(QFileInfo filter, filters) 
          { 
            if(QLibrary::isLibrary(filter.absoluteFilePath())) 
          { 
            QPluginLoader pluginLoader( 
                filter.absoluteFilePath(), 
                this); 
            if(dynamic_cast<CvPluginInterface*>( 
                pluginLoader.instance())) 
            { 
                ui->filtersList->addItem( 
                    filter.fileName()); 
                pluginLoader 
                    .unload(); // we can unload for now 
            } 
            else 
            { 
                QMessageBox::warning( 
                    this, tr("Warning"), 
                    QString(tr("Make sure %1 is a correct" 
                    " plugin for this application<br>" 
                    "and it's not in use by some other" 
                    " application!")) 
                    .arg(filter.fileName())); 
            } 
          } 
          else 
          { 
            QMessageBox::warning(this, tr("Warning"), 
                QString(tr("Make sure only plugins" 
                    " exist in plugins folder.<br>" 
                    "%1 is not a plugin.")) 
                    .arg(filter.fileName())); 
          } 
          }   

          if(ui->filtersList->count() <= 0) 
          { 
            QMessageBox::critical(this, tr("No Plugins"), 
            tr("This application cannot work without plugins!" 
            "<br>Make sure that filter_plugins folder exists " 
            "in the same folder as the application<br>and that " 
            "there are some filter plugins inside it")); 
            this->setEnabled(false); 
          } 
        } 

первыйдавайте посмотрите роль этой функции. вперед面изфункция,нас ВолясуществоватьMainWindowдобрыйизструктураустройствосередина调использовать Долженфункция:

  • первый,гипотезасуществоватьимядляfilter_pluginsизребенокпапкасередина存существоватьплагин,и Долженребенокпапкаиприложениеисполняемый файл Кусочек В同одинпапкасередина。 (позже,нас需хотетьсуществовать Долженпроектизbuildпапка Внутри Руководствосоздаватьэтотпапка,Затем Волясуществоватьначальствоодин步середина Строитьплагинкопироватьприезжать Долженновыйсоздаватьизпапкасередина。)Ниже приводится для получения плагина фильтра по прямому пути из информации. Подпапки:
Язык кода:javascript
копировать
          qApp->applicationDirPath() + FILTERS_SUBFOLDER
  • Следующий,этоиспользоватьQDirдобрыйизentryInfoListфункцияотпапкасерединаизвлекатьQFileInfoListQFileInfoListдобрыйкнига身по сутидаонQListдобрый,Чтосередина ВключатьQFileInfoэлемент(QList<QFileInfo>),каждыйQFileInfoэлемент Всепоставлятьсвязанный磁盘начальстводокументизинформация。 существуют В этом случае,каждыйдокумент Вседаонплагин。
  • после,проходить Траверсforeachциклсерединаиздокумент Список表,это检查pluginsпапкасерединаизкаждыйдокумент,ªУбедитесь, что вы принимаете только плагины (библиотеки),пожалуйстаиспользоватьк Внизфункция:
Язык кода:javascript
копировать
             QLibrary::isLibrary 
  • Затем проверьте приведенный на предыдущем шаге файл библиотеки, чтобы убедиться, что он совместим с нашим интерфейсом плагина. нас Неттолько会позволятьлюбой Библиотекадокументделатьдляплагинодеялопринимать,поэтомунас Воляк Внизкодиспользовать Вэтотглазиз。
Язык кода:javascript
копировать
            dynamic_cast<CvPluginInterface*>(pluginLoader.instance())
  • Если библиотека существовала на предыдущем этапе, необходимо провести тест,но认для Должен Библиотекадаправильныйизплагин(иCvPluginInterfaceсовместимый),ужедобавить в нашем окнеиз Виджет список, а затем удалить. Мы можем найти Просто перезагрузите его, когда это необходимо.
  • существоватькаждыйшагсередина,если есть проблема,ноиспользоватьQMessageBoxКпользовательпоказывать有использоватьизинформация。 такой же,наконец,Если список пуст,означает, что плагина нет,Окно на изWindowвиджет отключено,Приложение недоступно.
  1. Нетхотеть忘记существоватьsetupUi调использоватьпослеотMainWindowструктураустройство调использоватьэтотфункция.
  2. насвозвращаться需хотетьписатьinputImgButtonизкод,Долженкодиспользовать ВОткрытьизображениедокумент. здесьда:
Язык кода:javascript
копировать
        void MainWindow::on_inputImgButton_pressed() 
        { 
          QString fileName = 
             QFileDialog::getOpenFileName( 
             this, 
             tr("Open Input Image"), 
             QDir::currentPath(), 
             tr("Images") + " (*.jpg *.png *.bmp)"); 
             if(QFile::exists(fileName)) 
            { 
             ui->inputImgEdit->setText(fileName); 
            } 
        } 

Мы видели этот код раньше, и он не нуждается в объяснениях. это Толькодапозволятьты Открытьизображениедокументиубеждатьсяужеправильныйвыбиратьэто。

  1. сейчассуществовать,нас ВолядляhelpButtonписатькод,Долженкод Волясуществоватьплагинсерединапоказыватьdescriptionфункцияизрезультат:
Язык кода:javascript
копировать
       void MainWindow::on_helpButton_pressed() 
       { 
         if(ui->filtersList->currentRow() >= 0)
        { 
         QPluginLoader pluginLoader( 
           qApp->applicationDirPath() +
           FILTERS_SUBFOLDER +
           ui->filtersList->currentItem()->text());
           CvPluginInterface *plugin = 
             dynamic_cast<CvPluginInterface*>(
           pluginLoader.instance()); 
           if(plugin) 
           { 
             QMessageBox::information(this, tr("Plugin Description"), 
                plugin->description()); 
           } 
           else 
           { 
            QMessageBox::warning(this, tr("Warning"),
            QString(tr("Make sure plugin %1" " exists and is usable.")) 
           .arg(ui->filtersList->currentItem()->text())); 
           }
        }
        else
        { 
          QMessageBox::warning(this, tr("Warning"), QString(tr("First 
            select a filter" " plugin from the list.")));
        } 
      }

насиспользоватьQPluginLoaderдобрыйот Список表серединаправильный加载плагин,Затемиспользоватьinstanceфункцияполучать Что Пример,наконец,нас Воляпроходитьинтерфейссуществоватьплагинсередина调использовать Долженфункция.

  1. такой жеизлогикатакже适использовать ВfilterButton。 唯одинизокруг Недана этот раз,Мы Воля вызываем актуальное из функции фильтра,Как показано ниже:
Язык кода:javascript
копировать
      void MainWindow::on_filterButton_pressed() 
      {
        if(ui->filtersList->currentRow() >= 0 && 
          !ui->inputImgEdit->text().isEmpty()) 
        { 
          QPluginLoader pluginLoader(qApp->applicationDirPath() +
            FILTERS_SUBFOLDER + 
            ui->filtersList->currentItem()->text()); 
            CvPluginInterface *plugin = 
              dynamic_cast<CvPluginInterface*>(
                pluginLoader.instance()); 
              if(plugin)
              { 
               if(QFile::exists(ui->inputImgEdit->text()))
               { 
                using namespace cv;
                Mat inputImage, outputImage;
                inputImage = imread(ui->inputImgEdit->
                text().toStdString()); 
                plugin->processImage(inputImage, outputImage); 
                imshow(tr("Filtered Image").toStdString(),
                   outputImage); 
               } 
               else
               { 
                 QMessageBox::warning(this, 
                  tr("Warning"), 
                  QString(tr("Make sure %1 exists.")) 
                  .arg(ui->inputImgEdit->text()));
               }
              } 
              else
              { 
               QMessageBox::warning(this, tr("Warning"), 
               QString(tr(
               "Make sure plugin %1 exists and is usable." )) 
               .arg(ui->filtersList->currentItem()->text())); 
              }
             } 
           else
           {
            QMessageBox::warning(this, tr("Warning"), 
            QString(tr( "First select a filter plugin from the list." ))); 
        }
      }

использоватьQMessageBoxили другой типизинформацияпоставлять Функция,Всегда держите все в порядке и устраняйте проблемы, которые могут возникнуть.,этотодинточкаочень重хотеть。 Как видите, зачастую они даже требуют больше кода, чем выполнение реальной задачи, но это крайне важно, чтобы избежать сбоев приложения. По умолчанию Qt Нетподдерживать异常иметь дело с,и Взаимно信Разработчик Воляиспользоватьдостаточноизifиelseобратитесь к令Приходитьиметь дело свсе Может能из崩溃Состояние。 овперед面изкод Примериз另один重хотетьиллюстрироватьдаtrфункция. Помните, всегда используйте это для литеральных строк. Таким образом, вы можете легко преобразовать свое приложение на несколько языков. Прямо сейчасделатьты Нет打算поддержканесколько языков,такжехотеть Привычка Всуществоватьискусство字字символ串серединадобавить вtrфункция,Даонхорошая привычка。 Это не причинит никакого вреда.

сейчассуществовать,нас ПодготовитьбегатьнасизPlugin_Userприложение. Если появится надпись «существовать проект», мы Воля увидим сообщение об ошибке (Воля, которая разместила существование себя и з Кусочек), и Воля предупреждается, что нет подходящего изплагина. дляспособныйиспользоватьнасизPlugin_Userприложение,Нам необходимо выполнить следующие операции:

  1. существоватьPlugin_Userпроектизгенерироватьпапкасередина Создайтеимядляfilter_pluginsизпапка。 Дасоздаватьпроектисполняемый файлизпапка。
  2. копироватьнас Строитьплагиндокумент(Должендокумент Волядаmedian_filter_pluginпроектизbuildпапка Внутрииз Библиотекадокумент),Затем Воля Что粘贴приезжать Нет.один步серединаизfilter_pluginsпапкасередина。 как упоминалось ранее,Зависит от операционной системы,Такие файлы, как исполняемые программы добрыйизплагин, имеют расширение Воля.

сейчассуществовать,пытатьсябегатьPlugin_User,один切Все会только常。 Вы должны увидеть единственный плагин в списке существующих. Воля, если он выбран, нажмите кнопку «Помощькнопкакполучат». ьсвязанный это из информации и нажмите на фильтр, кнопкак Воляплагин из фильтра применить к изображению. Как показано на следующем скриншоте:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-EFJq1lQR-1681869945441) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/efc2002d-4608-41dc-ba23-0cbb94bd0869.png)]

пытатьсясоздавать另одинимядляgaussian_filter_pluginизплагин,и遵循иmedian_filter_plugin完全такой жеизобратитесь к令набор,толькона этот раз,использоватьсуществовать Нет. 2 глава,“Qt и OpenCV проект”середина ВидетьизgaussianBlurфункция. Затемстроитьэтои Воля Что放существоватьfilter_pluginsпапкасередина,ЗатемсновабегатьPlugin_Userприложение. Кроме того, попробуйте в этих случаях разместить несколько случайных файлов библиотеки (и других небиблиотечных файлов).

здесь очень важно обратить внимание на,тыдолженубеждаться Нетккотлаживатьмодель Строитьплагиниквыпускатьмодель Строитьприложениеодин起использовать,противоположный Из亦Ран。 Существуют и другие важные правила, применимые к загрузке плагина, например, использовать Qt вышеверсиякнига Строитьплагин Нет能ииспользовать Qt нижеверсиякнига Строитьприложениеодин起использовать。 использоватьнижеиз Qt хозяинверсиякнига号Строитьплагин Нет能ииспользоватьвышеиз Qt хозяинверсиякнига号Строитьприложениеодин起использовать。 связанный плагин и его использование из обновленной информации, пожалуйста, всегда обращайтесь Qt Документация Qt Creator режим помощь Внизиз статьи «Плагин развертывания».

Постройте фундамент

тысуществоватькнига章середина学приезжатьизвсесодержание Всецельсуществоватьделатьты Подготовитьначинатьстроить Всестороннийкомпьютерное Приложение зрение, приложение Воля выполняет следующие операции:

  • использоватьплагин расширяет свой функционал
  • использовать Qt Таблицы стилей настраивают их внешний вид.
  • поддержканесколько языков

поэтому,отсейчассуществоватьначинать,Мы, Воля, рассмотрим ваше существование этого главы, изучим все факты в первых нескольких главах.,для применения закладывает основу,Например:

  • Наше приложение Воля может сохранять и загружать все настройки пользователей. нас ВоляпроходитьиспользоватьQSettingsдобрый Приходить实сейчасэто,Вы научились использоватьэто。
  • Лучше иметь централизованное или единое Qt стиль表Приходить照顾нас Приложение整体Появление,и Лучше издаот磁盘加载Вместо того, чтобы да Воля Что嵌入приложениекнига身。

дляэтот,除Нетпользовательот Приложениенастраивать页面середина Руководствовыбиратьхозяин题,в противном случаенас Воля Простой地предполагалосьприложениеиметькнига机Появление。 Тема Воляда Qt стиль表,держатьсуществоватьприложениеисполняемый файл Местосуществоватьиз同одинпапкасерединаизthemesпапкасередина,стиль表документиз Расширятьимя Волядляthm。 Выбранная тема (а точнее таблица стилей) Волясуществоватьпроект загружается с диска.

  • поддержканесколько языков至关重хотеть。 нас Воля Создайтеприложение,Долженприложение Незачем Расширятьприложение Прямо сейчас Может Расширятьподдерживатьизязык。

Это может быть Qt двоичныйязыкдокумент放существоватьприложениеисполняемый файл Местосуществоватьизпапкасерединаизlanguagesпапкасередина Приходить Заканчивать。 Мы можем киспользовать язык системы по умолчанию и загрузить пользовательиз языка (если у нас есть его перевод и бинарный языковой файл); В противном случае мы можем загрузить язык по умолчанию, например английский. насвозвращаться Можеткпозволятьпользовательсуществоватьбегатьчаспроходитьотнастраивать页面серединавыбиратьприложение Приходить Изменять Чтоязык。

  • нас Волястроитьодинподдерживатьиметь дело содининдивидуальныйизображениеивидеорамкаизкомпьютерное зрениеприложение.

для Для достижения этого,нас需хотеть有одиникнига章середина Место Видетьиз Нет常Взаимнопохожийизплагининтерфейс(CvPluginInterface),Долженинтерфейс Воляизображениеделатьдлявходитьи产生выход。 Затем нам, Воля, нужно точно так же, как показано в этой главе, загрузить ииспользовать этот плагин. нас Воляпредполагалосьплагин Кусочек Вимядляcvpluginsизпапкасередина,Эта папка Воля хранится в существующей папке, где находятся исполняемые файлы нашего приложения.

кроме,нас需хотетьучитыватькомпьютерное Есть некоторые препятствия в применении зрения, а именно Воля. существовать При создании приложений важно оставаться на шаг впереди; В противном случае вы окажетесь в затруднительной ситуации, из которой нет выхода. поэтому,Они есть:

  • существующееusizapp,нас Воля Нет断иметь дело сизображениеивидео。 Не только из файлов, но и из камер или из сетей (таких как Интернет) из каналов подачи и ввода. Мы Волясуществовать Нет. 4 глава,“MatиQImage”серединапредставлятьвсесодержание。
  • не подходитизинструмент Приходить Проверятьиигратьизображение,涉икомпьютерное зрениеиз Примените Волю и ничего не получите. Эта тема и все связанные темы Волясуществовать Нет. 5 глава,“Графический видрамка».
  • позже,существовать Нет. 9 В разделе «Видеоанализ» мы изкомпьютерное Приложение для зрения Воля требует обработки и обработки видео, а это значит, что на процесс получения результата будет влиять не только одно изображение, но и группа последовательных изображений (или кадров). Очевидно, что этого невозможно достичь путем проведения, как показано в этой главе, нам, Воля, нужно работать в отдельных потоках. Мы Волясуществовать Нет. 8 Эта тема зарезервирована в главе «Несколько тем», вы Волясуществоватьздесь. Qt Китай из механизма параллельной обработки. после,нас Воляможетсоздавать Подходящийвидеоиметь дело сизновыйплагининтерфейс,Затемсуществующееusizappиспользоватьэто。

сейчассуществовать,Вы можете использовать Qt Creator Создайте Qt Widgets приложениеи Воля Что命имядляComputer_Vision。 Мы продлим действие этого приложения до тех пор, пока 9 Глава, «Видеоразбор» заканчивается, а дальше мы с Волей шаг за шагом вводим все новые понятия. Опираясь на знания, полученные из предыдущих глав этой главы, вы сможете самостоятельно создать первые три пункта (для тем, языков иплагинизподдержки) из приведенного выше основного списка. Настоятельно рекомендуется хотя бы попытаться сделай это; Но в следующих двух главах мы расширим эту тему. позже,существовать Нет. 5 глава,“Графический видрамка”结束час,ВолядлятыпоставлятьскачатьComputer_Visionизвесьбаза础проектиз Связь。 。 Долженбаза础проект Воля ВключатьодинMainWindowдобрый,Добрый умеет загружать и отображать графический интерфейс, содержащий изплагин. существует Проектсередина,Вы также найдете плагин интерфейса (хороший, похожий на тот, который показан в этой главе).,Даиметь Болееиз Функция,Могут быть реализованы следующие функции:

  • получатьплагинзаголовок
  • получатьплагинизописывать(помощь)информация
  • получатьплагинуникальныйиз GUI(Qt контейнервиджет)
  • получатьплагинизтип,несмотря ни на чтодаиметь дело сивозвращатьсялюбойизображение Ну давай жетолькосуществовать Что GUI Отображать информацию в
  • Воляизображениепередачаприезжатьплагиниполучатьрезультат

Долженбаза础проектисходный код Воля Включатьитысуществоватькнига章середина Видетьиз Функциядобрыйпохожийиз Функция,к Установить стиль,Изменятьязыкждать.

Подвести итог

существоватьтыделатьдля Разработчикиз Карьераили Исследовать工делать期间,ты会经常遇приезжатьустойчивыйэтотиндивидуальный词。 книга章изглазизда Ктыпредставлятьодин般создаватьустойчивый Приложениебазакнигаконцепция,尤Чтодаиспользовать Qt и OpenCV создаватькомпьютерное зрение Приложениебазакнигаконцепция。 Теперь вы уже знакомы с создателем плагина, а это значит, что вы можете к Создать приложение, которое умеет к Зависить. от Нет Сторонние разработчики (или, конечно, кда сами) создают многоразовую библиотеку и руководят расширениями без необходимости пересобирать ядро ​​приложения. существования В этой главе вы также узнали о настройке Qt Приложение Появлениеи Чувствоватькикаксоздаватьмногоязычный Qt приложение.

Даон漫长но充满希望изглава。 Если вы прочитали все примеры пошагового иллюстрирования, то теперь вы уже должны быть знакомы с использованием. Qt Рамруководить кросс-платформенную разработку приложений с использованием одних из наиболее важных технологий. существоватькнига章середина,Вы изучаете Qt из таблицы стилей и таблицы стилей.,киэто Предоставить из Некоторый重хотеть Функция Приходитьразвивать美观изприложение. Затем мы переходим к созданию многоязычного приложения. существуют глобальное сообщество, в каждом уголке мира (Зависит В эпоху существования онлайн-магазинов приложений и т. д.) создание поддержки многоязычных приложений должно быть сделано, а не просто поддерживать в большинстве случаев предпочтительные ситуации. существования Изучив разработку многоязычных приложений, мы вошли в тему плагина и изучили все ее основы на практических примерах и опыте. нассоздаватьизпроект看起Приходитьочень Простой,это Включатьстроитьплагинкииспользоватьэто们из Приложениевсе重хотетьаспект。

существовать Нет. 4 глава,“MatиQImage”середина,ты научишься OpenCV Matи Qt QImageдобрый(ки Взаимно关издобрый),этотдварамка Все Можеткиметь дело сизображениеданные。 ты научишься все изчитать разными способами извлечения (из файлов, камер и т.д.)к&написать изображение, Воля они превращаются друг в друга и в конечном итоге существуют Qt Покажите их в приложении. До сих пор у нас есть OpenCV серединаизimshowфункциятолькосуществоватьпо умолчаниюокносерединапоказыватьрезультатизображение. существовать Нет. 4 глава,“MatиQImage”середина,Этот Воля станет для истории,потому чтодляты Воляизучатькак Воля OpenCV MatКонвертироватьдляQImageдобрый,Затем Воля Чтоправильныйпоказыватьсуществовать Qt Виджеты.

Четыре、MatиQImage

существовать Нет. 3 глава,“создавать Всесторонний Qt + OpenCV проект”середина,Мы учимсясоздавать Комплексный иустойчивыйиз Приложениебазакнига规но,Эти приложения выглядят привлекательно,поддержканесколько языков,ипроходитьиспользовать Qt Систему легко расширить.сейчассуществовать,нас Воляпроходитьизучать Ответственныйиметь дело скомпьютерное структура данных типа зрениядобрыйи для дальнейшего расширения связанногокомпьютерного Основы применения зрения из Библиотеки знаний. учиться OpenCV и Qt рамка Обязательно из базовой структуры и тип данныхдаучитьсясуществовать Обрабатывать их при выполнении приложения из базового компьютерного Функция зрения как выполнить из Нет. Один шаг. OpenCV дацельсуществоватьувеличить скоростьипроизводительностьизкомпьютерное зрениерамка. С другой стороны, Qt даон Нет断发展изразработка приложенийрамка,иметьбольшой量издобрыйифункция. Это дадля Чтоих俩Все需хотетьодин Группаопределение明确издобрыйиструктура Приходитьиметь дело схотетьсуществоватькомпьютерное Приложение Vision обрабатывает, отображает и даже сохраняет или распечатывает данные изображения по причинам. Всегда знакомьтесь с соответствующим Qt и OpenCV серединасуществующийструктураиз有использовать Подробности,этотвсегдадаонхорошая привычка。

Вы уже посетили OpenCV изMatдобрый Приходить简хотеть地читать Выбиратьииметь дело сизображение. как Ты Волясуществоватькнига章серединаучитьсяприезжатьиз,Прямо сейчасделатьMatда Ответственныйиметь дело с OpenCV серединаизображениеданныеизхозяинхотетьдобрый(По меньшей мересуществовать传统начальстводаэтот样),Matдобрыйтакже有Некоторый Варианты, Практические функции, некоторые из которых даже необходимы для выполнения определенных функций, о них вы узнаете в следующих главах. существовать Qt рамкаиз Состояние Вниз,Прямо сейчасделатьQImageда Qt Среди основных, используемых для обработки данных изображения, есть добрый, который мало чем отличается, и более издобрые (иногда с удивительно похожими именами), используемые в одобрении компьютеров. 视觉ииметь дело сизображениеданные,видеождать.

В этой главе мы, Воля, начнем с наиболее критического из OpenCV добрыйMatначинать,Ран Преемник Продолжение Исследовать Нет同из Варианты(Чтосередина有些даMatизребенокдобрый),наконец КтыпредставлятьновыйизUMatдобрый, Да Долженрамкаиз OpenCV 3 Пополнить. нас ВоляизучатьиспользоватьновыйизUMatдобрый(на самом деледаMatсовместимый)Вместо того, чтобы даMatдобрыйизпреимущество。 Тогда мы Воля Входить Qt изQImageдобрый,иизучатькакпроходить Воляэтот Два видаданныетип Взаимно互Конвертироватьсуществовать OpenCV и Qt передавать данные изображения между ними. насвозвращаться ВоляизучатьQPixmap,QPainterкимногодругой Qt добрый,для всех, кто хочет работать в сфере компьютерного зрения из,Все это необходимо.

Наконец, мы научимся OpenCV и Qt рамка Извлекайте, записывайте и отображайте изображения и видео различными способами из файлов, камер, веб-каналов и т. д. По мере того, как вы Волясуществовать в конце этой главы, изучайте из, всегда лучше следовать тому, что вам нужно, изкомпьютерное Задача зрения — решить, какой добрый вариант лучше для нас, поэтому, когда мы имеем дело с вводом или выводом данных изображения, мы должны иметь под рукой достаточное количество различных вариантов. 。

Наши «Волясуществовать» из тем, рассматриваемых в этой главе, включают:

  • Matдобрый,ЧторебенокдобрыйиновыйизUMatдобрыйиз Введение
  • QImageВведениеикомпьютерное зрениесерединаиспользоватьизхозяинхотеть Qt добрый
  • Как принимать,писатьипоказыватьизображениеивидео
  • каксуществовать Qt и OpenCV рамка Из间передачаизображениеданные
  • каксуществовать Qt серединасоздаватьсопределениевиджетииспользоватьQPainterверно Чторуководитьрисовать

оMatдобрый

существования В предыдущей главе вы очень кратко испытали OpenCV рамкаизMatдобрый,Дасейчассуществоватьнас Воля更идти глубже地руководить Исследовать。 отматрицасередина借использовать ЧтоимяизMatдобрыйдаn维число Группа,можетсуществоватьодининдивидуальныйилимногоиндивидуальныйрядсередина存储ииметь дело с Нет同изчисло学данныетип。 для Еще больше упрощая, давайте посмотрим на компьютерное зрениесерединаизизображение. компьютерное Изображение изображения да матрица пикселей (следовательно, для двумерного массива) с заданной шириной (количество столбцов в матрице) и высотой (количество строк в матрице). Кроме того, пиксели в изображении в оттенках серого могут быть представлены числом (следовательно, одним каналом) с минимальным значением (обычно одним каналом). 0) означает черный цвет, а максимальное значение (обычно для 255)даонбайт Может能出сейчасиз最большойценить ) представляет белый цвет, а все значения между ними соответствуют разным уровням интенсивности серого. Пожалуйста, посмотрите на изображения ниже: они представляют собой лишь увеличенные части более крупных изображений в оттенках серого. Каждый пиксель помечен значением интенсивности, которое мы только что упомянули:

[Передача изображения по внешней ссылке не удалась. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-z4ggpElB-1681869945441) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/23fa03a4-1bc7-4f87-9a94-2c2228731da6.png)]

Аналогично, стандарт RGB 彩цветизображениесерединаиз Пиксельиметьтрииндивидуальный Нет同изэлемент,Вместо того, чтобы даон(поэтомуиметьтрииндивидуальныйряд),соответствующий красному цвету,蓝цвети绿цветценить. 看Вниз面изизображение Например:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-kzTZGd6T-1681869945441) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/62f55b80-51e1-432b-a64d-c65db81fca73.png)]

Как показано на картинке выше,существовать Простойизизображение Зрительпрограммасередина,放большой(Увеличить)изизображение Можеткпоказывать出Ответственныйизображениеиз Пиксель。 учитыватькаждыйMatдобрыйсерединаизодининдивидуальныйэлемент,Доступен напрямую,Исправлятьииспользоватьэто们。 Изображение из Это матричное представление представляет собой одно из самых мощных компьютерных зрениеалгоритм Можетклегкий地иметь дело сизображение,Измерьте желаемое значение, даже если изображение ограничено.

Даначальствоодин Примеркартина片середина放большойизобластьиз另один种выражать形式。 Каждому пикселю присвоены базовые значения красного, зеленого и синего:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-IXbOG1wN-1681869945441) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/ec954004-7fcb-4677-82c0-cc383f8848de.png)]

учитыватьизображениеданныеи Пиксельизбольшой小写有助ВпониматьMatдобрый,икакнаспозже Воляхотеть Видетьиз,Matдобрыйиодин般из OpenCV серединаизбольшинствофункция ВсепредполагалосьMatдаизображение, Да,должен УведомлениеMatМожетк Включатьлюбойданные(Неттолькодаизображение),ина самом делесуществовать OpenCV середина有Matиспользовать Впередачаизображениекснаружиизданныечисло Группаиз Состояние。 Мы Волясуществовать Нет. 6 Глава «OpenCV серединаизизображениеиметь дело с”серединаизучать Некоторый Взаимно关Пример。

Зависит от в целом,в настоящий моментMatдобрыйи OpenCV функцияизчисло学细节и Нетсимвол合насиз最большой兴趣,поэтому,Нам достаточно Воляка, данного из вступления,и着重ВMatдобрыйи Чтосуществовать OpenCV Основные методы серединаиз.

Конструкторы, свойства и методы

структураMatдобрыйизметодоченьмного。 существовать撰写книга Книгачас,Matдобрыйиметь二十Различный Нет同изструктураустройство。 Некоторые из них предназначены просто для удобства конструкторов, но, например, для создания трехмерных или более размерных массивов, а некоторые другие необходимы. Ниже приводится Некоторые из наиболее распространенных конструкторов киспользования и способы их использования из Примера:

Создайте10x10матрица,каждыйэлементодинряд 8 Кусочек беззнаковое целое число (или байт):

Язык кода:javascript
копировать
    Mat matrix(10, 10, CV_8UC(1)); 

создать то же самое из матрицы,ииспользовать0изценитьисходныйизменять Чтовсеэлемент:

Язык кода:javascript
копировать
    Mat matrix(10, 10, CV_8UC(1), Scalar(0); 

Как показано в предыдущем коде, конструктор изз имеет один параметр — количество строк и два параметра — количество столбцов в матрице. Но три параметра да, Нет очень важны, это Волятип, номер кусочка и номер канала замешаны в макросе. Да Макросизмодельи Можеткиспользоватьизценить:

Язык кода:javascript
копировать
    CV_<bits><type>C(<channels>) 

давайте посмотрим Макросизкаждыйчасть Всеиспользовать В:

<bits>Можеткзаменятьдля:

  • 8:использовать В无символ号и有символ号整число
  • 16:использовать В无символ号и有символ号整число
  • 32:использовать В无символ号и有символ号整числокичисло с плавающей запятой
  • 64:использовать В无символ号и有символ号число с плавающей запятой

<type>Можеткзаменятьдля:

  • U:использовать В无символ号整число
  • S:использовать В有символ号整число
  • F:использовать Вприноситьсимвол号изчисло с плавающей запятой

Теоретически,<channels>Можеткиспользоватьлюбойценитьзаменять,Дадляодин般изкомпьютерное алгоритма зрительных функций, оно будет не выше, чем 4。

еслииспользоватьизрядчисло Нет超Проходить Четыреиндивидуальный,но Можеткупущение<channels>параметризлевая скобкаиправая скобка。 еслирядчислотолькодляодин,нотакже Можетк完全упущение<channels>ивперед面изC。 для Понятнополучать更好из Можетчитатьсексиодин致секс,большинствоиспользоватьсуществоватьвперед面иназад面из Примерсерединаиспользоватьизстандартныймодель,исуществоватьиспользоватьэтот种широкоиспользоватьиз Макросиз Способсередина保持один致такжедаодин种良好изпрограммирование Привычка。

Создайтедлина стороныдля 10 ииметьдваdoubleтип(64 Кусочек)рядэлементизмного维данныенабор(три维число Группа),ииспользовать1.0изценитьисходныйизменятьвсеценить. Отображается следующим образом:

Язык кода:javascript
копировать
    int sizes[] = {10, 10, 10}; 
    Mat cube(3,  sizes, CV_64FC(2), Scalar::all(1.0)); 

тывозвращаться МожеткпозжеиспользоватьMatдобрыйизcreateметод Приходить Изменять Чтобольшой小итип。 Даон例ребенок:

Язык кода:javascript
копировать
    Mat matrix; 
    // ... 
    matrix.create(10, 10, CV_8UC(1)); 

Matдобрыйиз先впередсодержание无关紧хотеть。 по сути,Воляаллудалить (безопасная очистка),А Воля выделяет из памяти, выделенной обратно операционной системе),и СоздайтеновыйизMatдобрый.

Ты можешьк СоздайтеMatдобрый,Должендобрыйда另одинMatдобрыйизчасть。 Это называется длязаинтересованныйизобластьROI),когданас需хотетьдоступизображениеизчасть,Сразу好картинаэтоданезависимыйизображениечас,это特Не有использовать。 Например, когда мы хотим отфильтровать только часть изображения. Дасоздавать ROI Matдобрыйизметод,Должендобрый Включатьодин50x50Пиксель Ширинаизквадрат,отизображениеиз(X = 25, Y = 25)Кусочекнаборначинать:

Язык кода:javascript
копировать
    Mat roi(image, Rect(25,25,50,50)); 

существоватьOpenCVсерединаобратитесь к定Matизбольшой小час,Обычно для одного Кусочка требуется несколько строк и столбцов (высота и ширина).,этот有час会делать Привычка Впервый Видетьширинаизлюди感приезжать困惑,потому чтодлядругойрамкасуществоватьоченьмного Состояние Вниз Вот так。 原потому чтотолькотолькодаOpenCVсерединаизображениеизматрицаметод。 Если вы предпочитаете последнее, то можно найти всоздаватьMatдобрыйчассуществовать OpenCV серединаиспользоватьSizeдобрый.

существоватькнига节из Примерсередина,Если не указано иное, иллюстрировать,в противном случаегипотезаиспользоватьimreadфункцияиспользоватьвперед面главасерединаизтестизображениеполучатьMatтипизimageпеременная。 этот Воля有助ВнасполучатьMatдобрыйнеобходимыйизинформация,Да,книга章позже Волясуществоватьimreadидобрыйпохожийфункциясередина Видеть Болееинформация。

Давайте посмотрим на изображение ниже, чтобы лучше понять OpenCV Matдобрыйсередина Рентабельность инвестиций, размер и расположение кусочка согласно концепции. Как показано на рисунке ниже, верхний левый угол изображения считается началом системы координат на изображении. поэтому,источникиз Кусочекнаборда(0, 0)。 добрыйпохожий地,изображениеиз右начальство角иметь Кусочекнаборценить(width - 1, 0),Ширину можно заменить количеством столбцов. принимая это во внимание,изображениеиз右Вниз角Воляиметь(width-1,height-1)из Кусочекнаборценить,По этой доброй рекомендации.сейчассуществовать,让насучитыватьбаза Внравиться Вниз Место示изобласть СоздайтеMatдобрый. нас Можеткиспользоватьвперед面Видетьизметод,Данас需хотетьиспользоватьRectдобрыйпоставлять ROI левый верхний угол и его ширина и высота:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-1FGWqBgh-1681869945442) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/e93b4977-be31-4624-ad9a-b101416804a9.png)]

Важная изда, на которую стоит обратить внимание,использовать先впередизметодсоздавать ROI Matдобрыйчас,верно ROI Все изменения пикселей повлияют на исходное изображение, т.к. ROI Нет会执ХОРОШОоригинальныйMatдобрыйсодержаниеиз Глубокийкопировать 。 если出Влюбой原потому что想кMatдобрыйкопироватьприезжатьновыйиз(и完全независимыйиз)Matсередина,но需хотетьиспользоватьcloneфункция,Как показано ниже:

Язык кода:javascript
копировать
    Mat imageCopy = image.clone(); 

гипотезаMatизображение Включать先впередизизображение(Приходитьс先впередизглава),Вы можете См. раздел Пример кода, выберите изображение. ROI и сделайте выделение области из всех пикселей черным:

Язык кода:javascript
копировать
    4: Mat roi(image, Rect(500, 138, 65, 65)); 
    roi = Scalar(0);

тывозвращаться МожетквыбиратьMatсерединаизодинилимногоиндивидуальный ХОРОШОили Список,Его подход очень похож на наш подход к управлению рентабельностью инвестиций.,除Понятно需хотетьиспользоватьrow,rowRange,columnилиcolRangeсуществоватьMatдобрыйсередина起делатьиспользовать。 Дакак做:

Язык кода:javascript
копировать
    Mat r = image.row(0); // first row 
    Mat c = image.row(0); // first column 

Да另одиниспользоватьrowRangeиcolRangeфункцияиз Пример,Эту функцию можно использовать для выбора диапазона строк и столбцов.,Вместо того, чтобы датольковыбиратьодин ХОРОШО。 к Вниз Примеркод Волясуществоватьизображениеизсередина Сердце产生один+символ号,Что厚度для 20 пикселей:

Язык кода:javascript
копировать
    Mat centralRows = image.rowRange(image.rows/2 - 10, 
       image.rows/2 + 10); 
    Mat centralColumns = image.colRange(image.cols/2 - 10, 
       image.cols/2 + 10); 
    centralRows = Scalar(0); 
    centralColumns = Scalar(0); 

Дасуществоватьнасизтестизображениеначальство执ХОРОШОизрезультат:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-zRHRzsAk-1681869945442) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/0606e3f0-05fd-4c97-bf66-5613db70810c.png)]

При использовании упомянутого ранее извлечения метода ROI и Воля Что存储существоватьновыйизMatдобрыйсерединачас,МожеткиспользоватьlocateROIфункцияполучатьотецизображениеизбольшой小и ROI Родительский объект существует внутри изображения в верхнем левом углу позиции Кусочек. Даон例ребенок:

Язык кода:javascript
копировать
    Mat centralRows = image.rowRange(image.rows/2 - 10, 
      image.rows/2 + 10); 
    Size parentSize; 
    Point offset; 
    centralRows.locateROI(parentSize, offset); 
    int parentWidth = parentSize.width; 
    int parentHeight = parentSize.height; 
    int x = offset.x; 
    int y = offset.y; 

После выполнения этого кода,parentWidthВоля Включатьизображениеизширина,parentHeightВоля Включатьизображениеизвысокий,xиyВоля ВключатьcentralRowsсуществоватьотецверно象серединаиз左начальство Кусочекнабор Matилидругими словами Сразудаизображение.

Matдобрыйвозвращаться Включатьмного有использоватьизсвойствоифункция,Можетиспользовать ВполучатьсвязанныйлюбойодининдивидуальныйMatдобрый Примеризинформация。 Информативный в смысле да означает предоставление связанной подробной информации об участниках, каналах, глубине цвета, ширине и высоте участников, а также о других добрых участниках. В число этих членов входят:

  • depth:ВключатьMatдобрыйизглубокийстепень. глубокий度ценитьверноотвечать ВMatдобрыйизтипи Кусочекчисло。 Таким образом, это может быть одно из следующих значений:
    • CV_8U:8 Кусочек целое число без знака
    • CV_8S:8 Кусочек целое число со знаком
    • CV_16U:16 Кусочек целое число без знака
    • CV_16S:16 Кусочек целое число со знаком
    • CV_32S:32 Кусочек целое число со знаком
    • CV_32F:32 Кусочекчисло с плавающей запятой
    • CV_64F:64 Кусочекчисло с плавающей запятой
  • channels:этотолько ВключатьMatдобрыйизкаждыйэлементсерединаизрядчисло。 длястандартныйизображение,Долженценитьв целомдлятрииндивидуальныйряд。
  • type:этот Воля ВключатьMatдобрыйизтип。 Это связано скнига章вперед面создаватьMatдобрый Местоиспользоватьизтип常量такой же。
  • cols:этотверноотвечать ВMatдобрыйсерединаиз Списокчислоилиизображение Ширинастепень.
  • rows:этотверноотвечать ВMatдобрыйсерединаиз ХОРОШОчислоилиизображениевысокийстепень.
  • elemSize:Можетиспользовать ВполучатьMatдобрыйсерединакаждыйэлементизбольшой小(кбайтдляодин Кусочек)。
  • elemSize1:несмотря ни на чторядчислокак,все Можетиспользовать ВполучатьMatдобрыйсерединакаждыйэлементизбольшой小(кбайтдляодин Кусочек)。 Например,существоватьтрирядизображениесередина,elemSize1Воля ВключатьelemSizeизценить除ктри。
  • empty:еслиMatдобрыйсередина没有элемент,новозвращатьсяtrue,в противном случаевозвращатьсяfalse
  • isContinuous:Можетиспользовать В检查Matизэлементданетк连Продолжение Способ存储。 Например,толькоодинодин ХОРОШОизMatдобрыйвсегдада连Продолжениеиз。

использоватьcreateфункциясоздаватьизMatдобрыйвсегдада连Продолжениеиз。 Важная изда, на которую стоит обратить внимание,существуют В этом случае,Matдобрыйиз二维выражатьдаиспользоватьstepценить Приходитьиметь дело сиз。 Это означает, что в массиве последовательных элементов каждый шаг элементов соответствует строке в двумерном представлении.

  • isSubmatrix:еслиMatдобрыйда另одинMatдобрыйизребенокматрица,новозвращатьсяtrue。 существоватьвперед面из Примерсередина,существоватьвсеиспользоватьдругойизображениесоздавать ROI из Состояние Вниз,этотсвойство Волявозвращатьсяtrue,исуществоватьотецMatдобрыйсерединадляfalse
  • total:этот ВолявозвращатьсяMatдобрыйсерединаизэлементобщийчисло。 Например,существоватьизображениесередина,этотценитьждать Вширина乘кизображениеизвысокийстепень.
  • step:возвращатьсяиMatдобрыйсерединаизодиншаг Взаимноверноотвечатьизэлементчисло。 Например,существоватьстандартныйизображение(Нет连Продолжение存储изизображение)середина,stepВключатьMatдобрыйизширина(илиcols)。

Помимо предоставления информации от участников,Matдобрыйвозвращаться Содержит множество длядоступ Чтоодининдивидуальныйэлемент(или Пиксель)(иверно Что执ХОРОШОдействовать)изфункция. Они включают в себя:

  • at:Даоншаблонфункция,Можетиспользовать ВдоступMatдобрыйсерединаизэлемент。 Особенно полезно для доступа к элементам (пикселям) изображений. Даон例ребенок。 гипотезанассуществоватьимядляimageизMatдобрыйсередина加载Понятностандартныйизтриряд Цветное изображение. этот意味着imageизтипдляCV_8UC(3),Затемнас Можетк Простой地писатьк Внизсодержаниекдоступ КусочекнаборX,Yиз Пиксель,и Воля ЧтоцветценитьнастраиватьдляC
Язык кода:javascript
копировать
        image.at<Vec3b>(X,Y) = C;

OpenCV поставлятьVec(К量)добрыйи Что Варианты,кудобный Вданныедоступииметь дело с。 Вы можете использоватьк Внизtypedefсоздаватьи命имяс己изVecтип:

typedef Vec<Type, C> NewType; Например, в предыдущем существовании из кода вы могли бы определить себя из 3 байт-вектор (например, QCvVec3B),ииспользоватьэтозаменятьVec3b,И используйте следующий код:

typedef Vec<quint8,3> QCvVec3B;

но,Вы можете использоватьatфункция:

typedef Vec<uchar, 2> Vec2b; typedef Vec<uchar, 3> Vec3b; typedef Vec<uchar, 4> Vec4b; typedef Vec<short, 2> Vec2s; typedef Vec<short, 3> Vec3s; typedef Vec<short, 4> Vec4s; typedef Vec<ushort, 2> Vec2w; typedef Vec<ushort, 3> Vec3w; typedef Vec<ushort, 4> Vec4w; typedef Vec<int, 2> Vec2i; typedef Vec<int, 3> Vec3i; typedef Vec<int, 4> Vec4i; typedef Vec<int, 6> Vec6i; typedef Vec<int, 8> Vec8i; typedef Vec<float, 2> Vec2f; typedef Vec<float, 3> Vec3f; typedef Vec<float, 4> Vec4f; typedef Vec<float, 6> Vec6f; typedef Vec<double, 2> Vec2d; typedef Vec<double, 3> Vec3d; typedef Vec<double, 4> Vec4d; typedef Vec<double, 6> Vec6d;

  • beginиend:это们Можетиспользовать Виспользоватьдобрыйпохожий C++ STL из迭代устройство Приходить ПоискидоступMatдобрыйсерединаизэлемент。
  • forEach:Можетиспользовать ВсуществоватьMatдобрыйизвсеэлементначальствои ХОРОШОбегатьфункция. Функция должна быть снабжена объектом функции, указателем функции или Lambda。

Lambda толькосуществовать C++ 11 и в настоящее время доступна более высокая версия, если вы еще этого не сделали, они перейдут на C++ 11 и более поздних версий это по важным причинам.

Следующие три примера кода, упомянутые в предыдущем примере, из кодов методов доступа, достигают той же цели.,это们Всепроходить Волякаждый Пиксельценить除к5делатьизображениетемнее。 первый,использоватьatфункция:

Язык кода:javascript
копировать
    for(int i=0; i<image.rows; i++) 
    { 
      for(int j=0; j<image.cols; j++) 
      { 
        image.at<Vec3b>(i, j) /= 5; 
      } 
    } 

Следующий,использоватьиметьbeginиendфункцияиздобрый STL Итератор:

Язык кода:javascript
копировать
    MatIterator_<Vec3b> it_begin = image.begin<Vec3b>(); 
    MatIterator_<Vec3b> it_end = image.end<Vec3b>(); 
    for( ; it_begin != it_end; it_begin++) 
    { 
      *it_begin /= 5; 
    } 

наконец,использовать[lambda]Предоставить изforEachфункция:

Язык кода:javascript
копировать
    image.forEach<Vec3b>([](Vec3b &p, const int *) 
    { 
       p /= 5; 
    }); 

Дагенерироватьиз темного изображения,для Все три предыдущих кода одинаковы:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-B6w3ChLK-1681869945442) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/fa9341fd-e421-4105-8629-82638aba89c6.png)]

Как вы заметили из,Matдаиметьмногометодиздобрый,иоченьочевидно,потому чтодляэтодаиспользовать OpenCV Изображения являются основными строительными блоками. Помимо функциисвойства, с которой вы уже ознакомились ранее, прежде чем перейти к следующей части руководить, нам также необходимо изучить еще несколько функций. Вот они:

  • adjustROI:этотфункция Можетиспользовать Влегкий Изменятьребенокматрица(илиесли быть точнымда ROI матрица) по размеру.
  • clone:ДасоздаватьMatдобрыйиз Глубокий副книгаизширокоиспользоватьизфункция. один Пример Состояниеда,Ты можешь能希望фильтрилииметь дело сизображение,новсе ещебронироватьоригинальныйизображениеиз副книгакдлякназад Сравнивать较。
  • convertTo:Можетиспользовать ВИзменятьMatдобрыйизданныетип。 Эта функция также имеет возможность масштабировать изображение.
  • copyTo:этотфункция Можетиспользовать ВВолявсе(илиизображениеизчасть)копироватьприезжать另одинMat
  • ptr:Можетиспользовать Вполучатьобратитесь к针идоступMatсерединаизизображениеданные。 в соответствии с重载изверсиякнига,Ты можешькполучатьодинобратитесь к Кидентификация ХОРОШОилиизображениесерединалюбойдругой Кусочекнаборизобратитесь к针。
  • release:этотфункциясуществоватьMat析构устройствосередина调использовать,ипо сути ОтветственныйMatдобрыйнеобходимыйиз Внутри存清理Задача。
  • reserve:Можетиспользовать Вдлямногообратитесь к定из ХОРОШОбронировать存储нулевой间。
  • reserveBuffer:добрыйпохожий Вreserve,Даэтодлямногоиндивидуальныйобратитесь к定байтбронировать Понятно存储нулевой间。
  • reshape:когданас需хотеть Изменятьрядчислокполучатьматрицаданныеиз Нет同выражать形式час,этоточень有использовать。 один Пример Состояниеда ВоляиметьодининдивидуальныйрядикаждыйэлементсерединаизкаждыйиметьтрииндивидуальныйбайтизMat(НапримерVec3b)КонвертироватьдляиметькаждыйэлементсерединаизкаждыйбайтиметьодинбайтизтрирядMat。 очевидно,этот样из Конвертировать(или精确地调整форма)Воляпривести кглаз标Matсерединаиз ХОРОШО计число乘ктри。 После этого полученную матрицу можно транспонировать киспользовать и переключать между строками и столбцами. позже,ты Воляизучатьtили转наборфункция.
  • resize:Можетиспользовать ВИзменятьMatдобрыйсерединаиз ХОРОШОчисло。
  • setTo:Можетиспользовать ВВоляматрицасерединаизвсеилинекоторыйэлементнастраиватьдляобратитесь к定ценить.

наконецнои Нет最Нет重хотетьизодинточкада,Matдобрыйпоставлять Понятно Некоторый方удобныйизметод Приходитьиметь дело сматрица运算,Например:

  • cross:вычислитьдватриэлементматрицаизперекрестное произведение。
  • diag:отматрицасерединаизвлекатьверно角Проволока。
  • dot:вычислитьдваматрицаизскалярное произведение。
  • eye:Даонстатическийфункция,может использоваться для построения однореберных матриц.
  • inv:создавать逆матрица。
  • mul:вычислитьдваматрицаиз逐элемент乘法илиразделение。
  • ones:Да另одинстатическийфункция,Доступно для создания матрицы,Чтовсеэлемент Все持有ценить1
  • t:этотфункция Можетиспользовать ВполучатьMatдобрыйиз转наборматрица。 Интересно, эта функция эквивалентна зеркалу и повороту изображения. 90 степень. связанный Подробнее,См. последующее изображение.
  • zeroes:Доступно для создания матрицы,Все его элементы имеют значение для нуля. Это равно заданной ширине,Очень типизую все черное изображение.

существук на скриншоте ниже,левая сторонаизизображениедаоригинальныйизображение,и右侧изизображениедагенерироватьиз转наборизображение. Зависит от — это то же самое, что транспонированная матрица из транспонированной и исходная матрица, поэтому мы также можем сказать, что левая часть изображения да правая часть изображения из транспонированного результата. Дасуществоватьизображениеначальство执ХОРОШОMatдобрыйизtфункцияиз Примеррезультат:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-VMojrCP1-1681869945442) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/b5a538a1-76e3-4187-a37e-b3c45ccf6260.png)]

такой же Важная изда, на которую стоит обратить внимание,Matдобрыйтакже Можеткруководитьвсестандартный算术运算。 Например,и Чтокартинавперед面из例ребеноксерединаобсуждатьMatдобрыйсерединаиздоступметод Таким образом,Не все будут разделены пиксели один за другим,Мы можем написать следующий код:

Язык кода:javascript
копировать
    Mat darkerImage = image / 5; // or image * 0.2 

существуют В этом случае,матрицасерединаизкаждыйэлемент(илиизображение,Если нужно) Волярруководить по работе точно так же.

Mat_<_Tp>добрый

Mat_<_Tp>добрыйдаиметьтакой жечленизMatдобрый(ишаблондобрый)изребенокдобрый,Дакогдасуществовать<indexentry content="Mat class:Mat_ class" dbid="256603" state="mod">компилироватьчасуже知матрица(илиизображениесерединаизэлемент)изтипчас,это会Нет常有использовать。 иMatдобрыйизatфункция Взаимно Сравнивать,этовозвращатьсяпоставлять Понятноодин种更好издоступметод(Можетк说更具Можетчитатьсекс)。 Даонкороткийиз Пример:

Язык кода:javascript
копировать
    Mat_<Vec3b> imageCopy(image); // image is a Mat class 
    imageCopy(10, 10) = Vec3b(0,0,0); // imageCopy can use () 

Если вы внимательны к типу,Можетк ВоляMat_<_Tp>добрыйпередача ДаватьприниматьMatдобрыйизлюбойфункция,без каких-либо проблем.

Matx<_Tp, m, n>

Matxдобрыйтолькоиспользовать Всуществоватькомпилироватьчасиметьуже知тип,ширинаивысокийиз<indexentry content="Mat class:Matx class" dbid="256603" state="mod">小матрицаиз Состояние。 у него естьдобрыйпохожий ВMatизметод,и обеспечить матричные операции,сновадобрыйпохожий ВMat。 в целом,Вы можете использоватьтолькоизучатьизтакой жеMatдобрыйзаменятьMatx,Потому что для это обеспечивает больше гибкости и функциональности.

UMatдобрый

UMatдобрыйдановыйпредставлятьизMatдобрый,существовать 3.0 до OpenCV версия Недоступно в этой версии. использоватьновыйизUMatдобрый(или统одинизMatдобрый)из Преимуществахозяинхотеть Выбирать决Вбегатьэтоизплатформаначальствода Стоит ли сохранятьсуществоватьOpenCLслой。 нас Нет会подробныйпредставлять Эти细节,Даотвечать Должен足к УведомлениеприезжатьOpenCL(с Л, не выходи из себя OpenCV Запутать)даонпозволять CPU,GPU Другие вычислительные ресурсы системы работают вместе (иногда даже параллельно) для достижения общих вычислительных целей. поэтому,Проще говоря,Если он хранится на платформе,но ВоляUMatдобрыйпередача Давать OpenCV функция Воляпривести к调использоватьбаза础OpenCLобратитесь к令(гипотезаэто们существоватьидентификация Функциясередина实сейчас),отиполучатькомпьютерное зрение Приложение更высокийпроизводительность。 в противном случае,ВоляUMatПростой地КонвертироватьдляMatдобрый,И вызывает стандарт только из CPU, и в предыдущей версии эта версия из OpenCV отличается.,всеизOpenCL实сейчас Все Кусочек Вocl命имянулевой间середина,ииocl命имянулевой间完全分离,этотпозволять统одинизабстрактный(ДаUиз Приходитьисточник),иделать Что更易Виспользовать БыстрееизOpenCLвыполнить. стандартныйвыполнить.

поэтому,большинствовсегдаиспользоватьUMatдобрый Вместо того, чтобы даMatдобрый,尤Чтодасуществоватьиметь底слойOpenCL实сейчасиз CPU в интенсивных функциях. Пока мы не используем старые версии OpenCV версии этой, проблем не будет. Толькодапожалуйста, обрати внимание,существовать需хотетьсуществоватьMatиUMatИз间руководитьявный Конвертироватьиз Состояние Вниз(Как вы увидите позже Воляиз,существование да требуется в некоторых случаях),каждыйдобрый Всепоставлять Понятноодин Можетиспользовать ВКонвертироватьэтоизфункция. другому:

Язык кода:javascript
копировать
    Mat::getUMat 
    UMat::getMat 

для этих двух функций,Всем требуется токен доступа,Логотип может быть:

  • ACCESS_READ
  • ACCESS_WRITE
  • ACCESS_RW
  • ACCESS_FAST

существует эта книга, весь процесс,нас Воля尽Может能地交替использоватьMatиUMatдобрый. UMatиOpenCL实сейчасдаодин种日益增长из OpenCV явление, привычка него есть огромное количество преимуществ.

InputArray,OutputArry,InputOutputArray

Вы заметите, что большинство OpenCV функция Всепринимать Этитипизпараметр,Вместо того, чтобы даMatи Чтодобрыйпохожийизданныетип。 это используется для улучшения доступности чтения данных типа под контролем типа данных прокси. Это означает только то, что вы можете загружать любые данные, которые вы передаете. OpenCV функция,除ПонятноInputArray,OutputArrayилиInputOutputArrayданныетип:

  • Mat
  • Mat_<T>
  • Matx<T, m, n>
  • std::vector<T>
  • std::vector<std::vector<T> >
  • std::vector<Mat>
  • std::vector<Mat_<T> >
  • UMat
  • std::vector<UMat>
  • double

Обратите внимание, что OpenCV картинаMatилидобрыйпохожийиздобрыйодин样верно待стандартный C++ К量(std::vector)。 или больше или меньше. Причина очевидна. Они связаны с базовой структурой данных или более или менее одинаковы.

навсегда远НетхотетьявныйсоздаватьInputArray,OutputArryилиInputOutputArray。 Просто передайте тип, упомянутый ранее, и все будет в порядке.

Чтение изображений с помощью OpenCV

Теперь, когда мы изучили OpenCV серединаизMatдобрый,нас Можеткпродолжатьизучать Как приниматьизображениеидляизображениенаполнениеMatдобрыйкдальшеиметь дело сэто。 кактысуществоватьвпереднесколько главсередина简хотеть Видетьиз Таким образом,imreadфункция Можетиспользовать Вот磁盘читать Выбиратьизображение. Даон例ребенок:

Язык кода:javascript
копировать
    Mat image = imread("c:/dev/test.jpg", IMREAD_GRAYSCALE | 
      IMREAD_IGNORE_ORIENTATION); 

imreadтолько Воля C++ std::stringдобрыйделатьдля Нет.одинпараметр,ВоляImreadModesлоготипделатьдля Нет.二индивидуальныйпараметр。 если Зависит от В某种原потому что Не могущийчитать Выбиратьизображение,новозвращатьсянулевойизMatдобрый(data == NULL),в противном случае,ВолявозвращатьсяMatдобрый,Чтосерединанаполнение Понятноиметь Нет.二индивидуальныйпараметрсерединаобратитесь к定изтипицветизизображение Пиксель。 в соответствии сплатформасерединанекоторыйизображениетипиз Можетиспользоватьсекс,imreadМожеткчитать Выбиратьк Внизизображениетип:

  • Windows Кусочеккартина:\*.bmp,\*.dib
  • JPEG документ:\*.jpeg,\*.jpg,\*.jpe
  • JPEG 2000 документ:\*.jp2
  • портативная сетевая графика:\*.png
  • WebP:\*.webp
  • удобный携式изображение Формат:\*.pbm,\*.pgm,\*.ppm,\*.pxm,\*.pnm
  • SUN сетка:\*.sr,\*.ras
  • TIFF документ:\*.tiff,\*.tif
  • OpenEXR изображениедокумент:\*.exr
  • Radius HDR:\*.hdr,\*.pic
  • Gdal сохранение растровых и векторных геопространственных данных

Ты можешьк ВидетьImreadModesперечислятьвыражать Можеткпередача Даватьimreadфункцияиз Может能логотип。 В примере, мы используем следующий контент:

Язык кода:javascript
копировать
    IMREAD_GRAYSCALE | IMREAD_IGNORE_ORIENTATION 

Это означает, что мы хотим, чтобы изображение Воля загружало изображение в оттенках серого, а также хотим игнорировать сохранение существующего файла изображения из EXIF из информации о направлении в части данных.

OpenCV Также поддержкачитать несколько страниц с изображениями документа. поэтому,ты需хотетьиспользоватьimreadmultiфункция. Даон Простойиз例ребенок:

Язык кода:javascript
копировать
    std::vector<Mat> multiplePages; 
    bool success = imreadmulti("c:/dev/multi-page.tif", multiplePages,
        IMREAD_COLOR); 

除Понятноimreadиimreadmulti,OpenCV возвращатьсяподдерживатьиспользоватьimdecodeфункцияот存储缓冲округчитать Выбиратьизображение. Эта функция особенно полезна, если изображение не хранится на диске и его необходимо передать в потоковом режиме из сети. использовать法иimreadфункция几乎такой же,除Понятно需хотетьдля Чтопоставлятьданные缓冲округ Вместо того, чтобы дадокументимя。

Написание изображений с использованием OpenCV

OpenCV серединаизimwriteфункция Можетиспользовать ВВоляизображениеписать磁盘начальствоиздокумент. Он использует имя файла с расширением для идентификации изображения в формате. хотетьсуществоватьimwriteфункциясерединасопределение Степень сжатияидобрыйпохожийнастраивать,ты需хотетьиспользоватьImwriteFlags,ImwritePNGFlagsждать. Даон Простойиз Пример,展示Понятнокаксуществоватьнастраивать Понятно渐进модельи质量Взаимновернониже(вышеиз Степень сжатия)из Состояние Вниз Воляизображениеписать JPG документ:

Язык кода:javascript
копировать
    std::vector<int> params; 
    params.push_back(IMWRITE_JPEG_QUALITY); 
    params.push_back(20); 
    params.push_back(IMWRITE_JPEG_PROGRESSIVE); 
    params.push_back(1); // 1 = true, 0 = false 
    imwrite("c:/dev/output.jpg", image, params); 

Если вы хотите использовать настройку по умолчанию,но Можетк完全упущениеparamsи Тольковходить:

Язык кода:javascript
копировать
    imwrite("c:/dev/output.jpg", image, params); 

связанныйimwriteфункциясерединаподдерживатьиздокументтипизтакой же Список表,пожалуйста参见начальствоодин节серединаизimreadфункция.

除Понятноimwrite,OpenCV возвращатьсяподдерживатьиспользоватьimencodeфункция Воляизображениеписать Внутри存缓冲округ。 иimdecodeВзаимнопохожий,существоватьизображение需хотетьпередачаприезжатьданныепоток Вместо того, чтобы дадержатьприезжатьдокументсерединаиз Состояние Вниз,этот尤Что有использовать。 использовать法иimwriteфункция几乎такой же,除Понятно需хотетьдля Чтопоставлятьданные缓冲округ Вместо того, чтобы дадокументимя。 существуют В этом случае,Зависит от Имя файла не указано,поэтомуimdecodeвозвращаться需хотеть Расширятьизображениек Решатьвыход Формат。

Чтение и запись видео в OpenCV

OpenCV предоставляет простой и удобный в использовании,сказатьдляVideoCapture,Можно сохранять файлы с диска,устройство захвата,камераилисетьвидеопоток(Например,RTSP начальствоиз RTSP Адрес) читать Получить видео (или последовательность изображений). Интернет). Ты можешьк Простой地использоватьopenфункция Приходитьпытатьсяотлюбойупомянулизисточниктип Открытьвидео,Затемиспользоватьreadфункция Волявходящийизвидеорамка捕获дляизображение. Даон例ребенок:

Язык кода:javascript
копировать
    VideoCapture video; 
    video.open("c:/dev/test.avi"); 
    if(video.isOpened()) 
    { 
      Mat frame; 
      while(true) 
      {             
        if(video.read(frame)) 
        { 
            // Process the frame ... 
        } 
        else 
        { 
            break; 
        } 
      } 
    } 
    video.release(); 

Если вы хотите загрузить последовательность изображений, просто замените имя файла на путь к файлу на модель. Например,image_%02d.pngВолячитать Выбиратьдокументимянравитьсяimage_00.png,image_01.pngиimage_02.pngждатьизизображение.

дляиз Интернета URL из потокового видео, просто предоставьте URL Просто укажите имя файла для.

о Нам из Примера следует обратить внимание еще на одну важную вещьда,это Нетдаонвесьи Можетк立Прямо сейчасиспользоватьиз Пример。 ты会发сейчас,Если ты попробуешь это,несмотря ни на что何часпрограмма Входитьwhileцикл,Все Воля阻конец GUI Обновите, и ваше приложение может даже выйти из строя. использовать Qt Быстрое решение этой проблемы — добавить следующий код внутрь цикла, чтобы гарантировать, что он также будет обработан. Тема GUI (и прочего):

Язык кода:javascript
копировать
    qApp->processEvents(); 

позже,Мы Волясуществовать Нет. 8 глава,"многопоточность"и Нет. 9 глава,“видеоанализировать”серединаучитьсясвязанныйэтотвопросиз更правильныйиз解决метод。

Помимо знаний, которые мы получили,VideoCaptureдобрыйвозвращатьсяпоставлятьдва重хотетьфункция,Прямо сейчасsetиget。 Они доступны для многочисленных параметров Конфигурация добрыйиз. связанный Может Конфигурацияпараметризвесь Список表,Пожалуйста, обратитесь кVideoCapturePropertiesперечислять。

Даоннавсегданочасиз Навык。 Вы также можете киспользовать Qt Creator код Заканчивать Функция,и ТолькописатьCAP_PROP_,потому чтодлявсе Взаимно关параметрвсекэтотначало。 По сути, этот трюк также работает для поиска любой функции, задержки перечисления. существовать Нет同из IDE использовать Эти советы обычно не обсуждаются в книгах о существовании, но существование может означать экономию большого количества времени в определенных ситуациях. к упомянутому ранее изcontentдля примера, например, вы Можно найти в Qt Creator кодредактироватьустройствосерединаписатьVideoCaptureProperties,Затемв соответствии с住Ctrlкнопкаищелкнуть。 этот Воляприноситьтыприезжатьперечислятьизисточник,и Ты можешьк Проверятьвсе Может能изперечислять,иесли Удачливыйизразговаривать,исходный кодсерединаиздокументтолькосуществоватьждать待着ты。

Даон Простойиз Пример,Можетчитать Выбиратьвидеосерединаизрамкачисло:

Язык кода:javascript
копировать
    double frameCount = video.get(CAP_PROP_FRAME_COUNT); 

Да另один Волявидеосередина抓рамкаустройствоизтекущий Кусочекнаборнастраиватьдлярамка号100из Пример:

Язык кода:javascript
копировать
    video.set(CAP_PROP_POS_FRAMES, 100); 

существоватьиспользоватьначальствоиVideoCaptureдобрый几乎такой же,Вы можете использоватьVideoWriterдобрый Волявидеоиизображение序Списокписать磁盘。 Да,существоватьписатьсVideoWriterдобрыйизвидеочас,需хотеть Более Некоторыйпараметр。 Даон例ребенок:

Язык кода:javascript
копировать
    VideoWriter video; 
    video.open("c:/dev/output.avi", CAP_ANY, CV_FOURCC('M','P', 'G',
        '4'), 30.0, Size(640, 480), true); 
    if(video.isOpened()) 
    { 
      while(framesRemain()) 
      { 
        video.write(getFrame()); 
      } 
    } 
    video.release();

существоватьэтот Примерсередина,framesRemainиgetFrameфункциядавоображаемыйфункция,Используется для проверки того, есть ли еще что-то, что нужно записать. Функция,иполучатьрамка(Mat)。 Как показано в Примере существования, в этом случае необходимо обеспечить захват API(Зависит от Вэтода Может选из,поэтомунассуществоватьVideoCaptureсередина Воля Чтоупущение)。 этотснаружи,существовать Открытьиспользовать Вписатьизвидеодокументчас,должениметьFourCCкод, FPSкадров в секунду)ирамкабольшой小。 МожеткиспользоватьOpenCVсерединаопределениеизCV_FOURCCМакросвходитьFourCCкод.

связанный Может能изFourCCкодиз Список表,пожалуйста参见здесь。 пожалуйста务必Уведомление,некоторыйFourCCкоди Что Взаимноотвечатьизвидео Формат Может能существоватьплатформаначальство Нет Можетиспользовать。 Это важно при развертывании вашего приложения «Существующая Воля» среди ваших клиентов. ты需хотетьубеждатьсятыизприложение Можеткчитать写需хотетьподдерживатьизвидео Формат。

Модуль HighGUI в OpenCV

Модуль HighGUI в OpenCV отвечает за то, чтобы сделать его быстрым и простым. GUI。 существоватькнига Книгаиз Нет. 3 глава,“создавать Всесторонний Qt + OpenCV проект”середина,насуже经использовать Понятномодульimshowсерединаширокоиспользоватьизфункция Изодин Приходитьбыстрыйпоказыватьизображение. Но да, когда мы хотим учиться Qt и для обработки GUI Когда созданиеиз является более сложной израмкой, мы Воля полностью пропускаем этот модуль и переходим к Qt тема. Но да, существовали до этого, стоит процитировать OpenCV в документации HighGUI модульизтекущийпредставлять:

"Хотя OpenCV дизайниспользовать В全面применить, и Можно найти Универсальность функций UI рамка (напр. Qt,WinForms или Cocoa)серединаиспользовать,Там вообще нет пользовательского интерфейса,но有час需хотетьбыстрыйпытаться Функцияи Может视изменятьрезультат。Это да HighGUI модульиздизайнглаз标。”

как Ты Волясуществоватькнига章позжеучитьсяиз Таким образом,насвозвращаться Воля停конециспользоватьimshowфункция,и坚持использовать Qt Функции для правильного и последовательного отображения изображений.

Обработка изображений и видео в Qt

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

QImageдобрый

Qt QImageМожет能да Qt Самое главное изискомпьютерное Изобретение, связанное со зрением, оно в основном обрабатывает данные изображений Qt добрый, который обеспечивает доступ на уровне пикселей к изображениям, к и многим другим функциям обработки данных изображения. нас Воляпредставлять Чтоструктураустройствоифункцияиз最重хотетьребенокнабор,尤ЧтодаиспользоватьOpenCVчас最重хотетьизребенокнабор。

QImageВключатьмного Нет同изструктураустройство,Этиструктураустройствопозволятьотдокументилиоригинальныйизображениеданныеилипустойизображениесоздаватьииметь дело с Что ПиксельизQImage。 нас Можетк Создайтеиметь Давать定большой小и ФорматизнулевойQImageдобрый,Как показано ниже:

Язык кода:javascript
копировать
    QImage image(320, 240, QImage::Format_RGB888); 

этот Воля Создайте320x240Пиксель(ширинаивысокий)изстандартный RGB Цветное изображение. Ты можешькссылкаQImage::Formatперечислять(использоватьQImageдобрыйдокумент)кполучатькподдерживать Форматизвесь Список表。 насвозвращаться МожеткпередачаQSizeдобрый Вместо того, чтобы даценить,И напишите следующий код:

Язык кода:javascript
копировать
    QImage image(QSize(320, 240), QImage::Format_RGB888); 

Следующий конструктор также начинается с OpenCV MatдобрыйсоздаватьQImageизметод Изодин。 здесь важно обратить внимание на да,OpenCV Matдобрыйсерединаизданные ФорматотвечатьиQImageдобрыйсерединаизданные Форматсовместимый。 По умолчанию OpenCV к BGR Формат (нет RGB)加载彩цветизображение,поэтому,еслинаспытатьсяиспользовать Должен ФорматстроитьQImage,но会существоватьрядданныесерединавходитьошибка。 Поэтому сначала нам нужно Что Конвертироватьдля RGB。 Даон例ребенок:

Язык кода:javascript
копировать
    Mat mat = imread("c:/dev/test.jpg"); 
    cvtColor(mat, mat, CV_BGR2RGB); 
    QImage image(mat.data, 
                 mat.cols, 
                 mat.rows, 
                 QImage::Format_RGB888); 

существоватьэтот Примерсередина,cvtColorфункцияда OpenCV функция,Можетиспользовать ВИзменятьMatдобрыйизцвет彩нулевой间。 еслинасупущение Должен ХОРОШО,нас Воля得приезжатьодинQImage,этоиз蓝цвети红цветрядуже互换。

Можеткиспользоватьнас Воляхотеть Видетьиз ВнизодинQImageструктураустройствосоздать先впередкодизправильныйверсиякнига(ки ВоляMatКонвертироватьдляQImageиз推荐метод)。 этовозвращаться需хотетьодинbytesPerLineпараметр,ДанассуществоватьMatдобрыйсерединаучитьсяизstepпараметр。 Даон例ребенок:

Язык кода:javascript
копировать
    Mat mat = imread("c:/dev/test.jpg"); 
    cvtColor(mat, mat, CV_BGR2RGB); 
    QImage image(mat.data, 
                 mat.cols, 
                 mat.rows, 
                 mat.step, 
                 QImage::Format_RGB888); 

использоватьэтотструктураустройствоиbytesPerLineпараметризпреимуществоданасвозвращаться Можетк Конвертировать连Продолжение存储существовать Внутри存серединаизизображениеданные。

Следующий конструктор также начинается с磁盘начальстводержатьиздокументчитать ВыбиратьQImageизметод。 Даон例ребенок:

Язык кода:javascript
копировать
    QImage image("c:/dev/test.jpg"); 

Обратите внимание, что Qt и OpenCV файлы поддержки независимы друг от друга. Это просто означает, что файл, упомянутый в качестве израмки, может вообще не соответствовать типу файла, в этом случае для чтения необходимо выбрать другую рамку при выборе этого конкретного типа файла. По умолчанию Qt поддерживатьчитать Выбиратьк Внизизображениедокументтип:

Формат

иллюстрировать

поддерживать

BMP

Windows Кусочеккартина

читать/писать

GIF

Формат графического обмена (необязательно)

читать

JPG

объединенная группа экспертов по фотографии

читать/писать

JPEG

объединенная группа экспертов по фотографии

читать/писать

PNG

портативная сетевая графика

читать/писать

PBM

Переносная схема Кусочка

читать

PGM

Переносимое изображение в оттенках серого

читать

PPM

Портативная пиксельная карта

читать/писать

XBM

X11 Кусочеккартина

читать/писать

XPM

X11 Пиксельная карта

читать/писать

дляссылкаиз表источник:Кусочек Вэта страницаизQImageдобрыйдокумент。

Кроме всех конструкторов,QImageвключатьк Внизчлен,Этичленсуществоватьиметь дело сизображениечас Нет常方удобный:

  • allGray:Можеткиспользовать Приходить检查изображениесерединаизвсе Пиксельданет Вседа灰цвет阴影。 По сути, это проверяет, существуют ли все пиксели с одинаковым значением da в своих соответствующих каналах. RGB ценить.
  • bitsиconstBits(толькодаbitsизconstверсиякнига):Эти Можетиспользовать ВдоступQImageсерединаизбаза础изображениеданные。 этот Можеткиспользовать ВВоляQImageКонвертировать​​дляMatкудобныйсуществоватьOpenCVсерединаруководитьдальшеиметь дело с。 и ВоляMatКонвертироватьдляQImageчас Место Видетьизтакой же,существованияздесь Нам также необходимо убедиться, что они совместимы. для обеспечения этого,Мы можем добавитьconvertToFormatфункция,кубеждатьсянасизQImageдастандартныйизтриряд RGB изображение. Даон例ребенок:
Язык кода:javascript
копировать
        QImage image("c:/dev/test.jpg"); 
        image = image.convertToFormat(QImage::Format_RGB888); 
        Mat mat = Mat(image.height(), 
                       image.width(), 
                       CV_8UC(3), 
                       image.bits(), 
                       image.bytesPerLine()); 

极Что Важная изда, на которую стоит обратить внимание,При передаче таких данных,кикартина ВоляMatКонвертироватьдляQImageчас Место Видетьиз Таким образом,существовать Qt и OpenCV Между издобрыми передается одно и то же пространство памяти. этот意味着,еслитысуществоватьвперед面из Примерсередина Исправлять ПонятноMatдобрый,нона самом деледасуществовать Исправлятьизображениедобрый,потому чтодляты Толькода Воля Чтоданныеобратитесь к针передача Давать ПонятноMatдобрый. В то же время это очень полезно (проще манипулировать изображениями) и опасно (вылетает приложение) и вот так использовать Qt и OpenCV При этом нужно быть осторожным. еслихотетьубеждатьсяQImageиMatдобрыйиметь完全независимыйизданные,но МожеткиспользоватьMatдобрыйсерединаизcloneфункцияилиQImageсерединаизcopyфункция.

  • byteCount:этот Волявозвращатьсяизображениеданныезаниматьиспользоватьизбайтчисло。
  • bytesPerLine:добрыйпохожий ВMatдобрыйсерединаизstepпараметр。 Он определяет количество байтов на строку сканирования изображения. этотпо сутииwidthтакой же,или лучше издаbyteCount/height
  • convertToFormat:Можетиспользовать ВВоляизображение Конвертироватьдля另один种Формат。 существоватьвперед面изbitsфункция Примерсередина,Мы видели Пример.
  • copy:Можетиспользовать ВВоляизображениеизчасть(иливсе)копироватьприезжать另одинQImageдобрый.
  • depth:этот Волявозвращатьсяизображениеизглубокий度(или每Пиксель Кусочекчисло)。
  • fill:этотфункция Можетиспользовать Внаполнениетакой жецветизизображениесерединаизвсе Пиксель。

Нравится эта функцияк и Qt рамкасерединаизмногодругойдобрыйпохожийфункция,МожеткиспользоватьQColor,Qt::GlobalColorэтоттри种цветтип,наконецдаи Пиксельсерединаиз Кусочек Взаимноверноотвечатьиз整числоценить. Несмотря на то, что их очень легко использовать, потребуется некоторое время, прежде чем продолжить их использование. Qt Creator Helpмодельчитатьчитать Чтодокумент页面такжедамудрыйиз。

  • format:Можетиспользовать ВполучатьQImageсерединаизображениеданныеизтекущий Формат。 какнассуществоватьвперед面из Примерсередина Видетьиз,QImage::Format_RGB888дасуществовать Qt иOpenCVИз间передачаизображениеданныечас最совместимыйиз Формат。
  • hasAlphaChannel:еслиизображениеиметь Alpha ряд,новозвращатьсяtrue。 Alpha рядиспользовать ВКонечно Пиксельизпрозрачныйстепень.
  • height,widthиsize:Эти Можетиспользовать Вполучатьизображениеизвысокий,Ширина и размер.
  • isNull:если没有изображениеданные,новозвращатьсяtrue,в противном случаевозвращатьсяfalse
  • load,loadFromDataиfromData:это们Можетиспользовать Вот磁盘илиот缓冲округсередина存储изданныесередина Поискизображение(добрыйпохожий ВOpenCVсерединаизimdecode)。
  • mirrored:этотна самом деледаодин种изображениеиметь дело сфункция,Доступно для вертикального,уровеньилив то же время镜картина(подбросить)изображение.
  • pixel:добрыйпохожий ВMatдобрыйсерединаизatфункция,pixelМожетиспользовать ВПоиск Пиксельданные。
  • pixelColor:добрыйпохожий Вpixel,ноэтотвозвращатьсяодинQColor
  • rect:этот ВолявозвращатьсяодинQRectдобрый,Чтосередина Включатьизображениеизграницапрямоугольник。
  • rgbSwapped:Даон Нет常方удобныйизфункция,尤Чтодасуществоватьиспользовать OpenCV и отобразить изображение. Он существует, меняя местами синий и красный каналы, не изменяя фактические данные изображения. какнас Волясуществоватькнига章позже Видетьиз Таким образом,Дасуществовать Qt серединаправильныйпоказыватьMatдобрыйи避免 OpenCV cvtColorфункция调использовать Местонеобходимыйиз。
  • save:Эти Можетиспользовать ВВоляизображениесодержаниедержатьприезжатьдокументсередина。
  • scaled,scaledToHeightиscaledToWidth:提иизвсетрииндивидуальныйфункциявсе Можетиспользовать В调整изображениебольшой小к Подходящий Давать定большой小。 (Необязательно) При вызове этой функции вы можете использовать одну из следующих констант для решения любых проблем с соотношением сторон. Подробнее об этом читайте в следующей главе «Волясуществовать».
    • Qt::IgnoreAspectRatio
    • Qt::KeepAspectRatio
    • Qt::KeepAspectRatioByExpanding
  • setPixelиsetPixelColor:Эти Можетиспользовать Внастраиватьизображениесерединаодининдивидуальный Пиксельизсодержание。
  • setText:Можетиспользовать Вкподдерживатьэтоизизображение Форматнастраиватьтекстценить.
  • text:Можетиспользовать ВПоискнастраиватьприезжатьизображениеизтекстценить.
  • transformed:Как следует из названия,этотфункцияиспользовать ВКонвертироватьизображение. это采использоватьQMatrixилиQTransformдобрыйивозвращаться Конвертироватьназадизизображение. Даон Простойиз例ребенок:
Язык кода:javascript
копировать
        QImage image("c:/dev/test.jpg"); 
        QTransform trans; 
        trans.rotate(45); 
        image = image.transformed(trans); 
  • trueMatrix:Можетиспользовать ВПоискиспользовать В变换изображениеиз变换матрица。
  • valid:этот Воляполучатьодинточка(X, Y),если Давать定точкадаизображение Внутриизэффективный Кусочекнабор,новозвращатьсяtrue,в противном случаевозвращатьсяfalse

QPixmapдобрый

QPixmapдобрыйсуществоватьнекоторыйаспектдобрыйпохожий ВQImage,Дакогданас需хотетьсуществовать Экранначальствопоказыватьизображениечас,МожеткиспользоватьQPixmapдобрый. QPixmapМожетиспользовать В加载идержатьизображение(СразукартинаQImageодин样),ноэто Нетпоставлятьиметь дело сизображениеданныеиз灵活секс,Так же выполняем все из существующих модификаций,После обработки и эксплуатации,существовать需хотетьпоказыватьлюбойизображениечас再использоватьэто。 большинствоQPixmapметодиQImageметод同имя,ипо сутиктакой жеиз Способиспользовать。 вернонас Приходить说очень重хотетьисуществоватьQImageсередина Нет存существоватьиздвафункциянравиться Вниз:

  • convertFromImage:этотфункция Можетиспользовать Виспользовать ПриходитьсQImage изизображениеданныенаполнениеQPixmapданные
  • fromImage:Даонстатическийфункция,по сутииconvertFromImageтакой же

сейчассуществовать,Мы Воля Создайте Примерпроект,к Используйте то, что мы узнали до сих пор, и примените это на практике. Нет реального практического опыта,Все захватывающие методы, изученные в этой главе, потрачены впустую.,поэтому让насотнасизизображение Проверять Примерприложениеначинать:

  1. первыйсуществовать Qt Creator середина Создайтеновыйиз Qt Widgets приложениеи Воля Что命имядляImageViewer
  2. Затемвыбиратьmainwindow.ui,Затемиспользоватьдизайнустройствоудалитьменюстолбец,состояниестолбециинструментстолбец,Затемсуществоватьокноначальство放набородин Этикеткавиджет(QLabel)。 щелкнутьокноначальствоизпустойобласть,Затемв соответствии сCtrl + Gвсе будутсодержание(только Этикеткаизвиджет)布набордлясетка。 Эта Воля гарантирует, что все размеры всегда будут изменены в соответствии с размером окна.
  3. сейчассуществовать,Воляlabelизalignment/Horizontalсвойство ИзменятьдляAlignHCenter。 Затем Воля ЧтоHorizontalиVertical sizePolicyсвойство Все ИзменятьдляIgnored。 Следующий,Воляк Внизincludeзаявлениедобавить вmainwindow.hдокументсередина:
Язык кода:javascript
копировать
        #include <QPixmap> 
        #include <QDragEnterEvent> 
        #include <QDropEvent> 
        #include <QMimeData> 
        #include <QFileInfo> 
        #include <QMessageBox> 
        #include <QResizeEvent> 
  1. сейчассуществовать,использоватькодредактироватьустройство Воляк Внизк保护изфункциядобавить вmainwindow.hсерединаизMainWindowдобрыйопределениесередина:
Язык кода:javascript
копировать
        protected: 
        void dragEnterEvent(QDragEnterEvent *event); 
        void dropEvent(QDropEvent *event); 
        void resizeEvent(QResizeEvent *event); 
  1. кроме того,ВолячастныйизQPixmapдобавить втыизmainwindow.hсередина:
Язык кода:javascript
копировать
        QPixmap pixmap; 
  1. сейчассуществовать,переключиться наmainwindow.cppи Воляк Внизсодержаниедобавить вMainWindowструктураустройствосередина,кнсуществовать вызывается сразу при запуске программы:
Язык кода:javascript
копировать
        setAcceptDrops(true);
  1. Следующий,существоватьmainwindow.cppдокументсерединадобавить вк Внизфункция:
Язык кода:javascript
копировать
        void MainWindow::dragEnterEvent(QDragEnterEvent *event) 
        { 
          QStringList acceptedFileTypes; 
          acceptedFileTypes.append("jpg"); 
          acceptedFileTypes.append("png"); 
          acceptedFileTypes.append("bmp"); 

          if (event->mimeData()->hasUrls() && 
            event->mimeData()->urls().count() == 1) 
          { 

            QFileInfo file(event->mimeData()->urls().at(0).toLocalFile()); 
            if(acceptedFileTypes.contains(file.suffix().toLower())) 
            { 
              event->acceptProposedAction(); 
            } 
          } 
        } 
  1. отвечатьдобавить вmainwindow.cppиз另одинфункциянравиться Вниз:
Язык кода:javascript
копировать
        void MainWindow::dropEvent(QDropEvent *event) 
        { 
          QFileInfo file(event->mimeData()->urls().at(0).toLocalFile()); 
          if(pixmap.load(file.absoluteFilePath())) 
          { 
           ui->label->setPixmap(pixmap.scaled(ui->label->size(), 
               Qt::KeepAspectRatio, 
               Qt::SmoothTransformation)); 
          } 
          else 
          { 
            QMessageBox::critical(this, 
               tr("Error"), 
               tr("The image file cannot be read!")); 
          } 
        } 
  1. наконец,Воляк Внизфункциядобавить вmainwindow.cpp,Мы готовы выполнить наше приложение:
Язык кода:javascript
копировать
        void MainWindow::resizeEvent(QResizeEvent *event) 
        { 
          Q_UNUSED(event); 
          if(!pixmap.isNull()) 
          { 
            ui->label->setPixmap(pixmap.scaled(ui->label->width()-5, 
                                              ui->label->height()-5, 
                                              Qt::KeepAspectRatio, 
                                              Qt::SmoothTransformation)); 
          } 
        } 

Как вы уже догадались, нам осталось только написать существующее отображение, где можно перетаскивать изображения изприложения. проходить КMainWindowдобавить вdragEnterEventфункция,Мы можем проверить, является ли перетаскиваемый объект файлом.,尤Чтодаэтоданетдаодининдивидуальныйдокумент. Затем,нас检查Понятноизображениетипкубеждатьсяэтокподдерживать。

существоватьdropEventфункциясередина,нас Только Воляизображениедокумент加载приезжатьQPixmapсередина,Затем Воля Что拖放приезжатьприложениеокносередина Прямо сейчас Может。 Затем,ВоляQLabelдобрыйизpixmapсвойствонастраиватьдляpixmap

наконец,существоватьresizeEventфункциясередина,Мы гарантируем, что независимо от размера окна,насизизображениевсегда会Увеличитьк Подходящийиметьправильный纵横Сравниватьизокно。

Забудьте о простых шагах, описанных выше, и вы столкнетесь с Qt Проблемы с технологией программирования перетаскивания в Китае. Например,Нет следующей строки,Прямо сейчассуществоватьнасизMainWindowдобрыйизструктураустройствосередина,нонесмотря ни на что Воля Чтофункциядобавить вMainWindowдобрый,Все Нет会приниматьлюбойудалить:

setAcceptDrops(true);

Дагенерироватьиз Приложениескриншот。 Попробуйте перетащить разные изображения в окно приложения и посмотрите, что произойдет. ты甚至Можеткпытаться拖放Нетизображениедокументкубеждаться Нетприниматьэто们:

[Передача изображения по внешней ссылке не удалась. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-VxpRhi3W-1681869945443) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/a3bc4e9f-ca2a-46e4-a457-f311fd023fc6.png)]

этотпо сутидаодинкнигасвязанныйкаксуществовать Qt Показать изображения к и как существовать в Qt приложениесерединадобавить в拖放Функция из учебника. какнассуществоватьвперед面из Примерсередина Видетьиз Таким образом,Можетк ВоляQPixmapиQLabelвиджетодин起легкийпоказывать。 QLabelвиджетимя有час Может能会引起误解,нона самом деле,это Неттолько Можеткиспользовать Впоказыватьчистыйтекст,ии Можеткиспользовать Впоказыватьбогатыйтекст,象素картина甚至Фильм(использоватьQMovieдобрый)。 Зависит от Внасуже经知道как ВоляMatКонвертироватьдляQImage(противоположный Из亦Ран),кикак ВоляQImageКонвертироватьдляQPixmap,поэтомунас Можеткписатьнравиться Внизсодержание,киспользоватьOpenCV,использовать Некоторыйкомпьютерное зрениеалгоритмверно Чторуководитьиметь дело с(Мы Волясуществовать Нет. 6 Глава «OpenCV изизображениеиметь дело с”ипослеглавасерединаверноэтотруководитьподробныйучиться),Затем Воля Что КонвертироватьдляQImage ЗатемприезжатьQPixmap,наконецсуществоватьQLabelначальствопоказыватьрезультат,Как показано в примере кода ниже:

Язык кода:javascript
копировать
    cv::Mat mat = cv::imread("c:/dev/test.jpg"); 
    QImage image(mat.data, 
                 mat.cols, 
                 mat.rows, 
                 mat.step, 
                 QImage::Format_RGB888); 
    ui->label->setPixmap(QPixmap::fromImage(image.rgbSwapped())); 

QImageReaderиQImageWriterдобрый

QImageReaderиQImageWriterдобрый Можетиспользовать Вверноизображениечитать写процессруководить Больше контроля。 это们поддерживатьиQImageиQPixmapтакой жеиздокументтип,Но с большей гибкостью,когдаизображениечитать Выбиратьилиписатьпроцесс出сейчасвопросчас会поставлятьошибкаинформация,исуществоватьк Вниз Состояние Вниз,тывозвращаться Можеткнастраиватьиполучать Болееизображениесвойство: тыиспользоватьQImageReaderиQImageWriterдобрый. Как вы увидите в следующих главах, мы Волясуществовать комплексное изкомпьютерное Используйте эти самые издобры для зрения, чтобы лучше контролировать изображения и читать написанное.Сейчас существуют, нам нужно лишь краткое введение, чтобы перейти к следующей части руководить.

QPainterдобрый

QPainterдобрый Можетиспользовать ВсуществоватьделатьдляQPaintDeviceдобрыйребенокдобрыйизлюбой Qt добрый, он руководил рисованием (в основном да рисованием). что это значит? По сути, это означает включение Qt Внутри все виджетовать, с визуальными эффектами, Можно найти нарисовать на нем что-нибудь. поэтому,Просто чтобы назвать несколько,QPainterМожетиспользовать ВрисоватьQWidgetдобрый(по сути意味着всесуществующийисделанный на заказиз Qt виджет),QImage,QPixmapимногодругой Qt добрый. ты Можно найти в Qt Creator режим помощи Вниз ПроверятьQPaintDeviceдобрыйдокумент页面,кполучатьнаследоватьQPaintDeviceиз Qt Полный список добрыйиз. QPainterиметь众многофункция,Чтосерединамногоимякdrawначало,и Крышкавсе Этифункциякнига身Воля需хотеть整整одинглава,Данас Воля Видетьодинбазакнига Пример,иллюстрироватькак Воля ЧтоиQWidgetиQImageодин起использовать。 по сути,такой жеизлогика适использовать ВМожеткиQPainterодин起использоватьизвседобрый.

поэтому,как ты сказал,Вы можете настроить его самостоятельно Qt виджет,ииспользоватьQPainterсоздавать(илирисовать)Что Может视面。 на самом деле,Даиспользовать Всоздаватьновыйиз Qt виджетиз метода (также популярный метод). 让наспроходитьодин Примерприйти на помощь, оно тонет. Мы Воля Создаем новые из Qt виджет, виджет отображает только мигание в кружке:

  1. первый СоздайтеимядляPainter_Testиз Qt Widgets приложение.
  2. Затемотхозяинменюсерединавыбиратьдокумент/новыйдокументилипроект。
  3. существует окно «Новый файл или проект», выберите «C++». и C++ добрый”,Затемв соответствии с“выбирать”。
  4. существование появляется в окне,убеждаться Воля“добрыйимя”настраиватьдляQBlinkingWidget,и Воля“базадобрый”выбиратьдляQWidget。 убеждаться选середина“включатьQWidget”флажок,и оставьте остальные варианты,Как показано на следующем скриншоте:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-xgMfXcwH-1681869945443) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/3faf4dfc-97df-44ff-9152-8dd5ac8b407d.png)]

  1. Нажмите «Далее», сейчас существует,Затемв соответствии с Заканчивать。 У этого Воля Создайте заголовок и исходный файл добрый, а Воля его добавьте в тыизпроектсередина.
  2. сейчассуществовать,ты需хотетькрышкаQBlinkingWidgetизpaintEventметод,ииспользоватьQPainterруководить Некоторыйрисовать。 поэтому,первый Воляк Внизincludeзаявлениедобавить вqblinkingwidget.hдокументсередина:
Язык кода:javascript
копировать
        #include <QPaintEvent> 
        #include <QPainter> 
        #include <QTimer> 
  1. сейчассуществовать,Воляк Внизк保护изчлендобавить вQBlinkingWidgetдобрыйсередина(Например,Воля Чтодобавить всуществующийиз公共членпосле):
Язык кода:javascript
копировать
        protected: 
         void paintEvent(QPaintEvent *event);
  1. тывозвращаться需хотеть Кэтотдобрыйдобавить водин专использоватьслот。 поэтому,существовать先впередк保护изpaintEventфункцияпоследобавить вк Внизсодержание:
Язык кода:javascript
копировать
        private slots: 
          void onBlink(); 
  1. наконецхотетьдобавить вqblinkingwidget.hдокументсередина,Добавьте к в личный кабинет Волясуществоватьвиджетиспользовать:
Язык кода:javascript
копировать
        private: 
         QTimer blinkTimer; 
         bool blink; 
  1. сейчассуществовать,переключиться наqblinkingwidget.cppисуществоватьс动создаватьизструктураустройствосерединадобавить вк Внизкод:
Язык кода:javascript
копировать
        blink  = false; 
        connect(&blinkTimer, 
          SIGNAL(timeout()), 
          this, 
          SLOT(onBlink())); 
       blinkTimer.start(500); 
  1. Далее Воляк следующими двумя способами добавляем вqblinkingwidget.cppсередина:
Язык кода:javascript
копировать
        void QBlinkingWidget::paintEvent(QPaintEvent *event) 
        { 
          Q_UNUSED(event); 
          QPainter painter(this); 
          if(blink) 
             painter.fillRect(this->rect(), 
                QBrush(Qt::red)); 
          else 
             painter.fillRect(this->rect(), 
                QBrush(Qt::white)); 
        } 

        void QBlinkingWidget::onBlink() 
        { 
          blink = !blink; 
          this->update(); 
        }
  1. сейчассуществовать,проходить Открытьmainwindow.uiпереключиться нашаблон проектирования,Затем Волявиджетдобавить вMainWindowдобрый. Widgetизточное значениедаWidget,этодаоннулевойиз,когдаты Воля Чтодобавить вMainWindowчас会Уведомлениеприезжать。 Смотрите скриншот ниже:

[Передача изображения по внешней ссылке не удалась. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-rTcxF8ls-1681869945443) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/bcf530a0-d73d-41cd-aff8-7385c8041759.png)]

  1. сейчассуществовать,Щелкните правой кнопкой мышищелкнутьдобавить визQWidgetдобрыйизнулевойокновиджет,Затемот弹出менюсерединавыбирать“обновлениеприезжать”:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-wNkImWpf-1681869945443) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/ff9aa0d6-1381-4ec8-9e9a-e7301045e281.png)]

  1. существовать Воля Открытьизновыйокносередина,сказатьдляPromoted Widgetsокно,ВоляPromotedдобрыйимянастраиватьдляQBlinkingWidget,Затемв соответствии сAddкнопка:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-Qxj8I6Ee-1681869945443) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/4799301c-8917-40fa-b3d5-0f189831d4bf.png)]

  1. наконец,в соответствии сPromote。 Ваш виджет настройки приложения готов к использованию. После запуска приложения вы будете видеть его каждый раз 500 Мигает один раз в миллисекунду (полсекунды).

на самом деле,Дасуществовать Qt Метод создания Настроить виджет окна Универсальный. Изготовить новые изделия на заказ Qt виджетисуществоватьтыиз Qt Чтобы применить его, вам необходимо:

  1. СоздайтенаследоватьQWidgetизновыйдобрый.
  2. крышка ЧтоpaintEventфункция.
  3. использоватьQPainterдобрыйсуществовать Чтоначальстворуководитьрисовать。
  4. существоватьокносерединадобавить вQWidget(виджет)。
  5. Воля Что Чтоначальство的Чтоновыйновыйしますますします

на самом деле,ВоляQWidgetпродвигатьдлясделанный на заказизвиджеттакжедаот Нет.трехсторонний Разработчик(илитакже许даот互联网)получатьвиджети希望существоватьприложениеокносерединаиспользоватьэточасиспользоватьизметод。

существоватьвперед面из Примерсередина,насв соответствии с闪烁переменнаясостояниеиспользоватьQPainterизfillRectфункция Простой地每秒использовать红цвети白цветнаполнениеэто。 такой же,Вы можете использоватьdrawArc,drawEllipse,drawImageиQPainterсерединаиз Болеефункциясуществоватьвиджетначальстворисовать几乎всесодержание。 здесь важно обратить внимание на да,Когда мы хотим использовать существованиевиджет,нас Воляthisпередача ДаватьQPainterПример。 еслинас想использоватьQImage,нас Толькохотетьубеждаться ВоляQImageпередача Даватьэтоилииспользоватьbeginфункция ПриходитьструктураQPainterПрямо сейчас Может。 Даон例ребенок:

Язык кода:javascript
копировать
        QImage image(320, 240, QImage::Format_RGB888); 
        QPainter painter; 
        painter.begin(&image); 
        painter.fillRect(image.rect(), Qt::white); 
        painter.drawLine(0, 0, this->width()-1, this->height()-1); 
        painter.end(); 

существуют В этом случае,все绘картинафункция Вседолжен Включатьсуществоватьbeginиendфункция调использоватьсередина。

Обработка камеры и видео в Qt

Зависит от Внас Воляиспользовать OpenCV интерфейс для обработки изображений, камер и видео, поэтому мы не будем рассматривать Qt рамка Предоставить изиспользовать Вчитать Выбирать,Проверятьииметь дело свидеоизвсе Может能секс。 Но иногда, особенно когда одна из двух рамок предлагает лучшую и более простую функциональную реализацию, возникает соблазн избежать ее использования. Например, даже OpenCV поставлять Понятно Нет常强большойиз Взаимно机иметь дело сметод,как Мы Волясуществовать Нет. 12 глава,“Qt Quick Приложение" см. вот так, длясуществовать Android,iOS Работа с камерой на мобильной платформе с помощью Qt Есть еще многое, что можно сказать. Поэтому давайте кратко представим некоторые важные и существующие приложения для веб-камер и обработки видео. Qt добрый и храни их до тех пор, пока существует Нет. 12 глава,“Qt Quick Приложение» используйте их только для.

существовать Qt Creator Поиск в справочном указателе Qt Multimedia C++ добрый,получить Полный список доступных добрыйиз и обновленный список в модуле Qt Multimedia,к И документация и Пример.

Вот они:

  • QCamera:Можеткдоступплатформаначальство Можетиспользоватьизкамера。
  • QCameraInfo:Можетиспользовать Вполучатьсвязанныйплатформаначальство Можетиспользоватькамераизинформация。
  • QMediaPlayer:Можеткиспользовать Приходитьигратьвидеодокументидругойтипизноситель записи。
  • QMediaRecorder:Записыватьвидеоили Другие СМИтипчас,Этот добрый полезен.
  • QVideoFrame:этотдобрый Можетиспользовать Вдоступ Взаимно机抓Выбиратьизодининдивидуальныйрамка。
  • QVideoProbe:Можетиспользовать В监视Приходитьскамераиливидеоисточникизрамка。 этотдобрыйтакже Можеткиспользовать Всуществовать Qt для дальнейшей обработки кадра.
  • QVideoWidget:Можетиспользовать Впоказывать Приходитьскамераиливидеоисточникизвходящийрамка。

пожалуйста, обрати внимание,упомянулизвседобрый Все存существовать В Qt из модуля Multimedia, поэтому для их использования необходимо сначала ввести Воляк вниз добавить в Qt проект PRO файл, убедитесь, что мультимедийный модуль доступен вам из проекта:

Язык кода:javascript
копировать
      QT += multimedia 

Помимо вышеупомянутого издоброго, Qt Мультимедийный модуль также предоставляет множество других полезных возможностей для обработки видеоданных. Ты всегда Можно найти в Qt Creator режим помощи Внизпроходитьсуществоватьпомощь索引серединаруководитьпоиск Приходить检出каждыйдобрыйиздокумент页面。 Обычно новые из Qt версия Это объединение власти новый издобрыйили является обновлением существующего доброгоиз, следовательно, стать для настоящего из Qt Разработчики, пожалуйста, обратите внимание на страницу документации и обновления и даже можете сообщать об ошибках или проблемах, если существуют какие-либо проблемы, связанные с Qt все еще Рандаон Открытый исходный кодрамка,Он полагается на свое сообщество пользователей с открытым исходным кодом.

Подвести итог

книга章даон重хотетьизвеха,потому чтодляэтопредставлять Понятно Воля OpenCV и Qt Рамочная ссылка существует вместе с желаемой концепцией. существоватькнига章середина,насизучать ПонятносвязанныйMatдобрыйи Что Вариантыизвсеинформация。 Мы учимся OpenCV Китайско-сингапурская прозрачность API,кикакиспользоватьUMatдобрый Можетк提высокийкомпьютерное зрение Приложениепроизводительность。 Мы также научились читать, записывать изображения и видео, а также захватывать видеокадры с камеры и сети на основе видеоисточников. Позже мы продолжили изучать икомпьютерное зрениеи Обработка изображений Qt функцияидобрый. В этой главе представлены Qt серединаизQImageдобрый,этоиOpenCVсерединаизMatдобрыйждать效。 насвозвращатьсяучиться ПонятноQPixmapиQPainterдобрыйкидругой几индивидуальный Qt добрый. существуют, делают это из В то же время мы также научились создавать Qt виджетииспользоватьQPainterдобрыйрисоватьQImageдобрый. Наконец, мы представляем, связанные с обработкой видео и камеры. Qt добрыйделатьдлякнига章изокончание。

существовать Нет. 5 глава,“Графический видрамка”середина,нас Воляпроходитьпредставлятьодин Нет常强большойиздобрыйQGraphicsSceneи Графический видрамка Приходить Заканчивать Qt иOpenCVсерединаизкомпьютерное Головоломка для зрения, ее можно использовать для очень гибкого просмотра и манипулирования данными изображения. Нет. 5 глава,“Графический видрамка”Воляда Входитькомпьютерное зренияи В области обработки изображений из последней главы, потому что для нас есть комплексное компьютерное Одна из наиболее важных функций приложения для просмотра изображений Воляпроходить Заканчивать, то есть просматривать изображения и манипулятор, мы, Воля, продолжаем изучать новое изкомпьютерное зрение Навык,Каждый раз добавляйте к нему новые,Точно так же, как то, что мы узнали о существовании в предыдущих главах.

5. Структура графического представления

Теперь, когда мы знакомы с Qt и OpenCV рамкасерединакомпьютерное зрение Приложениебазакнигастроитьмодуль,Такнас Можеткпродолжатьизучатьсвязанныйкомпьютерное зрениеприложениесередина Может视изменятьчастьизразвиватьиз Подробнее. разговариватькомпьютерное зрение, каждый польский зователь мгновенно найдет изображения или видео для предварительного просмотра. к Вы хотите из любого изображения, например, администратора, все они включены в существующий интерфейс пользователя, область сразу привлечет внимание и ее можно будет кпрогуляться. GUI Другие компоненты на из легко идентифицировать по проведению некоторых границ или даже простых линий. о Видеорежим и фактически требует, чтобы визуальные концепции и источники медиа-входа соответствовали использованию всего контента, так сказать. такой же,длянас Волясоздаватьизкомпьютерное применимо то же рассуждение, что и из. Конечно, в некоторых случаях результат процесса просто отображается в виде числового значения и отправляется другим участникам процесса. Но, к счастью для нас, мы видим обе ситуации, поэтому нам нужно существовать, чтобы иметь добрый функционал в приложении существования, кнопка льзователь, чтобы просмотреть свои собственные файлы Открытия или просмотреть преобразованное (или отфильтрованное) изображение. Экран. Еще лучше, просмотрите результаты работы некоторых алгоритмов обнаружения объектов на панели предварительного просмотра видео в реальном времени. Должен面板по сутидаонсцена,или даже лучше,этодаонграфикасцена,Дакнига Книгакнига章хотетьобсуждатьизтема.

существовать Qt рамка Внутриизмногомодуль,добрыйиребенокрамка Вниз,Есть раздел посвященный упрощению обработки графики в инструменте.,сказатьдляГрафический видрамка。 это Включатьмногодобрый,几乎всеиздобрый ВсекQGraphicsначало,ивсе Этидобрый Все Можетиспользовать Виметь дело сстроитькомпьютерное Визуализация большинства графических задач, с которыми вы можете столкнуться при применении визуализации. Графический видрамкавсе будут Может能изверно象Простой地分длятрииндивидуальныйхозяинхотетьдобрый Не,Наряду с этим архитектура позволяет легко добавлять,удалить,Модифицируйте и отображайте графические объекты.

  • сцена(QGraphicsSceneдобрый)
  • вид(QGraphicsViewвиджет)
  • графикапроект(QGraphicsItemи Чторебенокдобрый)

существоватьдоглавасередина,насиспользовать Понятно最Простойиз Способв то же времяиспользовать OpenCV(imshowфункция)и Qt Виджет окна Этикетки для визуализации изображений, который управляет отображением изображений (например, их выбором, изменением, Масштабируйте их и нажимайте соответственно. Даже для самых простых задач, таких как выбор изображения и перетаскивание его в другое место, нам приходится много писать код и выполнять запутанную обработку событий мыши. То же самое касается увеличения и уменьшения масштаба. Да,проходитьиспользовать Графический видрамкасерединаиздобрый, может справиться со всеми этими вещами проще и с большей производительностью, потому что для Графический Видрамкадбрый стремится эффективно обрабатывать множество графических объектов.

существуют В этой главе мы, Воля, начинаем учиться Qt из Графический видрамка самого важного издоброго и важного изда, мы, очевидно, даём средства и создаём комплексное изкомпьютерное требуется зрение издобрый самый актуальный издобрый. книга章изучатьизхозяин题Воля ЗаканчиватьComputer_Visionпроектизбаза础,Долженпроектдасуществовать Нет. 3 глава,“создавать Всесторонний Qt + OpenCV проект»из «окончаниесоздан». К концу этой главы вы сможете увидеть программное обеспечение для создания редакторов изображений, похожее на изсцена,с. уществовать В этой сцене вы можете добавлять новые изображения в сцену, выбирать их, удалять, увеличивать и уменьшать масштаб и т. д. ждать. тывозвращаться Волясуществоватькнига章末оказатьсяComputer_Visionпроектбаза础ибаза础версиякнигаиз Связь,Мы, Воля, продолжаем использовать эту ссылку,直приезжатькнига Книгаизнаконецнесколько глав。

В этой главе мы Воля представляем следующие главы:

  • какиспользоватьQGraphicsSceneсуществоватьсценаначальстворисоватьграфика
  • какиспользоватьQGraphicsItemи Чторебенокдобрый Приходитьуправлятьграфикапроект
  • какиспользоватьQGraphicsViewПроверятьQGraphicsScene
  • Как развить усиление,уменьшить масштабкидругойизображениередактироватьи Проверять Функция

сцена-вид-проект Архитектура

Как упоминалось во введении, Qt серединаиз Графический видрамка (или, сокращенно от теперь существует Qt) Воле, возможно, придется обрабатывать графику, связанную с объектами, разделенными на три основные добрые категории, а именно сцена, видипроект. Qt Содержит очень привлекательные имена, издобрый, к которому относится эта изкаждая часть архитектуры. Хотя теоретически их легко отделить друг от друга, на практике они переплетаются между собой. Это означает, что мы не можем углубиться в один из них, не упомянув другие. Уберите архитектуру частично и у Вас Воля вообще не будет графики. Также, взглянув еще раз на архитектуру, мы увидим, что модель видшаблон проект, в котором модель (существовать в данном случае всцена) совершенно не представляет, как и какую часть показывать. каксуществовать Qt середина Место说из,Даодин种база Впроектиз Модель-видпрограммированиеметод,Мы, Воля, помним об этом,в то же времявозвращатьсяхотеть简хотетьпредставлятьодин Внизэто们серединаиз每одинсуществовать实践серединаиззначение:

  • сценаилиQGraphicsSceneуправлятьпроектилиQGraphicsItemиз Пример(Чторебенокдобрый),включить их,и Волясобытие(Например,щелчки мыши и т. д.) передаются в проект.
  • видилиQGraphicsViewвиджетиспользовать ВМожет视изменятьипоказыватьQGraphicsSceneизсодержание。 этовозвращаться Ответственный Волясобытие传播приезжатьQGraphicsScene。 здесь важно обратить внимание на даQGraphicsSceneиQGraphicsViewВсеиметь Нет同изсистема координат。 Можно догадаться, что если увеличение и уменьшение масштаба будут разными и будет выполнено аналогичное преобразование, то верхнее положение сцены будет другим. QGraphicsSceneиQGraphicsViewВсепоставлять Понятно Конвертировать彼этот Подходящийиз Кусочекнаборценитьиз Функция。
  • ЭтипроектилиQGraphicsItemребенокдобрыйиз ПримердаQGraphicsSceneсередина Включатьизпроект。 это们Можеткда Проволока,прямоугольник,изображение,текстждать.

Начнем с простого введения, а затем перейдем к подробному обсуждению вышеизложенного:

  1. СоздайтеимядляGraphics_Viewerиз Qt Widgets приложение,добрыйпохожий Всуществовать Нет. 4 глава,“MatиQImage”серединасоздаватьизпроект,кучитьсясвязанныйсуществовать Qt Отображение информации об изображении в формате . Но да, на этот раз просто добавь к нему «Графический». вид из окна виджет без каких-либо Этикетка, меню, состояние ожидания в баре. Воля ЧтоobjectNameсвойствобронироватьдляgraphicsView
  2. Кроме того, добавьте ту же функцию перетаскивания, что и раньше. как упоминалось ранее,ты需хотетьсуществоватьMainWindowдобрыйсерединадобавить вdragEnterEventиdropEvent。 и Нетхотеть忘记ВоляsetAcceptDropsдобавить вMainWindowдобрыйизструктураустройствосередина。 очевидно,на этот раз,ты需хотетьудалитьиспользовать ВсуществоватьQLabelначальствонастраиватьQPixmapизкод,Потому что в проекте нет Этикетки.
  3. сейчассуществовать,Волянеобходимыйпеременнаядобавить вmainwindow.hсерединаMainWindowдобрыйизчастныйчленчасть,Как показано ниже:
Язык кода:javascript
копировать
        QGraphicsScene scene; 

sceneпо сутиданас Воляиспользоватьипоказыватьсуществоватьдобавить вMainWindowдобрыйизQGraphicsViewвиджетсерединаизсцена。 最有Может能изда,ты需хотетьдля Местоиспользоватьизкаждыйдобрыйдобавить водин#includeзаявление,Дакодредактироватьустройство Не могущийидентифицироватьиз。 Вы также получаете эту связанную ошибку изкомпилятора, которая обычно может быть хорошим напоминанием нам о необходимости забыть о Воле, которая содержит существование издоброго. Итак, с этого момента убедитесь, что вы Qt добрыйдобавить водиндобрыйпохожий Вк Внизсодержаниеиз#includeобратитесь к令。 Да,Если определенный предмет должен быть доступен, необходимы какие-либо специальные меры.,но Волясуществовать Книгасередина明确иллюстрировать:

Язык кода:javascript
копировать
        #include <QGraphicsScene> 
  1. Следующий,нас需хотетьубеждатьсянасизgraphicsViewверно象Можеткдоступсцена。 Ты можешькпроходитьсуществоватьMainWindowструктураустройствосерединадобавить вк Вниз ХОРОШОПриходитьвыполнить. (шаг 5 послеиз ХОРОШО。)
  2. кроме того,ты需хотетьдляgraphicsView禁использоватьacceptDrops,потому чтодлянас希望можетбронировать放наборсуществоватьокно各处изизображение. поэтому,пожалуйстаубеждатьсятыизMainWindowструктураустройствотолько Включатьк Внизфункция调использовать:
Язык кода:javascript
копировать
        ui->setupUi(this); 
        this->setAcceptDrops(true); 
        ui->graphicsView->setAcceptDrops(false); 
        ui->graphicsView->setScene(&scene); 
  1. Следующий,существоватьначальствоодин ПримерпроектизdropEventфункциясередина,наснастраивать Этикеткаизpixmapsсвойство,на этот раз,нас需хотетьубеждатьсясоздавать ПонятноQGraphicsItemи Воля Чтодобавить всценасередина,или ВОЗесли быть точнымдаQGraphicsPixmapItem。 Это можно сделать двумя способами, давайте рассмотрим один:
Язык кода:javascript
копировать
        QFileInfo file(event 
               ->mimeData() 
               ->urls() 
               .at(0) 
               .toLocalFile()); 
        QPixmap pixmap; 
        if(pixmap.load(file 
               .absoluteFilePath())) 
        { 
          scene.addPixmap(pixmap); 
        } 
        else 
        { 
         // Display an error message 
        } 

существуют В этом случае,настолькоиспользовать ПонятноQGraphicsSceneизaddPixmapфункция. кроме того,нас МожетксоздаватьQGraphicsPixmapItemииспользоватьaddItemметод Воля Чтодобавить всценасередина,Как показано ниже:

Язык кода:javascript
копировать
         QGraphicsPixmapItem *item =  
            new QGraphicsPixmapItem(pixmap); 
         scene.addItem(item); 

существуют в обоих случаях,Не нужно беспокоиться об указателе проекта.,потому чтодлясуществовать调использоватьaddItemчассцена Воляиметьэтоизвсе权,исцена会с动от Внутри存середина清除。 конечно,еслинасхотеть Руководствоотсценаи Внутри存середина完全удалить Долженпроект,нас Можеткписатьодин Простойизdeleteзаявление Приходитьудалить Долженпроект,Как показано ниже:

Язык кода:javascript
копировать
        delete item; 

В нашем простом коде есть большая проблема, которая не видна на первый взгляд, но если мы продолжим перетаскивать изображения Воля в окно, каждый раз Воля будет добавлять последнее изображение. на предыдущем изображении сверху и не очищайте предыдущее изображение. на самом деле,Если ты попробуешь это сам,Даонхорошая идея。 Да,первыйсуществоватьписатьaddItemиз ХОРОШОпоследобавить вк Вниз ХОРОШО:

Язык кода:javascript
копировать
        qDebug() << scene.items().count(); 

Вам необходимо скачать заголовочный файл добавить вmainwindow.hдокументсередина,Этот файл будет работать:

Язык кода:javascript
копировать
        #include <QDebug>

сейчассуществовать,еслитыбегать Долженприложениеипытатьсяпроходить Воля Что拖放приезжатьокносередина Приходитьдобавить визображение,ты заметишь,существующий код Qt Creator сохраняется внизу экрана и на панели «Вывод приложения».,каждый раз放наборизображениечас,Отображаемое число увеличивается,Прямо сейчасsceneсерединаitemsизcount

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-VUI92ekQ-1681869945444) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/1281f635-ff2b-4d8e-b4be-cb19736c9575.png)]

Как показано в приведенном выше примере,использоватьqDebug()дамного Qt Разработчики используют существующие методы для быстрого просмотра значений определенных переменных во время разработки. Qt серединаизqDebug()даиstd::coutдобрыйпохожийиз Игрушка,использовать Ввыходприезжать控制台(или Терминал)。 Мы Волясуществовать Нет. 10 глава,“отлаживатьитест”серединаучиться Болеесвязанныйтестиотлаживатьизинформация,носейчассуществовать,让нас记ВнизqDebug()ииспользоватьэто Приходитьбыстрый解决к Внизвопрос。 насиспользовать Qt и C++ руководитьразвиватьчасизкод.

  1. поэтому,Чтобы решить проблему, упомянутую в примере ранее,насочевидно需хотеть先верноclearиsceneруководитьдобавить в。 поэтому,Толькосуществовать调использоватьлюбойaddItem(илиaddPixmapждать)Извпереддобавить вк Внизсодержание:
Язык кода:javascript
копировать
        scene.clear(); 

Попробуйте приложение еще раз и посмотрите результаты. Теперь, после помещения Воля в окно нашего приложения, должно остаться только существующее изображение. кроме того,记Вниз Приложениевыход,ты Воля Видетьпоказыватьизценитьвсегдадля1,Дапотому чтодлясуществоватьлюбойчас候sceneсерединавсегда Толькобронироватьодинизображение. существование Мы только что видели из Примерпроекта, мы используем Qt из Графический Все существующие основные части из видрамки, а именно сцена, проективид. Сейчас существуют, мы Воля подробно изучаем этот добрый, в то же время, для нас комплексное изкомпьютерное зрениеприложениеComputer_Visionпроектсоздавать强большойизграфика Зрительиредактироватьустройство。

сцена,QGraphicsScene

этотдобрыйпоставлять Понятноиметь дело смногоиндивидуальныйграфикаэлемент(QGraphicsItem)необходимыйиз几乎всеметод,Прямо сейчасделатьсуществоватьвперед面из Примерсерединанастолько Воля ЧтоиодининдивидуальныйQGraphicxPixmapItemодин起использовать。 В этом разделе мы рассмотрим некоторые из наиболее важных функций доброго. Как упоминалось ранее, наша Воля основное внимание уделяет в случаях использования требуются изсвои методы, поскольку for охватывает все методы (хотя все они важны) для для целей этой книги напрасно. нас ВоляперепрыгниQGraphicsSceneизструктураустройство,Потому что они доступны только в размерах «производитель» и «производитель» соответственно. Что касается остальных методов исвоства.,Сразусуществоватьздесь,для Некоторые из них могут быть неочевидны из Пример,Вы можете найти простой код из Пример,Можеткиспользоватькнига章вперед面создаватьизGraphics_Viewerпроектруководитьпытаться :

  • addEllipse,addLine,addRectиaddPolygonфункция Можеткотэто们изимясередина猜测出Приходить,Можеткиспользовать Приходить Ксценадобавить в Универсальныйиз几何форма。 Некоторые из них обеспечивают перегрузку для облегчения ввода параметров. создаватьидобавить всценачас,вышекаждыйфункция Все会возвращаться ЧтоверноотвечатьизQGraphicsItemребенокдобрый Пример(нравиться Вниз Место示)。 Возвращенный указатель можно сохранить, можно использовать для изменения, удаления или других способов использования проекта:
    • QGraphicsEllipseItem
    • QGraphicsLineItem
    • QGraphicsRectItem
    • QGraphicsPolygonItem

Даон例ребенок:

Язык кода:javascript
копировать
        scene.addEllipse(-100.0, 100.0, 200.0, 100.0, 
                QPen(QBrush(Qt::SolidPattern), 2.0), 
                QBrush(Qt::Dense2Pattern)); 

        scene.addLine(-200.0, 200, +200, 200, 
              QPen(QBrush(Qt::SolidPattern), 5.0)); 

        scene.addRect(-150, 150, 300, 140); 

        QVector<QPoint> points; 
        points.append(QPoint(150, 250)); 
        points.append(QPoint(250, 250)); 
        points.append(QPoint(165, 280)); 
        points.append(QPoint(150, 250)); 
        scene.addPolygon(QPolygon(points)); 

Давперед面кодизрезультат:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-9pcP6EGK-1681869945444) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/6011fe12-5460-4f62-bb9f-87e21929ade9.png)]

  • addPathфункция Можетиспользовать ВВоляQPainterPathи Давать定изQPenиQBrushдобавить всценасередина。 QPainterPathдобрый Можетиспользовать В记录绘画действовать,добрыйпохожий ВнассуществоватьQPainterсередина Видетьиздействовать,И существоватьк после их использования. с другой стороны,QPenиQBrushдобрыйиметь Нет言с明иззаголовок,носуществоватькнига章назад面из Примерсерединанастакже Воляиспользоватьэто们。 addPathфункциявозвращатьсяодинобратитесь к КновыйсоздаватьизQGraphicsPathItemПримеризобратитесь к针。
  • addSimpleTextиaddTextфункция Можетиспользовать ВВолячистыйтекстиприносить Форматизтекстдобавить всценасередина。 это们分Невозвращатьсяобратитесь к КQGraphicsSimpleTextItemилиQGraphicsTextItemизобратитесь к针。
  • существоватьначальствоодин Примерсерединауже经использовать ПроходитьизaddPixmapфункция Можетиспользовать ВВоляизображениедобавить всцена,иэтовозвращатьсяобратитесь к КQGraphicsPixmapItemдобрыйизобратитесь к针。
  • addItemфункциятолькоприниматьлюбойQGraphicsItemребенокдобрыйи Воля Чтодобавить всценасередина。 Мы, существующие впереди из Примера, также используем эту функцию.
  • addWidgetфункция Можетиспользовать ВВоля Qt виджетдобавить всцена。 除Понятнонекоторый特殊извиджет(Прямо сейчаснастраивать ПонятноQt::WA_PaintOnScreenлоготипизвиджетилииспользоватьвнешний Библиотека(НапримерOpenGLилиActive-Xрисоватьизвиджет))снаружи,Так же вы можете к Воля любой другой виджетдобавить всцену,Сразукартина Воля Чтодобавить То же, что и во Всцене. окно. Этот интерактивный графический элемент дляиспользования создателя сцены предлагает огромную мощь. Вы определенно можете киспользовать его, создавать простые игры, добавлять выполнение определенных операций над изображениями, изкнопкак и многие другие функции. нас ВолясуществоватьComputer_Visionпроектсерединабольшой量использоватьэтот Пример,И предоставьте достаточно из Примерприйти на помощь, чтобы начать работу.,Дасейчассуществовать Даонкороткийиз Пример:
Язык кода:javascript
копировать
        QPushButton *button = new QPushButton(Q_NULLPTR); 
        connect(button, SIGNAL(pressed()), this, SLOT(onAction())); 
        button->setText(tr("Do it!")); 
        QGraphicsProxyWidget* proxy = scene.addWidget(button); 
        proxy->setGeometry(QRectF(-200.0, -200, 400, 100.0)); 

вперед面изкод Толькодадобавить в ПонятноодинзаголовокдляDo it!изкнопка,и Воля ЧтосоединятьприезжатьимядляonActionизслот。 в любое времяв соответствии с Внизсценасерединаизэтоткнопкачас,Сразу会调использоватьonActionфункция. То же самое происходит и при добавлении кнопки в окно:

  • setBackgroundBrush,backgroundBrush,setForegroundBrushиforegroundBrushфункцияпозволятьдоступ Ответственный刷刷сценаизbackgroundиforegroundизQBrushдобрый.
  • fontиsetFontфункция Можетиспользовать ВполучатьилинастраиватьQFontдобрый,к Конечносценасерединаиспользоватьизшрифт。
  • Когда мы хотим определить минимальный размер, чтобы определить, подходит ли элемент для рисования (рендеринга),minimumRenderSizeиsetMinimumRenderSizeфункция Нет常有использовать。
  • sceneRectиsetSceneRectфункция Можетиспользовать Вобратитесь к定сценаизграницапрямоугольник。 По сути, это означает сценуиз ширины и высоты, к и ее существование и положение з Кусочек в системе координат. Важная изда, на которую стоит обратить внимание,если未调использоватьsetSceneRectилисуществоватьQGraphicsSceneизструктураустройствосередина未настраиватьпрямоугольник,но调использоватьsceneRectВолявсегдавозвращаться Можетккрышкадобавить сценаиз Самый большой прямоугольник из всех проектов. всегдабольшинствонастраиватьодинсценапрямоугольник,и другие операции по мере необходимости существующая сцена руководит любыми изменениями,по сутив соответствии с需хотеть Руководство(использоватьsetSceneRect)сноваверно Чторуководитьнастраивать。
  • stickyFocusиsetStickyFocusфункция Можетиспользовать В启использоватьили禁использоватьсценаизлипкий фокусмодель。 Если включен фиксированный фокус, нажатие на сцену из пустой области не повлияет на фокус изпроекта; В противном случае Воля только очистит фокус, и выбранный изпроект больше не будет выбран.
  • collidingItemsдаон Нет常интересныйиз Функция,Можетиспользовать ВПростой地Конечно某элементданетидругойлюбойэлемент共享Чтообластьиз某индивидуальныйчасть(или Столкновение происходит)。 ты需кQGraphicsItemобратитесь к针иQt::ItemSelectionModeодин起передача,ты Воляполучатьипроектпроисходит конфликтизQGraphicsItemПримеризQList
  • createItemGroupиdestroyItemGroupфункция Можетиспользовать ВсоздаватьиудалитьQGraphicsItemGroupдобрый Пример。 QGraphicsItemGroupпо сутида另одинQGraphicsItemребенокдобрый(нравитьсяQGraphicsLineItemждать),Можетиспользовать ВВоляодин Группаграфикаэлемент Группаипоэтомувыражатьдляодининдивидуальныйэлемент。
  • hasFocus,setFocus,focusItemиsetFocusItemфункциявсеиспользовать Виметь дело сграфикасценасерединатекущийфокусизпроект。
  • возвращатьсяиsceneRect.width()иsceneRect.height()такой жеценитьизwidthиheightМожетиспользовать Вполучатьсценаизширинаивысокийстепень. пожалуйста务必Уведомление,Этифункциявозвращатьсяизценитьизтипдляqreal(По умолчаниюиdoubleтакой же),Вместо того, чтобы даinteger,Потому что координаты сцены существуют попиксельно, не работает. Если только сипользоватьвид нарисует сцену,в противном случае Воля Чтоначальствоизвсесодержание Все视длялогикаи Нет视觉верно象,Вместо того, чтобы да视觉верно象,ДаQGraphicsViewдобрыйизполе。
  • существуют в некоторых случаях,иupdate()такой жеизinvalidateМожетиспользовать Впожалуйста求всеиличасть重绘сцена。 добрый аналогичен функции обновления.
  • itemAtфункция Можетиспользовать Всуществоватьсценасерединаиз某индивидуальный Кусочекнабороказатьсяобратитесь к КQGraphicItemизобратитесь к针。
  • itemвозвращатьсядобавить список всценаизпроектов. по сутидаQGraphicsItemизQList
  • itemsBoundingRectМожетиспользовать ВполучатьQRectFдобрый,илитолькополучать Может Включатьсценасерединавсепроектизсамый маленькийпрямоугольник。 Эта функция особенно полезна, если нам нужно увидеть, как все проекты выполняют добрый похожие операции.
  • mouseGrabberItemМожетиспользовать Вполучатьтекущийщелкнутьизпроект,и Незачем释放мышькнопка。 этотфункциявозвращатьсяодинQGraphicsItemобратитесь к针,использовать К сцене легко добавить функциональность «перетаскивания» или типа «добрый».
  • removeItemфункция Доступно для использования со сценысерединаудалитьпроект。 Эта функция не удалит проект, и вызывающая сторона несет ответственность за всю необходимую очистку.
  • renderМожетиспользовать В渲染QPaintDeviceначальствоизсцена。 Это да означает Вы можете использоватьQPainterдобрый(нравитьсятысуществовать Нет. 4 глава,“MatиQImage”серединаизучатьиз)существоватьQImage,QPrinterждатьдобрыйпохожийверно象начальстворисоватьсцена,проходить ВоляQPainterдобрыйизобратитесь к针передача Даватьэтотфункция. (Необязательно) Ваше место найти вQPaintDevice渲染глаз标добрыйизчастьначальство渲染сценаизчасть,ивозвращатьсяхотеть Уведомление Ширинавысокий Сравниватьизиметь дело с。
  • когдаselectedItems,selectionAreaиsetSelectionAreaфункцияобъединитьиспользоватьчас,Можеткпомощьиметь дело содинилимногоиндивидуальныйвыбор проекта。 проходитьпоставлятьQt::ItemSelectionModeперечислять,Мы можем выбрать коробку на основе полной выборки или только ее частичной выборки.,ждатьждать. насвозвращаться Можеткдля ДолженфункцияпоставлятьQt::ItemSelectionOperationперечислятьвход,Добавлена ​​выборка или заменяет все предыдущие выборки изпроекта.
  • sendEventфункция Можетиспользовать ВВоляQEventдобрый(илиребенокдобрый)发送приезжатьсценасерединаизпроект。
  • styleиsetStyleфункцияиспользовать Внастраиватьиполучатьсценастиль。
  • updateфункция Можетиспользовать В重绘частьиливсесцена。 когдасценаиз视觉часть发生изменятьчас,большинство ВоляэтотфункцияиQGraphicsSceneдобрыйпроблемаизизменять Сигналобъединитьиспользовать。
  • viewsфункция Можетиспользовать ВполучатьQListдобрый,Чтосередина Включатьиспользовать Впоказывать(или Проверять)этотсценаизQGraphicsViewВиджеты.

В дополнение к ранее существовавшим методам,QGraphicsSceneпоставлять Понятномноговиртуальный拟функция,Можетиспользовать Вдальшесопределениеи УсиливатьQGraphicsSceneдобрыйиз ХОРОШОдляки Появление。 Поэтому и любой другой добрый подобен из C++ добрыйодин样,ты需хотетьсоздаватьQGraphicsSceneизребенокдобрый,и Толькодобавить в Этивиртуальный拟функцияиз实сейчас Прямо сейчас Может。 на самом деле,ДаиспользоватьQGraphicsSceneдобрыйизоптимальныйметод,Он обеспечивает большую гибкость:

  • МожетккрышкаdragEnterEvent,dragLeaveEvent,dragMoveEventиdropEventфункция,к Ксценадобавить в拖放Функция。 Обратите внимание, что это связано с из очень похоже на то, что было сделано ранее в Примере путем перетаскивания изображения Воли в окно. Каждое из этих событий предоставляет достаточно информации и параметров для обработки всего процесса перетаскивания.
  • Если нам нужно добавить пользовательский фонили внешний вид по всей сцене.,ноотвечатькрышкаdrawBackgroundиdrawForegroundфункция. конечно,для простых и фонили задач по рисованию или раскрашиванию переднего плана,нас Можетк Простой地调использоватьsetBackgroundBrushиsetForegroundBrushфункция,И пропустите эти функции.
  • mouseDoubleClickEvent,mouseMoveEvent,mousePressEvent,mouseReleaseEventиwheelEventфункция Можетиспользовать Виметь дело ссценасерединаиз Нет同мышьсобытие。 Например,когданассуществоватьComputer_Visionпроектсерединадлясценадобавить в放большойиуменьшить масштаб Функциячас,Волясуществоватькнига章позжеиспользоватьwheelEvent
  • Можетккрышкаeventкиметь дело ссцена接收приезжатьизвсесобытие。 этотфункцияпо сути Ответственный Волясобытие调度приезжать Что Взаимноотвечатьизпроцессор,Даэтотакже Можеткиспользовать Виметь дело ссопределениесобытиеили Нетиметьудобный捷Функция изсобытие,Напримервперед面упомянулизвсесобытие。

Как и все уроки, которые вы усвоили до сих пор, несмотря ни на что Qt Ну давай же OpenCV середина,книга Книгасередина Предоставить изметод,свойствоифункцияиз Список表Все Нетотвечатьодеяло视для Должендобрый各индивидуальныйаспектизвесь Список表。 Лучший общий документ по использованию рамок для изучения новых функций. Но да, цель описания в этой книге проще, особенно да из компьютерного зрение Разработчик с точки зрения.

проект,QGraphicsItem

Дасценасерединарисоватьизвсепроектизбазадобрый. Он содержит различные методы исвоства для обработки рисования каждого проекта, обнаружения столкновений (и других проектов), обработки щелчков мыши и других событий и т. д. ожидания. Даже если вы можете к Воля его добрый субреддит и создать свой собственный графический элемент, Qt Также будет предоставлен набор дополнительных модулей, которые можно использовать для большинства, если не для всех, повседневных графических задач. Ниже приводится Этиребенокдобрый,существоватьвперед面из Примерсерединауже经直接иликосвенныйиспользовать Понятно Этиребенокдобрый:

  • QGraphicsEllipseItem
  • QGraphicsLineItem
  • QGraphicsPathItem
  • QGraphicsPixmapItem
  • QGraphicsPolygonItem
  • QGraphicsRectItem
  • QGraphicsSimpleTextItem
  • QGraphicsTextItem

как упоминалось ранее,QGraphicsItemпоставлять Понятномногофункцияисвойство Приходитьиметь дело сграфикаприложениесерединаизвопроси Задача。 существоватькнига节середина,нас ВоляпредставлятьQGraphicsItemсередина Некоторый最重хотетьизчлен,Этичленпоэтому Можеткпроходить熟悉вперед面упомянулизребенокдобрыйприйти на помогите нам:

  • acceptDropsиsetAcceptDropsфункция Можетиспользовать Вделатьпроектпринимать拖放событие。 Обратите внимание, что это связано снассуществоватьвперед面из Примерсерединауже经Видетьиз拖放событие Нет常Взаимнопохожий,Даздесьизхозяинхотетьокруг Недапроекткнига身Можеткидентифицировать拖放событие。
  • acceptHoverEvents,setAcceptHoverEvents,acceptTouchEvents,setAcceptTouchEvents,acceptedMouseButtonsиsetAcceptedMouseButtonsфункциявсеиметь дело спроект交互и Чтоверномышьщелкнутьиз响отвечатьждать. здесь важно обратить внимание на да,одинпроект Можеткв соответствии сQt::MouseButtonsперечислятьнастраивать Приходить响отвечатьили忽略Нет同измышькнопка。 Даон Простойиз例ребенок:
Язык кода:javascript
копировать
        QGraphicsRectItem *item = 
           new QGraphicsRectItem(0, 
                                 0, 
                                 100, 
                                 100, 
                                 this); 
        item->setAcceptDrops(true); 
        item->setAcceptHoverEvents(true); 
        item->setAcceptedMouseButtons( 
                Qt::LeftButton | 
                Qt::RightButton | 
                Qt::MidButton); 
  • boundingRegionфункция Можетиспользовать ВполучатьописыватьграфикаэлементобластьизQRegionдобрый. Даодинэлемент Нет常重хотетьизфункция,Поскольку для его использования необходимо нарисовать (или перерисовать) проект точной области.,иипроектизграницапрямоугольник Нет同,потому чтодля Проще говоря,Долженпроект Может能толькокрышка Чтограницапрямоугольникизчасть,Например, ожидание по прямой.,См. «Пример».
  • существоватьвычислитьпроектизboundingRegionфункциячас,boundingRegionGranularityиsetBoundingRegionGranularityфункция Можетиспользовать Внастраиватьиполучатьдетализация级Не。 В этом смысле,детализацияда0и1Из间из实число,Это соответствует ожидаемому уровню детализации при расчете:
Язык кода:javascript
копировать
        QGraphicsEllipseItem *item = 
            new QGraphicsEllipseItem(0, 
                                     0, 
                                     100, 
                                     100); 
        scene.addItem(item); 
        item->setBoundingRegionGranularity(g); // 0 , 0.1 , 0.75 and 1.0 
        QTransform transform; 
        QRegion region = item->boundingRegion(transform); 
        QPainterPath painterPath; 
        painterPath.addRegion(region); 
        QGraphicsPathItem *path = new QGraphicsPathItem(painterPath); 
        scene.addItem(path); 

существоватьвперед面изкодсередина,если Воляgзаменятьдля0.0,0.1,0.75и1.0,но会得приезжатьк Внизрезультат。 очевидно,0изценить(по умолчаниюдетализация)привести кодининдивидуальныйпрямоугольник(границапрямоугольник),Это не точная оценка. По мере увеличения уровня,нас得приезжать Понятнокрышкаграфикаформаипроектизболее точныйизобласть(по сутидапрямоугольникнабор):

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-kNTRDeFF-1681869945444) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/18f48d84-95e0-4fd4-9869-ec1c63d52f8c.png)]

  • childItemsфункция Можетиспользовать Вполучатьнаполнение有QGraphicsItemдобрыйизQList,Этидобрыйдаэтотэлементизребенок级。 Воля Они рассматривают «Д» как более сложный проект.
  • childrenBoundingRect,boundingRectиsceneBoundingRectфункция Можетиспользовать ВПоискQRectFдобрый,Чтосередина Включать Долженпроектизребенокbounding rect,Сам проект исценен.
  • clearFocus,setFocusиhasFocusфункция Можетиспользовать Вудалить,настраиватьиполучать Долженпроектизфокуссостояние。 изпроект с фокусом получает события клавиатуры.
  • collidesWithItem,collidesWithPathиcollidingItemsфункция Можетиспользовать В检查этотпроектданетилюбой Давать定проектпроисходит конфликт,к И коллизионный список проектиизпроектов.
  • containsфункцияполучатьодинточкаиз Кусочекнабор(если быть точнымдаQPointFдобрый),Затем检查этотэлементданет Включать Долженточка。
  • cursor,setCursor,unsetCursorиhasCursorфункциядлянастраивать,получатьи Выбирать消настраиватьэтотэлементизидентификациямышь光标типочень有использовать。 Вы также можете найти В проекте проверьте, есть ли какие-либо настройки курсора, прежде чем снимать их. После установки, если курсор мыши навести на существующий проект, форма курсора изменится на для.
  • hide,show,setVisible,isVisible,opacity,setOpacityиeffectiveOpacityфункциявсеитовариз Может见секс(и Нетпрозрачный度)связанный。 все Этифункция Всеиметь Нет言с明изимя,唯одинценить得УведомлениеиздаeffectiveOpacity,Это может быть то же самое, что и непрозрачность этого элемента.,Потому что для этого да рассчитывается на основе элемента и уровня его непрозрачности. финальный,effectiveOpacityдаиспользовать Всуществовать Экранначальстворисовать Долженпроектиз Нетпрозрачный度级Не。
  • flags,setFlagsиsetFlagфункция Можетиспользовать Вполучатьилинастраиватьэтотэлементизлоготип。 проходитьлоготип,наспо сутидаобратитесь кQGraphicsItem::GraphicsItemFlagперечислятьсередина各элементизкомбинация。 Даон Примеркод:
Язык кода:javascript
копировать
        item->setFlag(QGraphicsItem::ItemIsFocusable, true); 
        item->setFlag(QGraphicsItem::ItemIsMovable, false);

Важная изда, на которую стоит обратить внимание,когданасиспользоватьsetFlagфункциячас,Все киззнаки состояния будут сохранены.,иэтотфункциясерединатолькоодинлоготип会кприезжать影响。 Да,когданасиспользоватьsetFlagsчас,по сутивселоготип Все会в соответствии с Давать定излоготипкомбинацияруководить重набор。

  • Когда мы хотим изменить получение событий мыши и клавиатуры и зпроект из сцены,grabMouse,grabKeyboard,ungrabMouseиungrabKeyboardметодочень有использовать。 По-видимому, реализация по умолчанию использования может захватывать только один проект за раз, если только другой граббер проектили сам не деформируется, не удаляется или не скрывается, в противном случае граббер Воля остается неизменным. каккнига章вперед面Место Видетьиз,насобщийда МожеткиспользоватьQGraphicsSceneдобрыйсерединаизmouseGrabberItemфункция Приходитьполучать抓Выбиратьустройствопроект。
  • setGraphicsEffectиgraphicsEffectфункция Можетиспользовать ВнастраиватьиполучатьQGraphicsEffectдобрый. Даон Нет常интересныйи易Виспользоватьизфункция,но мощный,Можетиспользовать ВКсценасерединаизпроект Добавитьфильтрустройствоили Эффект。 QGraphicsEffectда Qt Все графические эффекты в избазе добрый. Ты можешьк Воля Чторебенокдобрыйизменятьисоздаватьс己изграфика Эффектилифильтрустройство,также Можетктолькоиспользовать Предоставить из Qt Один из графических эффектов. В настоящее время Qt В добром есть несколько графических эффектов, которые вы можете попробовать сами:
    • QGraphicsBlurEffect
    • QGraphicsColorizeEffect
    • QGraphicsDropShadowEffect
    • QGraphicsOpacityEffect

Давайте посмотрим на пример пользовательского графического эффекта и используем его. Qt Познакомьтесь с этой концепцией поближе, используя графические эффекты:

  1. Вы можете использоватьнассуществоватькнига章вперед面создаватьизGraphics_Viewerпроект。 Толькосуществовать Qt Creator середина Открытьэто,ЗатемиспользоватьхозяинменюсерединаизNew FileилиProject,выбирать C++ и C++ добрый,ЗатемщелкнутьChooseкнопка。
  2. Следующий,убеждатьсявходитьQCustomGraphicsEffectделатьдлядобрыйимя。 выбиратьQObjectделатьдлябазадобрый,наконец选серединаInclude QObjectфлажок(если По умолчанию未选середина)。 Нажмите «Далее», а затем нажмите «Заканчиватькнопку».
  3. Затем,Воляк Внизincludeзаявлениедобавить вновыйсоздаватьизqcustomgraphicseffect.hдокументсередина:
Язык кода:javascript
копировать
        #include <QGraphicsEffect> 
        #include <QPainter>
  1. после,ты需хотетьубеждатьсянасизQCustomGraphicsEffectдобрыйнаследовать ПонятноQGraphicsEffectВместо того, чтобы даQObject。 убеждатьсяпервый Изменятьqcustomgraphicseffect.hдокументсерединаиздобрыйопределение ХОРОШО,Как показано ниже:
Язык кода:javascript
копировать
        class QCustomGraphicsEffect : public QGraphicsEffect
  1. Нам также необходимо обновить конструктор добрыйиз.,иубеждатьсясуществоватьнасиздобрыйструктураустройствосередина调использовать ПонятноQGraphicsEffectструктураустройство,в противном случае Воля出сейчаскомпиляторошибка。 поэтому,Изменятьqcustomgraphics.cppдокументсерединаиздобрыйструктураустройство,Как показано ниже:
Язык кода:javascript
копировать
      QCustomGraphicsEffect::QCustomGraphicsEffect(QObject *parent) 
         : QGraphicsEffect(parent) 
  1. Следующий,нас需хотеть实сейчасdrawфункция. по сути,Дапроходить实сейчасdrawфункция制делатьвсеQGraphicsEffectдобрыйиз Способ。 Поэтому Воляк в следующую строку кода добавьте вqcustomgraphicseffect.hдокументсерединаизQCustomGraphicsEffectдобрыйопределениесередина:
Язык кода:javascript
копировать
        protected: 
          void draw(QPainter *painter); 
  1. Затем нам нужно написатьактуальныйизэффекткод. В этом примере мы воля пишем простой пороговый фильтр, который устанавливает полностью черный или полностью белый цвет в зависимости от значения пикселя в оттенках серого. Хотя на первый взгляд код может показаться немного сложным, он лишь дополняет опыт, который мы уже изучили в предыдущих главах. ии,этоттакжедаиспользоватьQGraphicsEffectдобрыйписатьновый Эффектифильтрустройствоиз Простой程度из Простой Пример。 как вы видете,передача ДаватьdrawфункцияизQPainterдобрыйизобратитесь к针Можетиспользовать Всуществовать Эффектнеобходимыйиз Изменятьпосле Простой地верно Чторуководить Исправлятьирисовать:
Язык кода:javascript
копировать
        void QCustomGraphicsEffect::draw(QPainter *painter) 
        { 
          QImage image; 
          image = sourcePixmap().toImage(); 
          image = image.convertToFormat( 
                QImage::Format_Grayscale8); 
          for(int i=0; i<image.byteCount(); i++) 
          image.bits()[i] = 
                image.bits()[i] < 100 ? 
                    0 
                  : 
                    255; 
          painter->drawPixmap(0,0,QPixmap::fromImage(image)); 
        }
  1. наконец,нас Можеткиспользоватьновыйиз Эффектдобрый. Толькохотетьубеждатьсяэто Включатьсуществоватьmainwindow.hдокументсередина:
Язык кода:javascript
копировать
        #include "qcustomgraphicseffect.h" 
  1. Затем,проходить调использоватьпроектизsetGraphicsEffectфункция Приходитьиспользоватьэто。 существоватьнасизGraphics_Viewerпроектсередина,нас实сейчас ПонятноdropEvent。 Вы можете просто скачать фрагмент кода и добавить вdropEventфункциясередина,поэтому Воляиметьк Внизсодержание:
Язык кода:javascript
копировать
        QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap); 
        item->setGraphicsEffect(new QCustomGraphicsEffect(this)); 
        scene.addItem(item); 

еслисуществоватьбегатьприложениеи Воля Что放наборсуществовать Чтоначальствоизизображениечасвседействоватьвсеправильный Заканчивать,Вы, Воля, заметили наш пороговый эффект:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-wdefyDcB-1681869945444) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/cb0aa492-12bc-40b2-95bf-0bca6581bb29.png)]

существоватьнасиспользоватьсопределениеграфика Эффектизнаконецодин步середина,пытатьсяиспользоватьлюбой Qt Предоставить из ЭффектиздобрыйимязаменятьQCustomGraphicsEffect,Затем亲с检查результат。 как вы видете,Они предлагают большую гибкость с точки зрения графических эффектов и концепций.

сейчассуществовать,让наспродолжатьруководитьQGraphicsItemдобрыйсерединаиз Что余функцияисвойство:

  • Когда мы хотим, чтобы Воля проектдобавить в Группасерединаилиполучать Включать Долженпроектиз Группадобрыйчас,groupиsetGroupфункция Нет常有использовать,Толькохотеть Долженпроект属Влюбой Группа。 QGraphicsItemGroupда Ответственныйиметь дело с Группаиздобрый,Точно так же, как вы узнали ранее в этой главе.
  • isAncestorOfфункция Можетиспользовать В检查Долженпроектданетдлялюбой Давать定другойпроектизродитель(илиродительизродитель,По этому добрый толчок).
  • МожеткнастраиватьsetParentItemиparentItemи Поисктекущийпроектизотецпроект。 одинпроект Может能根книга没有любойродитель,существуют В этом случае,parentItemфункция Волявозвращаться零。
  • isSelectedиsetSelectedфункция Можетиспользовать ВИзменятьпроектиз Место选модель。 ЭтифункцияиsetSelectionAreaитысуществоватьQGraphicsSceneдобрыйсерединаучитьсяиздобрыйпохожийфункциятесно связанный。
  • mapFromItem,mapToItem,mapFromParent,mapToParent,mapFromScene,mapToScene,mapRectFromItem,mapRectToScene,mapRectFromParent,mapRectToParent,mapRectFromSceneиmapRectToSceneфункция , все эти функции даже более удобны из-за функции перегрузки, образуя длинный список функций, эти функции используются из и Базовое сопоставление ли с его руководителем или другими словами может использоваться для преобразования координат сцены, другого или родительского объекта в сценуиз. 。 На самом деле, это довольно легко понять, если принять во внимание тот факт, что каждый отдельный проект и другие проекты не имеют к этому никакого отношения. первый,Пожалуйста, смотрите картинку ниже,Затем让насверно Чторуководить更подробныйизобсуждать:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-QxLI49nF-1681869945445) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/c52b657c-957b-46c3-af3b-b4a0f551c1d9.png)]

потому чтодлясценаВключатьвсепроект,Местокнасгипотезахозяинсистема координат(или世界система координат)дасценаизсистема координат。 на самом деле,Даонправильныйизгипотеза。 поэтому,проектсуществоватьсценасерединаиз Кусочекнаборценитьдля(A, B)。 такой же,родительсуществоватьсценасерединаиз Кусочекнабордля(D, E)。сейчассуществовать,это немного сложно,ребенок 1 существоватьродительсерединаиз Кусочекнаборценитьдля(F, G)。 добрыйпохожий地,ребенок 2 существоватьродительсерединаиз Кусочекнаборценитьдля(H, I)。 Очевидно, что если число родительиребенокиз увеличится и у нас Воля будут разные системы координат из лабиринта, существующего здесь, будет полезно упомянуть функцию отображения. вот некоторые Пример Состояние。 Вы можете использоватьк Этот фрагмент кода принадлежит следующему фрагменту кода, к Создайтесцена, который содержит изсценадбрий, подобный изпроекту, упомянутому ранее:

Язык кода:javascript
копировать
    QGraphicsRectItem *item = 
    new QGraphicsRectItem(0, 
                          0, 
                          100, 
                          100); 
    item->setPos(50,400); 
    scene.addItem(item); 
    QGraphicsRectItem *parentItem = 
        new QGraphicsRectItem(0, 
                              0, 
                              320, 
                              240); 
    parentItem->setPos(300, 50); 
    scene.addItem(parentItem); 

    QGraphicsRectItem *childItem1 = 
        new QGraphicsRectItem(0, 
                              0, 
                              50, 
                              50, 
                              parentItem); 
    childItem1->setPos(50,50); 
    QGraphicsRectItem *childItem2 = 
        new QGraphicsRectItem(0, 
                              0, 
                              75, 
                              75, 
                              parentItem); 
    childItem2->setPos(150,75); 

    qDebug() << item->mapFromItem(childItem1, 0,0); 
    qDebug() << item->mapToItem(childItem1, 0,0); 
    qDebug() << childItem1->mapFromScene(0,0); 
    qDebug() << childItem1->mapToScene(0,0); 
    qDebug() << childItem2->mapFromParent(0,0); 
    qDebug() << childItem2->mapToParent(0,0); 
    qDebug() << item->mapRectFromItem(childItem1, 
                                  childItem1->rect()); 
    qDebug() << item->mapRectToItem(childItem1, 
                                childItem1->rect()); 
    qDebug() << childItem1->mapRectFromScene(0,0, 25, 25); 
    qDebug() << childItem1->mapRectToScene(0,0, 25, 25); 
    qDebug() << childItem2->mapRectFromParent(0,0, 30, 30); 
    qDebug() << childItem2->mapRectToParent(0,0, 25, 25); 

пытатьсясуществовать Qt Creator и Qt Widgets проектсерединабегатьвперед面изкод,Вы увидите следующее содержимое на панели вывода вашего приложения Волясуществовать Qt Creator из приложения.,этотпо сутидаqDebug()заявлениеизрезультат:

Язык кода:javascript
копировать
    QPointF(300,-300) 
    QPointF(-300,300) 
    QPointF(-350,-100) 
    QPointF(350,100) 
    QPointF(-150,-75) 
    QPointF(150,75) 
    QRectF(300,-300 50x50) 
    QRectF(-300,300 50x50) 
    QRectF(-350,-100 25x25) 
    QRectF(350,100 25x25) 
    QRectF(-150,-75 30x30) 
    QRectF(150,75 25x25) 

Попробуем увидеть результат, выдаваемый инструкцией Нет.из:

Язык кода:javascript
копировать
    item->mapFromItem(childItem1, 0,0); 

itemсуществоватьсценасерединаиз Кусочекнабордля(50, 400),childItem1существоватьсценасерединаиз(50, 50)Кусочекнабор。 ДолжензаявлениесуществоватьchildItem1система координатсерединаиз Кусочекнабор(0, 0)и Воля Что Конвертироватьдляпроектизсистема координат。 Посмотрите и другие, иллюстрируйте себя по одному. Это очень просто, но очень удобно, когда мы хотим преобразовать существующую сцену изпроекта в перемещение или в сцену изпроектруководитьдобрый из:

  • moveBy,pos,setPos,x,setX,y,setY,rotation,setRotation,scaleиsetScaleфункция Можетиспользовать Вполучатьилинастраиватьпроектиз Нет同几何свойство。 интересныйизда,posиmapToParent(0,0)возвращатьсятакой жеизценить. Проверьте передний из Пример, затем внесите Воля в его добавление. в Пример кода приди и руководи попробуй.
  • transform,setTransform,setTransformOriginPointиresetTransformфункция Можетиспользовать Ввернопроектприложениеили Поисклюбой几何变换。 Важная изда, на которую стоит обратить внимание,все变换Всегипотезаодинисточник(в целомдля(0,0)),МожеткиспользоватьsetTransformOriginPointверно Чторуководить Изменять。
  • scenePosфункция Можетиспользовать Вполучатьпроектсуществоватьсценасерединаиз Кусочекнабор。 и调использоватьmapToScene(0,0)такой же。 Вы можете сами попробовать существование предыдущих из Пример руководить и сравнить результаты.
  • dataиsetDataфункция Можетиспользовать Внастраиватьи Поискпроектсерединаизлюбойсопределениеданные。 Например,нас Можеткиспользоватьэто Приходить存储настраиватьдляQGraphicsPixmapItemизизображениеизпуть,Пользователь хранит любую другую информацию, относящуюся к конкретному приложению.
  • zValueиsetZValueфункция Можетиспользовать ВИсправлятьи ПоискпроектизZценить. Zценить Решатьотвечатьсуществоватьдругойпроект Извпередрисовать哪些проект,По этой доброй рекомендации. иметьвышеZценитьизпроект ВолявсегдарисоватьсуществоватьиметьнижеZценитьизпроектначальство。

инассуществоватьQGraphicsSceneдобрыйсередина Видетьиздобрыйпохожий,QGraphicsItemдобрыйвозвращаться Включатьмногок保护извиртуальныйфункция,Эти функции могут быть переопределены,хозяинхотетьиспользовать Виметь дело спередачаприезжатьсценаэлементначальствоиз各种событие。 Ниже приводится Несколько важных и очень полезных из Пример:

  • contextMenuEvent
  • dragEnterEvent,dragLeaveEvent,dragMoveEvent,dropEvent
  • focusInEvent,focusOutEvent
  • hoverEnterEvent,hoverLeaveEvent,hoverMoveEvent
  • keyPressEvent,keyReleaseEvent
  • mouseDoubleClickEvent,mouseMoveEvent,mousePressEvent,mouseReleaseEvent,wheelEvent

вид,QGraphicsView

мы прибыли Qt серединаиз Графический видрамкаиз Последняя часть. QGraphicsViewдобрыйда Qt окновиджетдобрый,Можетк Воля Что放наборсуществоватьокноначальствокпоказыватьQGraphicsScene,Долженокнокнига身ВключатьмногоQGraphicsItemребенокдобрыйи/иливиджет. иQGraphicsSceneдобрый Взаимнопохожий,Добрый также предлагает большое количество функций.,Метод исвоства для обработки графики в части визуализации. Наш обзор Воли в следующем списке некоторых наиболее важных функций.,Затемнас ВоляизучатькакверноQGraphicsViewруководитьребенокдобрыйизменятьи Воля Что Расширятьдлясуществоватьнас Всестороннийкомпьютерное В приложении для визуализации есть несколько важных функций, таких как увеличение, уменьшение, выбор проектаждать. Следовательно, это данассуществоватькомпьютерное зрениепроектсередина需хотетьизQGraphicsViewдобрыйизметодичлен:

  • alignmentиsetAlignmentфункция Можетиспользовать Внастраиватьсценасуществоватьвидсерединаизверно齐Способ。 Важно отметить, что это имеет видимый эффект только тогда, когда его можно полностью отобразить, еще достаточно места и полосы прокрутки не нужны.
  • dragModeиsetDragModeфункция Можетиспользовать Вполучатьинастраиватьвидизтащитьмодель。 Давидиз最重хотетьфункция Изодин,это Можетк Решатьсуществоватьвидначальствощелкнутьитащитьмышь左键час会发生Что。 существуют ниже из Примера, мы Воляиспользовать его и по нему руководить полным обучением. нас ВоляиспользоватьQGraphicsView::DragModeперечислятьнастраивать Нет同изтащитьмодель。
  • isInteractiveиsetInteractiveфункцияпозволять Поиски Исправлятьвидиз交互ХОРОШОдля。 Интерактивная игра реагирует на мышь и клавиатуру (если она реализована), в противном случае все события мыши и клавиатуры игнорируются, и игру можно использовать только для просмотра и с ней нельзя взаимодействовать.
  • optimizationFlags,setOptimizationFlags,renderHints,setRenderHints,viewportUpdateModeиsetViewportUpdateModeфункция分Неиспользовать Вполучатьинастраиватьивидизпроизводительностьи Качество рендерингасвязанныйизпараметр。 Ниже из Примерпроекта мы «Волясуществовать» видим эти варианты использования функций на практике.
  • существоватьdragModeнастраиватьдляRubberBandDragмодельиз Состояние Вниз,МожеткиспользоватьrubberBandSelectionModeиsetRubberBandSelectionModeфункциянастраиватьвидизвыбор проектамодель。 Можеткнастраиватьк Внизсодержание,это们даQt::ItemSelectionModeперечислятьсерединаизвход:
    • Qt::ContainsItemShape
    • Qt::IntersectsItemShape
    • Qt::ContainsItemBoundingRect
    • Qt::IntersectsItemBoundingRect
  • sceneRectиsetSceneRectфункция Можетиспользовать Вполучатьинастраиватьвидсерединасценаиз Может视изменятьобласть。 очевидно,Долженценить Нет必иQGraphicsSceneдобрыйизsceneRectтакой же。
  • centerOnфункция Можетиспользовать Вубеждатьсяидентификацияточкаилипроект Кусочек Ввидсередина Сердце。
  • ensureVisibleфункция Можетиспользовать ВВолявид滚动приезжатьидентификацияобласть(иметь Давать定издопуск)кубеждатьсяэтосуществоватьвидсередина。 Эта функция подходит для точек, прямоугольников и графических проектов.
  • fitInViewфункцияиcenterOnиensureVisibleНет常Взаимнопохожий,Но главное отличие существования состоит в том, что,Долженфункциявозвращатьсяиспользовать Давать定из Ширинавысокий Сравниватьиметь дело спараметр Увеличитьвидизсодержаниек Подходящийвид。 пример:
    • Qt::IgnoreAspectRatio
    • Qt::KeepAspectRatio
    • Qt::KeepAspectRatioByExpanding
  • itemAtфункция Можетиспользовать Всуществоватьвидсерединаизидентификация Кусочекнабор Поискпроект。

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

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-FdAfdJek-1681869945445) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/fc1db2f4-4a0c-4eaf-b394-7c389c6fdf71.png)]

существоватьначальствокартинасередина,видизсередина Сердцеточкана самом деледасцена右начальство角из某индивидуальный Кусочекнабор。 видпоставлять Понятнодобрыйпохожийизкартографированиефункция(инассуществоватьпроектсередина Видетьизфункциятакой же),Можетк Волясценасистема координатсерединаиз Кусочекнабор Конвертироватьдлявидсистема координат,наоборот. здесь их,Плюс некоторые другие методы функций,существоватьпродолжать Извперед,нас需хотетьизучатьк Внизвид

  • mapFromSceneиmapToSceneфункция Можетиспользовать Всуществоватьсценасистема координат Из间Конвертировать Кусочекнабор。 ивперед面упомянулизодин致,mapFromSceneфункцияпринимать实числоивозвращатьсяцелое значение,иmapToSceneфункцияпринимать整числоивозвращаться实число。 позженас Воляразвиватьвидиз Увеличить Функциячас,Воляиспользовать Этифункция.
  • itemsфункция Можетиспользовать Вполучатьсценасерединаизпроект Список表。
  • renderфункциядля执ХОРОШО整индивидуальныйвидили Чточастьиз渲染очень有использовать。 Долженфункцияизиспользовать法иQGraphicsSceneсерединаизrender完全такой же,Только эта функциясуществуетвид выполняет ту же функцию.
  • rubberBandRectфункция Можетиспользовать Вполучать橡皮筋выбиратьизпрямоугольник。 как упоминалось ранее,этоттолькосуществоватьтащитьмодельнастраиватьдляrubberBandSelectionModeчас才有意义。
  • setSceneиsceneфункция Можетиспользовать Внастраиватьиполучатьвидсцена。
  • setMatrix,setTransform,transform,rotate,scale,shearиtranslateфункция Все Можеткиспользовать ВИсправлятьили Поисквидиз几何特секс。

иQGraphicsSceneиQGraphicsItemдобрыйтакой же,QGraphicsViewвозвращатьсяпоставлять Понятномноготакой жеизк保护виртуальный拟член,Может использоваться для дальнейшего расширения функционала видиз. Сейчас существуют,нас Воля РасширятьGraphics_ViewerПримерпроект,кподдерживать Болеепроект,выбор проекта,проектудалитьки放большойиуменьшить масштаб Функция,исуществоватьэтотпроцесссередина,нас Воля Обзорк Внизпроектиз Некоторый最重хотетьиспользовать例: О существовании мы узнали в этой главе извид, сценарипроект. поэтому,Давайте Заканчиваем это:

  1. первыйсуществовать Qt Creator середина ОткрытьGraphics_Viewerпроект; Затем выберите «Новый файл» и «Проект» в главном меню, а затем выберите «C++» в окне «Новый файл или проект». и C++ добрый”,Затемщелкнуть“выбирать”кнопка。
  2. убеждатьсявходитьQEnhancedGraphicsViewделатьдлядобрыйимя,ЗатемвыбиратьQWidgetделатьдлябазадобрый. кроме того,еслиInclude QWidgetрядомизфлажокеще нет选середина,пожалуйста选серединаэто。 Затем,Нажмите «Далее»,Затемщелкнуть“Заканчивать”。
  3. добавить вк Внизсодержаниек Включатьqenhancedgraphicsview.hголовадокумент:
Язык кода:javascript
копировать
        #include <QGraphicsView> 
  1. убеждатьсяQEnhancedGraphicsViewдобрыйнаследовать Понятноqenhancedgraphicsview.hдокументсерединаизQGraphicsViewВместо того, чтобы даQWidget,Как показано ниже:
Язык кода:javascript
копировать
        class QEnhancedGraphicsView : public QGraphicsView 
  1. тыдолжен更толькоQEnhancedGraphicsViewдобрыйизструктураустройство实сейчас,нравитьсяэтот处Место示。 очевидно,Дасуществоватьqenhancedgraphicsview.cppдокументсередина Заканчиватьиз,Как показано ниже:
Язык кода:javascript
копировать
        QEnhancedGraphicsView::QEnhancedGraphicsView(QWidget
           *parent) 
         : QGraphicsView(parent) 
        { 
        } 
  1. сейчассуществовать,Воляк Внизк保护изчлендобавить вqenhancedgraphicsview.hдокументсерединаиз Усиливать型виддобрыйопределениесередина:
Язык кода:javascript
копировать
        protected: 
          void wheelEvent(QWheelEvent *event);
  1. и Воля Что实сейчасдобавить вqenhancedgraphicsview.cppдокумент,Как указано в следующем блоке кода:
Язык кода:javascript
копировать
        void QEnhancedGraphicsView::wheelEvent(QWheelEvent *event) 
        { 
          if (event->orientation() == Qt::Vertical) 
          { 
            double angleDeltaY = event->angleDelta().y(); 
            double zoomFactor = qPow(1.0015, angleDeltaY); 
            scale(zoomFactor, zoomFactor); 
            this->viewport()->update(); 
            event->accept(); 
          } 
          else 
          { 
            event->ignore(); 
          } 
        } 

ты需хотетьубеждатьсяQWheelEventиQtMathВключатьсуществоватьнасиздобрыйисточникдокументсередина,в противном случае,ты ВоляполучатьqPowфункцияиQWheelEventдобрыйизкомпиляторошибка。 Предыдущий код в основном не требует пояснений — он сначала проверяет направление события колеса мыши, а затем перемещает колесо в зависимости от количества движения. X и Y Ко всем осям применяется масштаб. Затем он обновляет область просмотра, проверяя, что все перерисовывается по мере необходимости.

  1. сейчассуществовать,нас需хотеть Входить Qt Creator серединаиз“дизайн”модель,ксуществоватьокноначальствопродвигатьgraphicsViewверно象(нравитьсянас先вперед Место见)。 Нам нужно нажать правой кнопкой мыши и в контекстном меню выбрать «Обновить для». Затем,входитьQEnhancedGraphicsViewделатьдляобновлениеиздобрыйимя,Затемщелкнуть“добавить в”кнопка,наконецщелкнуть“обновление”кнопка。 (Знания об улучшении вы уже почерпнули в предыдущей статье, и эта не исключение.) Зависит от ВQGraphicsViewиQEnhancedGraphicsViewдобрыйдасовместимыйиз(Нет.одинданазад ВОЗизотецдобрый),поэтомунас Можетк Воляотец代продвигатьдляребенок代,и/ или Воля его понижение (если оно нам не нужно). Обновить как Волявиджет конвертировать для своих дочерний виджетподдержки добавьте больше подобных функций.
  2. ты需хотетьсуществоватьmainwindow.cppизdropEventфункциявершинадобавить водин小段код,кубеждатьсясуществовать加载новыйизображениечас重набор Увеличить级Не(если быть точнымда Сравнивать例Конвертировать):
Язык кода:javascript
копировать
        ui->graphicsView->resetTransform(); 

Теперь вы можете запустить приложение и попробовать прокрутить колесо мыши. Поворачивая колесо вверх или вниз, вы можете увидеть изменение уровней шкалы. Да放большойиуменьшить масштабизображениечасрезультат Приложениескриншот:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-Ly7AWV9w-1681869945445) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/1f9a24f3-3ad9-408a-aa5a-1a6815e21b48.png)]

Если ты попробуешь еще немного,Вы скоро обнаружите что-то,Увеличить Функцияобщийдакизображениеизсередина Сердце起делатьиспользовать,Это странно и неудобно. для смог решить эту проблему,Нам нужно использовать существование, чтобы узнать больше советов в этой главе.,Советы и функции:

  1. первый Кнасиз Усиливать型виддобрыйдобавить в另одинчастныйк保护изфункция. 除Понятно先впередиспользоватьизwheelEventснаружи,насвозвращаться ВоляиспользоватьmouseMoveEvent。 Поэтому Воляк в следующую строку кода добавьте вqenhancedgraphicsview.hдокументсерединаиззащищенный членчасть:
Язык кода:javascript
копировать
        void mouseMoveEvent(QMouseEvent *event); 
  1. Кроме того, добавьте частного члена следующим образом:
Язык кода:javascript
копировать
        private: 
          QPointF sceneMousePos; 
  1. Теперь существует, переходим в раздел его реализации и воляк добавляем следующую строку кода вqenhancedgraphicsview.cppдокумент:
Язык кода:javascript
копировать
        void QEnhancedGraphicsView::mouseMoveEvent(QMouseEvent
           *event) 
       { 
         sceneMousePos = this->mapToScene(event->pos()); 
       }
  1. тывозвращаться需хотеть稍微调整wheelEventфункция. Убедитесь, что это выглядит так:
Язык кода:javascript
копировать
        if (event->orientation() == Qt::Vertical) 
        { 
          double angleDeltaY = event->angleDelta().y(); 
          double zoomFactor = qPow(1.0015, angleDeltaY); 
          scale(zoomFactor, zoomFactor); 
          if(angleDeltaY > 0) 
          { 
            this->centerOn(sceneMousePos); 
            sceneMousePos = this->mapToScene(event->pos()); 
          } 
          this->viewport()->update(); 
          event->accept(); 
        } 
        else 
        { 
          event->ignore(); 
        } 

ты Толькососредоточиться Названия функции, вы можете легко увидеть, что происходит здесь. нас实сейчас ПонятноmouseMoveEventПриходить拾Выбиратьмышьиз Кусочекнабор(существоватьсцена坐标середина,этот Нет常重хотеть); Затемнасубеждатьсясуществовать放большой(Вместо того, чтобы дауменьшить масштаб)после,Долженвидубеждаться Место采наборизточка Кусочек ВЭкранизсередина Сердце。 Наконец, он обновит настройки для более удобного масштабирования. Важная изда, на которую стоит обратить внимание,Иногда небольшие недостатки, подобные этому, могут означать, что функция может удобно соответствовать вашему приложению.,финальный Даприложение增长(илихудшийиз Состояниеда Вниз降)из重хотетьпараметр。

сейчассуществовать,нас Воля КGraphics_Viewerприложениедобавить в Более Функция。 让наспервыйубеждатьсянасизGraphics_Viewerприложениеможетиметь дело с无限число量изизображение:

  1. первый,нас需хотетьубеждатьсясуществовать Волякаждыйизображение拖放приезжатьвидсередина(поэтомудасцена)после,Не очистится сцена,поэтомупервыйотmainwindow.cppизdropEventсерединаудалитьк Вниз ХОРОШО:
Язык кода:javascript
копировать
        scene.clear(); 
  1. кроме того,отdropEventсерединаудалитьк Внизкод ХОРОШО,Ранее мы добавили следующую строку кода для сброса масштабирования:
Язык кода:javascript
копировать
        ui->graphicsView->resetTransform();
  1. сейчассуществовать,Воляк Вниз两ХОРОШОкоддобавить вmainwindow.cppдокументсерединаdropEventиз起точка:
Язык кода:javascript
копировать
        QPoint viewPos = ui->graphicsView->mapFromParent
          (event->pos()); 
        QPointF sceneDropPos = ui->graphicsView->mapToScene
          (viewPos); 
  1. Затем,убеждаться Воляпроектиз КусочекнаборнастраиватьдляsceneDropPos,Как показано ниже:
Язык кода:javascript
копировать
        item->setPos(sceneDropPos); 

Всё, теперь для существования больше ничего не нужно. запускатьGraphics_Viewerприложение,Затемпытаться Воляизображение放入Чтосередина。 После одного изображения попробуйте уменьшить масштаб и добавить еще изображение. (Пожалуйста, не преувеличивайте это, чтобы заполнить память, потому что, если вы попытаетесь добавить много изображений, ваше приложение начнет потреблять слишком много памяти, что вызовет проблемы с операционной системой. Само собой разумеется, ваше приложение может аварийно завершить работу. 。)Ниже приводитсясуществоватьсценасередина各индивидуальный Кусочекнабор拖放из Некоторыйизображениеизскриншот:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-PaY5y7cG-1681869945445) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/376494ed-9341-4a3e-9e44-e3296a513383.png)]

очевидно,Приложение все еще многого не хватает,Дасуществовать剩Внизизчасть让тыс己找出и发сейчас Извперед,нас Волясуществоватькнига章серединапредставлять Некоторый Нет常关键из Функция。 Некоторые очень важные недостающие функции мы не можем выбрать, удалить, проектировать или применить к ним определенные эффекты. 让насодин次Заканчиватьодин Простойно мощныйизGraphics_Viewerприложение. Как вы знаете, в дальнейшем мы Воляиспользоватьсуществовать компьютерное зрениеприложение(имядляComputer_Visionпроект)середина学приезжатьизвсе技术。 поэтому,让насначинатьдляGraphics_Viewerпроект Добавитьк Внизфинальныйсодержание:

  1. первый КУсиливатьиз Графический виддобрыйдобавить в另одинк保护изчлен,Как показано ниже:
Язык кода:javascript
копировать
        void mousePressEvent(QMouseEvent *event); 
  1. Затем Воляк в выделенный слот добавить то же самое в определении издобрый:
Язык кода:javascript
копировать
        private slots: 
          void clearAll(bool); 
          void clearSelected(bool); 
          void noEffect(bool); 
          void blurEffect(bool); 
          void dropShadowEffect(bool); 
          void colorizeEffect(bool); 
          void customEffect(bool); 
  1. сейчассуществовать,все будутнеобходимыйиз实сейчасдобавить ввиддобрыйисточникдокумент,Прямо сейчасqenhancedgraphicsview.cppдокумент. первыйдобавить вmousePressEventиз实сейчас,Как показано ниже:
Язык кода:javascript
копировать
        void QEnhancedGraphicsView::mousePressEvent(QMouseEvent 
          *event) 
        { 
         if(event->button() == Qt::RightButton) 
         { 
          QMenu menu; 
          QAction *clearAllAction = menu.addAction("Clear All"); 
          connect(clearAllAction, 
                SIGNAL(triggered(bool)), 
                this, 
                SLOT(clearAll(bool))); 
          QAction *clearSelectedAction = menu.addAction("Clear Selected"); 
          connect(clearSelectedAction, 
                SIGNAL(triggered(bool)), 
                this, 
                SLOT(clearSelected(bool))); 
          QAction *noEffectAction = menu.addAction("No Effect"); 
          connect(noEffectAction, 
                SIGNAL(triggered(bool)), 
                this, 
                SLOT(noEffect(bool))); 
          QAction *blurEffectAction = menu.addAction("Blur Effect"); 
          connect(blurEffectAction, 
                SIGNAL(triggered(bool)), 
                this, 
                SLOT(blurEffect(bool))); 
          // *** 
          menu.exec(event->globalPos()); 
          event->accept(); 
         } 
         else 
         {  
           QGraphicsView::mousePressEvent(event); 
         } 
        } 

существоватьвперед面изкодсередина,//***дляdropShadowEffect,colorizeEffectиcustomEffectфункцияслотпо сутиктакой жеизмодельповторить。 существоватьвперед面изкодсередина,нас Место做из Толькода Простой地создаватьи Открытьодинначальство Внизискусство(Щелкните правой кнопкой мышищелкнуть)меню,Затем Волякаждыйдействиесоединятьприезжать Волясуществовать Внизодин步серединадобавить визслот。

  1. сейчассуществовать,добавить вслотиз实сейчас,Как показано ниже:
Язык кода:javascript
копировать
        void QEnhancedGraphicsView::clearAll(bool) 
        { 
          scene()->clear(); 
        } 
        void QEnhancedGraphicsView::clearSelected(bool) 
        { 
          while(scene()->selectedItems().count() > 0) 
          { 
           delete scene()->selectedItems().at(0); 
           scene()->selectedItems().removeAt(0); 
          } 
        } 
        void QEnhancedGraphicsView::noEffect(bool) 
        { 
          foreach(QGraphicsItem *item, scene()->selectedItems()) 
          { 
           item->setGraphicsEffect(Q_NULLPTR); 
          } 
        } 

        void QEnhancedGraphicsView::blurEffect(bool) 
        { 
          foreach(QGraphicsItem *item, scene()->selectedItems()) 
          { 
            item->setGraphicsEffect(new QGraphicsBlurEffect(this)); 
          } 
        } 

       //*** 

Предыдущие коды такие же,Что余слот遵循такой жеизмодель。

  1. существует наше приложение, готовое руководитьтестированием до того, как,нас需хотетьиметь дело с Некоторыйнаконецизиметь значение。 Во-первых, нам необходимо убедиться, что улучшение из Графический Виддобрыйда интерактивный и позволяет использовать щелчок и перетаскивание, чтобы выбрать проект. Вы можете скачать фрагмент кода добавить вmainwindow.cppдокументсередина Приходитьвыполнить. Сразу после установки сцены в функции инициализации существования (конструкторе) выполните следующие операции:
Язык кода:javascript
копировать
        ui->graphicsView->setInteractive(true); 
        ui->graphicsView->setDragMode(QGraphicsView::RubberBandDrag); 
        ui->graphicsView->setRubberBandSelectionMode( 
           Qt::ContainsItemShape); 
  1. наконецнои Нет最Нет重хотетьизодинточкада,существоватьmainwindow.cppизdropEventфункциясерединадобавить вк Внизкод ХОРОШО,кубеждаться Можетквыбиратьпроект。 Воляэто们добавить впроектсоздаватькодпослекидобавить Перед строкой сценаиз:
Язык кода:javascript
копировать
        item->setFlag(QGraphicsItem::ItemIsSelectable); 
        item->setAcceptedMouseButtons(Qt::LeftButton);

Вот и все. нас ПодготовитьначинатьитестнасизGraphics_Viewerприложение,Долженприложениесейчассуществоватьвозвращаться Можно добавить Эффектииметь Более Функция。 Дапоказывать Место谓из橡皮筋выбиратьмодель ХОРОШОдляизскриншот:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-zEffmXzF-1681869945445) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/221f1f37-dd44-44cb-99ae-1d397a2895f4.png)]

наконец,Вниз面датолькосуществоватьбегатьизGraphics_ViewerПриложение Экран快照,в то же времядлясценасерединаизизображениедобавить в Понятно Нет同из Эффект:

[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (img-RTx9F711-1681869945446) (https://gitcode.net/apachecn/a). pachecn-cv-zh/-/raw/master/docs/cv-opencv3-qt5/img/8b4e6dc5-a618-4d1b-8c15-1a500a9c672c.png)]

Вот и все. Теперь мы можем ксоздать мощный графический просмотрщик и воля его добавить вComputer_Visionпроектсередина,существоватьизучатьновыйизки Болееиз OpenCV и Qt Навыки и приемы из одновременно, а также Волясуществовать из следующей главы. в соответствии с照承诺,Вы можете начать ск Вниз СвязьскачатьComputer_Visionпроектизвесьверсиякнига

Как мы неоднократно упоминали в предыдущих главах, цель проекта «дапроходить» заботится о каждой потребности. GUI Возможности, языки, темы и т. д., помощь мы ориентируемся только на компьютерное зрениетема. 。 Проект до сих пор для вас изучил все из полного примера. Приложение настраивается в стилях, доступно на новых языках и расширяемо. Кроме того, все, что вы узнали в этой главе, упаковано в красивую и мощную программу просмотра графики, которую мы будем использовать в остальной части книги. существования Пожалуйста, убедитесь, что вы загрузили его, прежде чем переходить к следующей главе.

Computer_Visionпроект Включатьодин Qt многопроектсерединаиздвапроект,или ВОЗ更точный地说даsubdirsпроекттип。 Нет.одиндаmainapp,Нет.二индивидуальныйдаtemplate_pluginпроект。 Вы можете ккопировать (клонировать) и заменить проект из кода. GUI документ,ксоздаватьиComputer_Visionпроектсовместимыйизновыйплагин。 Это правильноданассуществовать Нет. 6 Глава «OpenCV «работа, проделанная при обработке изображений»), чтобы вы узнали больше всего OpenCV Навык,нас ВолядляComputer_VisionСоздайтеплагин。 Проект также содержит дополнительный язык Пример и дополнительную тему Пример, которые можно снова изменить, просто скопировав, чтобы приложение могло создать новый элемент языка. убеждатьсяты Проверять Понятно整индивидуальныйскачатьизисходный код,и убедиться, что в нем нет загадок,иты完全учитьсяComputer_Visionпроектисходный кодсерединаизвсесодержание。 такой же,Дадля Понятно Подвести итогты Место学извсе知识и Воля Что打包приезжатьодинодинодиниз,Всесторонний,Многоразовые из Примерпроект.

Подвести итог

С самого начала этой книги,мы прошли долгий путь,приезжатьсейчассуществовать,насуже经完全掌握Понятномного有использоватьиз技术Приходить承担компьютерное Задачи по разработке приложений для зрения. из всех предыдущих глав (включая нашу только что главу «Заканчивать»), вы учитесь, у вас больше связей. анныйсоздавать мощный и всеобъемлющий инструмент. Применять необходимые навыки (обычно большую часть времени), а не просто сосредотачиваться на компьютерном зрение (именно да OpenCV навыки). Вы узнали, как использовать создательподдержку на нескольких языках, темах и стилях, добавлять приложения; В этой главе вы узнали, как визуализировать изображения и графики в существующих сценах. Сейчас существуют, у нас уже есть углубленное компьютерное исследование зрение Почти все, что вам нужно в мире разработки приложений.

существовать Нет. 6 Глава «OpenCV в "обработке изображений", ты научишьсясвязанный OpenCV ки Чтосередина Может能изизображениеиметь дело с技术из Подробнее. длякаждыйизучатьизхозяин题,настолькогипотезанастолькосуществоватьсоздаватьиComputer_Visionпроектсовместимыйизплагин。 этот意味着нас ВолясуществоватьComputer_Visionпроектсерединаиспользоватьшаблонплагин,Воля Чтокопировать,Затем Простой地制делатьодинможет执ХОРОШОидентификациякомпьютерное задачи зрения, фильтр преобразования или расчет из плагина. конечно,этоти Нет意味着ты Нет能создаватьиметьтакой же Функция изнезависимыйприложение,какты Волясуществуют в следующей главе Видетьиз Таким образом,У нас изплагин есть графический интерфейс, создавать приложение или создавать приложение по сути ничем не отличается. Именно все, что вы узнали в предыдущей главе, из Qt Widgets приложение. Да,отсейчассуществоватьначинать,Мы с Волей продолжаем изучать более продвинутые темы,инасиз重точка Воляхозяинхотеть放существовать Приложениекомпьютерное зрениеаспект。 Ты, Воля, научись существовать OpenCV серединаиспользовать众многоизфильтридругойизображениеиметь дело с Функция,Он поддерживает цветовое пространство,много Конвертировать技术ждатьждать.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose