1. Опен КВ и Введение в Qt
существуют самые основные формы и формы,“компьютерное зрение»да Термин, используемый для обозначения всех методов и алгоритмов, используемых для придания визуальных ощущений цифровым устройствам. что это значит? Ну, это именно то, на что это похоже. В идеале компьютеры должны иметь возможность видеть мир через объектив стандартной камеры (или любого другого типа камеры, если уж на то пошло), и, применяя различные алгоритмы компьютерного зрения, они должны быть в состоянии обнаруживать и даже распознавать и подсчитывать лица. объекты на изображении, обнаруживать движение в видеопотоке, а затем выполнять больше операций, которые на первый взгляд могут ожидать только люди. поэтому,хотетьучитьсякомпьютерное зрениеиз реального смысла, лучше знать компьютерное Для достижения упомянутого идеала существует метод развития целей зрения, чтобы цифровые устройства имели возможность видеть и понимать окружающую среду. Примечательно изда, большую часть времени компьютерное. зрениеи Обработка изображений взаимозаменяема киспользовать (хотя исторические исследования по этой теме могут доказать, что верно обратное). Но да, тем не менее, существует На протяжении всей книги мы по-прежнему Воляиспользовать «компьютерное Термин «зрение», потому что сегодня это более популярный и широко распространенный термин в сообществе информатики, и потому что, как мы увидим позже в этой главе, «обработка изображений» да OpenCV Модуль библиотеки, который мы также рассмотрим на следующих страницах этой главы, также будет рассмотрен в отдельной полной главе.
компьютерное зрениеда Самое популярное добро в информатике сегодня Один из предметов Живизиз, он используется в различных приложениях, начиная от обнаружения раковой ткани в медицинских инструментах и заканчивая созданием блестящих музыкальных клипов и фильмов из видеороликов. Программное обеспечение, работающее с детектором объектов военного уровня, может помочь реализовать детектор дорожных знаков в конкретном месте Кусочка на карте, что поможет беспилотному автомобилю найти дорогу. Что ж, очевидно, что мы не можем закончить все возможности названия компьютерного зрения, но мы можем быть уверены, что это интересная тема и она будет актуальна еще долгое время. Также стоит упомянуть изда, Рынок труда быстро расширяется.,иэтосуществоватьрастет день ото дня。
существоватькомпьютерное зрение Разработчик и Экспертиспользоватьиз Самые популярные добро В Евизинструменте есть два самых известных сообщества с открытым исходным кодом: OpenCV. и Qt Также в названии вашей книги. Каждый день тысячи разработчиков по всему миру, от авторитетных компаний до инновационных стартапов, используют эти две платформы для создания приложений для самых разных отраслей (например, тех, которые мы упомянули), и это именно то, чему вы чему-то научитесь. эта книга.
В этой главе мы рассматриваем следующие темы:
Это наиболее очевидный вопрос после того, что было сказано во введении к этой главе, но ответ на него также является нашим первым шагом в изучении компьютерного зрения. Эта книга предназначена для разработчиков, знакомых с языком программирования C++ и желающих без особых усилий разрабатывать мощные и красивые приложения компьютерного зрения, которые хорошо работают в различных операционных системах. Цель этой книги — отправиться в увлекательное путешествие по различным темам компьютерного зрения, уделяя особое внимание практическим упражнениям и постепенно развивая полученные знания.
иметь достаточно C++ Любой, у кого есть опыт, знает, что использование raw C++ кода и зависит от конкретного OS из API Прийти к написанию визуально богатого приложения непросто. Поэтому почти каждый C++ Разработчики (или, по крайней мере, серьезно занимающиеся C++ Серьезные разработчики) используют ту или иную рамку, чтобы упростить этот процесс. Qt да Самый широкийдляизвестныйиз C++ рамка. На самом деле, это предпочтительно или не предпочтительно. С другой стороны, если ваша цель — разработать приложение, обрабатывающее изображения и визуализирующее набор данных, то OpenCV рамкавозможно да Нет.one (также дамост добро пожалуйста) адрес. Поэтому именно поэтому в этой книге основное внимание уделяется Qt и OpenCV в сочетании с причиной. Если не используется Qt и OpenCV Настолько мощная и рамочная, что невозможно обеспечить разную производительность для настольных и мобильных платформ, лучшую и компьютерную производительность. зрениеприложение.
Подвести В общем, пожалуйста, убедитесь, что у вас есть хотя бы C++ Среднее знание языков программирования. Если вы не знакомы с терминологией добрый, абстрактный добрый, наследование, шаблон и указатель добрыйиз, пожалуйста, сначала прочтите «читасвязанный». C++ из Книга。 Для всех других тем, особенно для всех практических тем, эта книга гарантирует, что вы охвачены всеми примерами. Все учебные пособия снабжены четкими пояснениями (или относятся к конкретным страницам документации). Конечно, чтобы получить права Qt и OpenCV Как реализовать модульдобрыйиз, очень подробно и углубленно, и вам нужно ознакомиться с дополнительными ресурсами, исследованиями, а иногда даже с базовыми математическими расчетами или с тем, как использовать Qt и OpenCV Выполнять низкоуровневое понимание. Реальная производительность компьютеров и операционных систем совершенно выходит за рамки этой книги. Да,Для Эта книга охватывает все алгоритмы и методы,Ваша Воля вкратце изучите их использование,использовать Способ,Рекомендации по времени и адекватности,кчтобы ты могк Продолжайте идти глубже Исследовать。
Вы слышали о нем и, возможно, даже существовали, даже не подозревая об этом. Он является основой для многих всемирно известных коммерческих приложений и приложений с открытым исходным кодом, таких как VLC Player,Calibre ждать. Qt рамка считается большинством так называемых богатств 500 Сильная компания использует, мы даже не можем дать ей определение. Это популярный процесс среди многих команд разработчиков приложений и компаний по всему миру. Итак, мы начнем со вступления и продолжим дальше.
Сначала давайте кратко представим Qt рамки, которые помогут нам не сбиться с пути. Ничто не заставит вас полюбить фреймворк больше, чем четкое представление обо всем этом. Следовательно, Qt Framework — это среда разработки приложений с открытым исходным кодом, в настоящее время разрабатываемая Qt Создание и управление компанией, он широко используется в создании богатых приложений и в платформенных приложениях, которые можно найти запускать на очень небольшом количестве различных операционных систем или устройств без какой-либо нагрузки. для разбит дальше, с открытым исходным кодом - одна из наиболее очевидных частей. Это означает, что вы можете получить доступ Qt из всех исходных кодов. иметь богатый внешний вид, мы имеем в виду Qt Рамка на депозите существует достаточно ресурсов и функций, чтобы писать очень красиво и применять. Что касается последней части, кроссплатформенности, это в основном означает, что, например, если вы используете Microsoft Windows Операционная система Qt приложение для разработки рамкимодульидобрый, вы можете настроить его как есть MacOS или Linux Скомпилировать его руководить Строить. , не меняя (почти) никакого кода, если вы не используете ничего, кроме Qt Или может быть конкретная платформа из библиотеки.
На момент написания Qt рамка (сокращенно илик) Qt)изверсиякнигадля Версия 5.9.X, содержащая множество инструментов, может использоваться для разработки приложений практически любого назначения. Qt Модули разделены на следующие четыре основные категории:
Давайте посмотрим, что это такое и что они включают в себя, поскольку мы будем иметь с ними дело на протяжении всей книги.
это 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 Essentials из Универсального характера. Эти типизмодульные примеры Qt 3D,Qt Поддержка печати, Qt WebEngine,Qt Bluetooth и т.п. ожидание. Вы всегда можете обратиться к Qt Документ кполучить Полный список этих модулей, на самом деле их слишком много, чтобы их можно было перечислить здесь. существовать большую часть времени,Вам нужно только просмотреть краткое описание использования учемодулиз.
связанныйэтоиз Подробнее,Ты можешькссылказдесь。
Эти модули предоставляют дополнительные функции и улучшают Qt из Коммерческая лицензия. даиз, как вы уже догадались, эти модули существуют только Qt изплаченная версия доступна в этой книге и существует Qt из Версии с открытым исходным кодом и Бесплатные версии не представлены в этой книге, но они являются основной целью издапомощь нашего Заканчивания очень специфических задач, которые вообще не требуются в этой книге. Вы можете использовать Qt Страница документации для получения списка.
связанныйэтоиз Подробнее,Ты можешькссылказдесь。
Как следует из названия,Этимодульв целостностьсуществовать не гарантирует правильную работу во всех случаях из。 Они могут содержать или не содержать bug или другие проблемы, и они все еще находятся в стадии разработки и для тестирования Обратная связь из предварительного просмотра. Как только модуль будет разработан и достаточно доработан, его можно найти упомянутое ранее из другого доброго псевдонима, используемого, и доброго псевдонима, удаленного из Технического предварительного просмотра. На момент написания эти типизмодули существовали. 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 Приложение 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 даана библиотека с открытым исходным кодом и кросс-платформенная для разработки компьютерного зрениеприложение. Ориентированный на скорость и производительность, он содержит сотни алгоритмов в различных модулях. Этимодуль Также частьдля Два видатип: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 серединаизизображениеиметь дело с”серединапредставлятьэтотмодульи Что Функция。features2d
Включатьиспользовать Вособенностьизвлекатьисоответствоватьиздобрыйиметод。 Они Волясуществовать Нет. 7 Глава, руководить подробно изложен в разделе «Характеристики и дескрипторы».как упоминалось ранее,Дополнительные модулихозяинхотетьда Нет.трехсторонний Библиотекаизобертка,этот意味着это们только Включатьинтегрированный Этимодульнеобходимыйизинтерфейсилиметод。 Примердополнительные модули Воляда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 SDK (Комплект разработки программного обеспечения). Мы начнем с Windows Настройки в операционной системе Qt Начни и запиши,когда понадобится. Linux(существуем из-за случаядля Ubuntu, но для всех Linux Версия релиза почти такая же)и MacOS Операционная система. Итак, начнем.
дляспособный Установитьииспользовать 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 Версия.
Ниже приводится Вам необходимо скачать издокумент из предыдущей папки:
для Windows:qt-opensource-windows-x86-5.9.1.exe
для macOS:qt-opensource-mac-x64-5.9.1.dmg
для Linux:qt-opensource-linux-x64-5.9.1.run
этопродвигать Строить Qt Библиотека,и содержатькаждыйупомянулиз Операционная системавесь Qt SDK。 Это означает, что вам не придется строить его самостоятельно. Qt библиотеки могут их использовать. Эти файлы установки обычно содержат следующее содержимое:
Пользователи Windows:Qt Пакет установки также включает в себя MinGW компилятор,Да Зависит от нас Воляиспользовать другой компилятор, а именно MSVC 2015 год, так что вы фактически не имеете к этому никакого отношения. Хотя установить его не помешает.
Вам необходимо выполнить загрузку из Установить файл, чтобы начать установку. Если вы используетеизда Windows или MacOS операционная система, затем Просто бегискачатьиздокумент. Да,Если вы используетеизда Linux,но Может能需хотеть先делатьскачатьиз.run
файл вдляисполняемый файл,Затем Чтобы быть практичнымбегатьэто。 Можно найти в Linux Выполните в системе следующую команду, чтобы сделать исполняемый файл установщика:
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 версия Qt , убедитесь, что в диалоговом окне «Выбор компонента» msvc2015 32 Кусочек» рядом с флажком из. Оставшаяся часть не является обязательной, но стоит отметить: «Установить всю платформу» (или существовать). Qt позвонил комплекты) часто требуют слишком много места и в некоторых случаях влияют Qt Creator изPerformance. Итак, просто убедитесь, что выбрали все, что ваша Воля действительно использует. Что касается этой книги, то это только то, что вам действительно нужно. msvc2015 32 битовые варианты.
Пользователи Windows: важные моменты из:тывозвращаться需хотеть Установить По меньшей мере启использовать Понятно C++ рабочий стол Функция развитияиз Visual Studio 2015。 Microsoft для Visual Studio Предоставляются лицензии на различные типы. Ты можешькскачать社округверсиякнигаиспользовать В教育глазиз,Этого дляиз Примера определенно хватит,идабесплатно Предоставить из,Даиспользовать Enterprise,Professional или другой типиз Visual Studio Тоже ок, пока у них есть MSVC 2015 32 Кусочеккомпилятор。
Если вы не в 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 Установить Qt , в диалоговом окне «Выбор компонента» убедитесь, что выбран (по крайней мере) «Рабочий стол». GCC(32 Кусочекили 64 Кусочек, в зависимости от вашей операционной системы). Вы заметите, что по умолчанию Воля Установить Qt Creator и никакие опции проверять не нужно.
Установить Заканчиватьназад,Ты Волясуществоватькомпьютерначальство Установитьк Внизприложение:
для Windows и Пользователи MacOS, это да Qt Удалить историю с окончанием, но да Пользователи Linux все еще нужно сделать еще несколько вещей, а именно: установить разработку приложений, инструменты для сборки и некоторые Linux необходимыйизбегатьчасбиблиотека. Qt всегдаиспользовать Операционная система Предоставить изкомпилятористроитьинструмент。 По умолчанию Линукс Версия дистрибутива обычно не включает этот инструмент, поскольку для него предназначен только Зависит. от Разработчикиспользовать,и未одеяло普Универсальныйсемьяиспользовать。 поэтому,хотеть Установитьэто们(еслиеще нет Установить),Скачать Заказ можно из терминала проектк:
sudo apt-get install build-essential libgl1-mesa-dev
Вы всегда можете обратиться к Qt Страница документации получатьвсе Linux Выдача версии обязательна, но да,существовать в этой книге мы предполагаем выдачу версии для Ubuntu/Debian。 Однако обратите внимание, что, как правило, все Linux Выпуски очень похожи.
связанныйэтоиз Подробнее,Ты можешькссылказдесь。
Теперь вы можете безопасно бегать 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
начало,поэтомуубеждатьсявыбиратьнас Волясуществоватькнига Книгасерединаиспользоватьизкомпилятор,Как показано ниже:
После выбора правильного инструмента в соответствии с вышеупомянутым инструментом,Можетк Нажмите «Далее»продолжатьруководитьдействовать:
[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (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 из исходного кода. Как вы видите за Волясуществоватьиз,иикнига节иззаголовок напротив,наси Нетдадействительнокдобрый похож на режим Qt УстановитьизПриходить Установить OpenCV。 Дапотому чтодля OpenCV в целом Нетдлявсекомпиляториплатформа Обеспечить предварительное Строитьдвоичныйдокумент,ина самом делеэто根книга Нетдля MacOS и Linux Обеспечить предварительное Строитьдвоичныйдокумент. существовать OpenCV издо настоящего времени Win пакет, который содержит только 64 Кусочек MSVC 2015 из готовых двоичных файлов, эти двоичные файлы и Воляиспользоватьиз 32 Кусочекверсия не совместима, поэтому создайте свою OpenCV Приходите учиться, как руководить Установитьда очень хорошую идею. Он также имеет сборки, соответствующие вашим потребностям: OpenCV рамка Библиотекаиз Преимущества. Возможно, вы захотите исключить некоторые параметры, чтобы упростить OpenCV Установить,или ВОЗМожет能хотетьдлядругойкомпилятор(Например MSVC 2013)руководить Строить.поэтому,Причин много требует, чтобы вы сами собирали исходники OpenCV。
互联网начальствоизбольшинствооткрытьисходный кодрамкаи Библиотека,или ВОЗПо меньшей мереданадеюсь сохранить IDE Нейтрален по отношению к библиотеке и библиотеке (то есть может киспользовать любую IDE руководить Конфигурацияи Строитьпроект,к И работает независимо от конкретного IDE-изпроекта),использовать CMake илидобрыйпохожийизmake
система。 Я думаю, это также ответит на такие вопросы, как «Что именно мне нужно?» CMake? ”и“для чего они не могут просто предоставить библиотеку и использовать ее Заканчивать? «Проблема доброгоиз похожа на другие проблемы. Поэтому нам нужно CMake можетиспользоватьисточник Конфигурацияистроить OpenCV。 CMake даанское кроссплатформенное приложение с открытым исходным кодом, которое позволяет Конфигурации создавать проекты с открытым исходным кодом (или приложения, библиотеки и т. д.), и вы можете найти Загрузите ииспользовать на всех операционных системах, упомянутых в предыдущем разделе. На момент написания этой книги она была доступна на сайте CMake 网站Страница загрузкискачать CMake 3.9.1 версия。
Прежде чем двигаться дальше, убедитесь, что «Установить Существовать» загружено и установлено на вашем компьютере. CMake Установить Нет ничего особенного, на что следует обратить внимание, за исключением того, что вам нужно убедиться, что вы установили Установить. GUI версиякнигаэтотодин事实снаружи,Данас Волясуществуют в следующей частииспользоватьизсодержание,иэтода Предоставить из Связьсерединаизпо умолчаниюпараметры. Ранее.
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 сам из зависимостей, требующих существования Конфигурация Кусочек перед его сборкой:
sudp apt-get install libgtk2.0-dev and pkg-config
После запуска приложения CMake GUI вам необходимо настроить следующие две папки:
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:
sudo make
Эта Воля запускает процесс Сборка может занять некоторое время в зависимости от скорости вашего компьютера. После того, как все библиотеки будут построены, индикатор выполнения достигнет 100%。
После долгого ожидания остался всего один Заказ для MacOS и Пользователи Исполнение Linux. Если вы используетеизда Windows, вы можете отключить Visual Studio IDE и перейдите к следующему шагу.
MacOS и Пользователи Linux:строить Заканчиватьназад,существовать до закрытия экземпляра терминала,пожалуйстасуществоватьвсе еще Кусочек В OpenCV build
папкасерединаиз Состояние Вниз执ХОРОШОк Вниз Заказ:
sudo make install
для Нет Пользователи Windows, этот последний Заказ Воля убедитесь, что на вашем компьютере есть Установить 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 документсерединаиспользовать/
):
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
документсередина:
INCLUDEPATH += /usr/local/include
LIBS += -L/usr/local/lib \
-lopencv_world
Пользователи В Windows есть еще одна вещь — да Воля. OpenCV DLLs
папкадобавить вPATH
环境переменнаясередина。 Только Открыть“системасвойство”окно,ЗатемсуществоватьPATH
серединадобавить водинновыйвход。 это们в целомиспользовать;
отдельный,поэтомупосле Толькодобавить водинновыйиз Прямо сейчас Может。 Обратите внимание, что этот путь относится только к Windows Зависит от операционной системы и можно найти в который найден OpenCV изDLL
документ,отиупрощать Понятнопроцесс сборки。 Linux и MacOS изпользователю не нужно ничего с этим делать.
Самый худший момент позади,нассейчассуществовать Подготовитьидти глубже Исследоватькомпьютерное мир зрения и начни использовать Qt и OpenCV Постройте захватывающее изприложение. Хотя последний шаг называется «тест OpenCV", но на самом деле это да, Воля хочет писатьиз Нет.а Qt + OpenCV Приложение настолько простое, насколько кажется на первый взгляд. существования В этом разделе мы ничего не беспокоим о том, как все работает и что происходит за кулисами, а лишь следим за тем, чтобы мы делали это правильно. нфигурация всего содержимого и предотвращение бесполезной траты времени. Конфигурация, связанная с проблемами содержания, описана далее в книге. еслитыужев соответствии с照иллюстрироватьруководить Понятновседействоватьикправильныйиз顺序执ХОРОШОПонятновсеобратитесь к令,Так что до сих пор для существования,Вам не нужно ни о чем беспокоиться,Дабольшинствопроверять,Это данассейчассуществоватьхотеть做из。
поэтому,нас Воляиспользоватьодин Нет常Простойизприложение Приходитьпроверятьнасиз OpenCV Установите, приложение Воля берет файл изображения с жесткого диска для чтения и отображает только его. Аналогично, не беспокойтесь о каких-либо деталях, связанных с кодом, поскольку все эти детали рассматриваются в следующих главах, и просто сосредоточьтесь на текущей задаче, а именно: OpenCV Установить。 Первый запуск Qt Создатель, затем создайте приложение «Новое из Консоли». существоватьтест Qt Установить До этого вы уже играли в очень похожий изквест. Вам необходимо следовать именно изиллюстрировать, за исключением того, что вы должны использовать Qt Widget снаружи,возвращатьсядолженубеждатьсявыбиратьQt Console Application
。 Повторите все шаги, как и раньше, до последнего шага. Qt Creator режим редактирования。 если询问тысвязанныйстроитьсистемаизинформация,пожалуйставыбиратьqmake
,По умолчаниюдолжен быть выбранqmake
,поэтомуты Толькохотетьпродолжатьвперед进Прямо сейчас Может。 убеждатьсядлятыизпроект命имя,НапримерQtCvTest
。 На этот раз вместо того, чтобы нажимать кнопку «Проектировать», дважды щелкните по проекту. PRO Файлы для вас найти в Qt Creator Найдите файл в Проводнике в левой части экрана и затем «Существупроектиз». PRO Добавьте следующие строки в конец файла :
include(c:/dev/opencv/opencv.pri)
пожалуйста, обрати внимание,на самом деле,Даотвечатьвсегда避免изжестко закодированныйтип,Как мы увидим в последующих главах «Волясуществовать».,нас Воляписать适использовать Ввсе Операционная системаболее сложнаяиз PRO документ. Не нужно менять ни одной строки; Да,Зависит только для нас дасуществоватьтест usiz OpenCV Установить,поэтомусейчассуществовать Можеткруководить Некоторыйжестко закодированный Приходитьупрощать Некоторыйиметь значение,Не перегружая вас деталями конфигурации.
поэтому,Вернемся к тому, что мы делаем,когдатыпроходитьв соответствии сCtrl + S
держать PRO документчас,ты заметишьбыстрыйизпроцессисуществоватьпроект Просматриватьустройствоиopencv.pri
документ Воля出сейчассуществовать资источникуправлятьустройствосередина。 Ты можешьк随часотэтот处Изменятьopencv.pri
изсодержание,Да Ты можешь能навсегда远Нет需хотетьэтот样做。 Не обращайте внимания на добрый комментарий в строке и убедитесь, что вы PRO Файлы и существуют здесь из файлов похожи:
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
документи Изменять Чтосодержание,Сделайте его похожим на этот добрый:
#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 Межплатформенная интеграция между фреймворками. Следующая глава Воляда актуальное компьютерное в этой книге. Развитие зрения и Программирование Примеризстартов и Волядля всей книги Практический пример закладывает основу.
с 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 и 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 Creator из Другие функции.
существуют В этом разделе мы, Воля, бродим Qt Creator из разных частей. При переезде на новое место лучше всего сначала подумать о своем окружении. тыодинначинать Вероятно, нет会Уведомлениеприезжать Эти差异,Дана самом деле,Да Нет常Взаимнопохожийиз Состояние,ты Воляпостепенно осознавать。 Ты Волясуществовать整книга Книгасерединаиспользовать Qt Creator окружающая среда, и прочитайте существование, прочтите эту книгу из всего процесса, по сути, воляиспользовать ее, и после того, как вы надеетесь, что ваша карьера будет существовать в долгосрочном личном проекте, или Исследовать。 Итак, давайте прогуляемся, начнем трогать вещи и посмотрим, что происходит на самом деле.
Вернемся к этой главе с картинкой. Вы существуете, видите здесь изда Qt Creator из начального экрана, или позже Воля увидит его да Qt Creator изрежим приветствия。 Вы можете заметить, что даже если вы установите ту же версию из этого Qt, цвет иконки здесь тоже немного другой на компьютере. Нетиспользовать担Сердце,Как вы увидите позже Воляиз вот так,это Толькодаонхозяин题,ты Воляизучатькакв соответствии сс己изстильипредпочтенияверно Чторуководить Изменять。 Фактически, на протяжении всей книги вы увидите, что из существования Qt Различные темы скриншотов, но имейте в виду, что это внешний вид и функциональность не имеют к этому никакого отношения. Qt Creator издизайнделать Что Можно найти в котором переключаться между разными моделями чрезвычайно быстро и легко управлять. Переключение в каждый режим практически полностью меняет Qt GUI Основное содержание находится в содержании, и оно полностью достигло своей уникальной цели. давайте посмотрим 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 панель номеров):
как вы видете,Там очень полезная информация,有助Втыучитьсяэтоттипизшаблон适использовать В哪种проект。 Попробуйте просмотреть все варианты, чтобы ознакомиться с проекттипом. 知道Может能изпроекттипдаонхорошая идея,Прямо сейчасделатьты Нет会立Прямо сейчасиспользоватьэто们。 Ниже На скриншоте показано окно «Новый проект»:
[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (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
。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
ребенокдобрый),иэто们только影响добавить вэто们из Виджеты. Обратите внимание, что макет вовсе не является давиджетом, он используется для управления тем, как виджет отображается логически. Попробуйте разместить любой макетвиджет на интерфейсе существованияпользователя, а затем Существовать. ь Добавьте к нему несколько кнопок, чтобы показать виджет, чтобы увидеть, как его макетрукопривод меняется в зависимости от макетатипрукопривода. Просмотрите изображения каждого примера, чтобы научиться их изготовлять для себя. 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
добрый,Должендобрыйдаонабстрактныйдобрый,Предоставляет весь интерфейс, необходимый для доброгокнопкавиджета.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
,дальше изучать их,к и да, можете ли вы настроить их дальше.
QCommandLinkButton
)。
QDialogButtonBox
)。
Если вы совершенно не знакомы с MVC шаблон планирования, тогда я предлагаю вам остановиться на мгновение и сначала прочитать подробное изложение главы, убедиться, что в нем есть хотя бы что и как использовать. MVC (особенно да Qt) имеет базовые знания. Qt в документацииимядля“Модель/видпрограммирование”изискусствоглава,Вы можете начать с Qt Creator Доступ к статье в модели из"помощь". Для целей этой книги нам не нужна очень подробная информация о MVC модельизпонимать。 Да,Зависит от Это очень важно в архитектуре, и вы обязательно встретите это в существующем проекте, поэтому я рекомендую вам потратить некоторое время на его изучение. но,существовать Нет. 3 глава,“создавать Всесторонний Qt + OpenCV проект", представляем Волю Qt и OpenCV Использовать шаблон Нет同 проектирования,Но наша Воля основное внимание уделяет изданию книги.,потому чтодляэтодаон Нет常Всестороннийхозяин题,и Траверскнига Книгасерединавсе Может能изшаблон проект Воля совершенно бесполезен.
QListWidget
)QTreeWidget
)QTableWidget
)QGroupBox
)。QScrollArea
) 。QToolBox
)。QTabWidget
),Вы можете переключиться на эту страницу.QStackedWidget
)。QFrame
)。QWidget
добрыйтакой же,этодавсе 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 модульпосле,Ты можешькпозжесновапытаться。
QComboBox
):QLineEdit
)。QTextEdit
)。QPlainTextEdit
)。QSpinBox
)。QDoubleSpinBox
)。QTimeEdit
)。QDateEdit
)。QDateTimeEdit
)。QDial
)。QScrollBar
)。QSlider
)。QKeySequenceEdit
)。Нетотвечать ВоляэтотиQKeySequence
добрый Запутать,Должендобрый根книга Нетда Виджеты. QKeySequenceEdit
использовать Вотпользователь ТамполучатьQKeySequence
。 существоватьиметьQKeySequence
после,нас Можетк Воля ЧтоиQShortcut
илиQAction
добрыйобъединитьиспользоватьккурок Нет同изфункция/слот。 книга章позже Воляпредставлять Сигнал/слотизпредставлять。
QLabel
)。Text Edit
виджет几乎такой же,Даиметьсуществовать Связь Из间导航из附加Функция(Этот виджетиз эквивалентен Qt добрыйсказатьдляQTextBrowser
)。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)]
сейчассуществовать Должендлянасизпроектсоздаватьпользовательинтерфейс Понятно:
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 Когда для мы экономим много времени.
Label
,Line Edit
иPush Button
。 Этот флажок «Волядасуществовать» находится чуть выше нижнего края, как видно из макета.[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (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
час,насизиметь в видудапервыйвыбиратьвиджет(на самом деледаконтейнервиджетилиокно),Затемиспользоватьвершинаинструментстолбецначальствоизмакеткнопкавыбиратьправильныйизмакеттип。
Vertical
。
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 Разработчики следуют соглашению об именах, что также помогает улучшить чтение кода.
сейчассуществовать,Интерфейс нашего изпользователя полностью дизайнен,Мы можем начать с написания кода приложения. Сейчас существуют,насизприложениепо сути Тольконодаонпользовательинтерфейс,этона самом деле Чтотакже Нет做。 Сначала нам нужно OpenCV добавить а именнопроектсередина。 существовать Нет. 1 Глава «OpenCV и Введение в Qt" ты видел Воля OpenCV добавить в Qt проектиз краткое введение. В настоящее время мы, Воля, принимаем дальнейшие меры и обеспечиваем их выполнение в соответствии с Нет. 1 章серединаизиллюстрироватьправильный Установитьи Конфигурация OpenCV,и Можно найти Скомпилировать и построить наш проект на всех трех основных операционных системах без каких-либо изменений. "ОткрытоеCV и Введение в Qt”。
поэтому,первыйсуществоватькодредактироватьустройствосередина Открытьпроектиз PRO Документ, это Воляда Qt Creator серединаиз“редактировать”модель。 возможно, ты заметил,этосказатьдляHello_Qt_OpenCV.pro
。 Вам необходимо добавить следующий код в конец файла:
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
свойствоценить引использоватьпользовательинтерфейсначальствоизлюбойвиджет. Воляэто们视для Можно найти виспользовак получает доступ к этим именам переменных виджетизма в коде.
Данаспроектиз编码частьнеобходимыйизшаг:
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)]
mainwindow.h
документсерединадобавить в Понятноновыйфункция.mainwindow.h
середина,Добавлен следующий контент: private slots:
void on_inputPushButton_pressed();
Дас动добавить вmainwindow.cpp
изкод:
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
свойство,кудобныйпользователь Можетк Видетьихвыбиратьизвесьдокументимяипуть。 первый让нас看один Внизкодиз Появление,Затем逐步представлятьэто:
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
начальстворуководитьэтотдействовать,И для его написания следующий код:
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 добрыйголоваиз Кусочекнабор,Как показано ниже:
#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
добрыйсередина:
protected:
void closeEvent(QCloseEvent *event);
этототвечать Должен Входитьmainwindow.h
документсерединаиздобрыйопределение。 Выделенный слот на передней панели кажется хорошим местом.сейчассуществовать,переключиться наmainwindow.cpp
и Воляк Внизкод段добавить в Конец файла:
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
середина,Среди частных членов существуют:
void loadSettings();
void saveSettings();
ДаloadSettings
функциянеобходимыйизкод:
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
из:
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
добрыйизструктураустройствосередина。 У вас должен быть такой конструктор:
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
добрыйиздокумент页面。 Обратите внимание на первые две строчки после описания:
#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 Параметры по умолчанию делают почти все, что им нужно, но есть некоторые задачи, которые они не умеют выполнять. 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 из инструмента фильтра немедленно существовать. Найдите необходимые настройки в окне «Параметры»:
[Не удалось передать изображение по внешней ссылке. Исходный сайт может иметь механизм защиты от кражи. Рекомендуется сохранить изображение и загрузить его напрямую (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Нет同шаблон проектирования,кикакиспользоватьдобрыйпохожийизмодель Приходитьстроить易Вподдерживатьи Расширятьизприложение.
Зависит Профессиональные приложения никогда не станут для в силу каких-то случайных обстоятельств. Они были такими с самого начала. конечно,Легче сказать, чем сделать,Даеслитыуже经知道каксоздавать Можетклегкий Расширять,поддерживать,Расширятьисделанный на заказиз Приложение黄金法но,этотвсе еще Раночень容易。 黄金法но Толькодаон Простойизконцепция,Счастливая изда Qt рамка уже имеет средства для реализации и строит приложение стандартизированным способом. пожалуйста, обрати внимание,В этом смысле,модульизменять Неттолько意味着Библиотекаили Нет同изисходный кодмодуль,иисуществовать意义начальство说модульизменятьдаобратитесь к Приложениекаждый Обязанностии Функция Вседанезависимый Вдругой Обязанностисоздаватьи Строить。 На самом деле это именно то, что Qt и OpenCV сам создаюиз путь. Изприложение модуля может быть легко расширено даже разными разработчиками из разных фониз. модульизменятьизприложение Можетк Расширятьдляподдерживатьмного Нет同изязык,Тема (стиль или внешний вид),или лучше изда,Множество различных функций.
существоватькнига章середина,Мы, Воля, берем на себя очень важную и жизненно важную задачу:,Прямо сейчасдляиспользовать Qt и OpenCV рамкаизвсестороннийкомпьютерное инфраструктура создания приложений для зрения (или архитектура). Вы научитесь создавать Qt Приложения, которые можно масштабировать даже после их развертывания (доставки пользователю). На самом деле это означает много вещей, в том числе как добавить новый язык в ваше приложение, как добавить новый стиль в ваше приложение и, самое главное, как создать его на основе плагина. Qt Приложения можно расширять, добавляя к ним новые.
Мы Воляпроходить траверс Qt структура проекта и содержит файлы для изучения сборки Qt Что обычно происходит при применении. Тогда мы научимся Qt и OpenCV Некоторые из наиболее распространенных изшаблонов проектирование, к выпуску рамки как использовать эти шаблоны проектированияиз Преимущества。 Затем мы, Воля, узнаем, как создатель может использовать расширение расширения из приложения. Также мы добавили новые стили и новые языки из информации в приложении «Воля Learn связанныйсуществовать». В конце этой главы мы, Воля, смогли создать комплексное и зкомпьютерное зрение Приложениебаза础,Приложение кроссплатформенное,многоязычный,На основе плагиниз,ииметь Можетсопределениеиз Появление。 Это базовое приложение Волясуществовать расширено в следующих двух главах: Нет. 4 глава,“Mat
иQImage
”и Нет. 5 глава,“Графический видрамка”,Затемсуществоватьиз остальной части книгииспользоватьплагин,尤Чтодасуществовать Нет. 6 Глава «OpenCV Изучив «Обработку изображений», мы начали углубленно изучать компьютерное зрениехозяин题и OpenCV библиотека.
В этой главе мы рассматриваем следующие темы:
существовать Нет. 2 глава,»создавать из Нет.а Qt и OpenCV проект" вы научились создавать простые из Qt + OpenCV приложениеHello_Qt_OpenCV
。 Проект почти включает в себя Qt Предоставить извсебазакнига Функция,Хотя мы не слишком много говорили о том, как Воляпроект встроен в приложение дляиз с пользовательским интерфейсом и (почти приемлемо). существуют В этом разделе,ты Научимся Что происходит за кулисами, когда вы нажимаете кнопку «Запустить». Это поможет нам лучше понять Qt Структура проекта и все файлы из целей в папке проекта. Сначала зайдите в папку Открытьпроект и просмотрите несколько документов один за другим. поэтому,нассуществоватьHello_Qt_OpenCV
папкасередина Включатьк Внизсодержание:
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
модуль:
QT += core gui
让нассуществоватьHello_Qt_OpenCV.pro
документсерединадальше Просматривать; Следующие строки сразу привлекают ваше внимание:
TARGET = Hello_Qt_OpenCV
TEMPLATE = app
Эти ХОРОШОтольковыражатьTARGET
имядляHello_Qt_OpenCV
,Данаспроектизимя,TEMPLATE
типapp
выражатьнасизпроектдаонприложение. У нас также есть следующее:
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
Очевидно, это способ включения заголовочных файлов, исходных файлов и файлов интерфейса (форм). Мы даже Воля себе из кода добавим в PRO файл следующим образом:
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
документ,Посмотрите, что включено:
#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
ки Что底слой Сигнал/час隙механизмисобытиеиметь дело ссистемакак工делатьизбаза础:
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
для самого простого способа описать это,создавать ПонятноQApplication
добрыйиз Пример,и Воляприложениепараметр(в целомпроходить Заказ ХОРОШОилитерминальный пропуск)передача Даватьимядляa
изновый Пример。 Затем,создаватьнасизMainWindow
добрыйиз Пример,Затем Воля Чтопоказывать出Приходить。 наконец,调использоватьQApplication
добрыйизexec()
функция,Комфортное приложение Входить в основной контур,И сохраняйте Открытьсостояние, пока окно не закроется.
Изучить цикл событий: Как это работает,пожалуйстапытатьсяудалитьнаконецодин ХОРОШО,Посмотрите, что произойдет. При подаче заявки вы можете заметить, что окно на самом деле появляется только на короткое время, а затем сразу же закрывается. Дапотому чтодлянасизприложение Нет再иметьсобытиецикл,это立Прямо сейчасприезжать达Приложениеконец,ивсесодержание Всеот Внутри存середина清除,поэтому Долженокноодеяло关闭。сейчассуществовать,Напишите строку Воля обратно,Как и следовало ожидать от,окно保持Открытьсостояние,потому чтодлятолькокогдасуществоватькодсерединаиз某индивидуальныйместо(любойместо)调использовать Понятноexit()
функциячас,exec()
функция才возвращаться,иэтовозвращаться Зависит отexit()
настраиватьизценить ]。
сейчассуществовать,Перейдем к следующим трем файлам,У них одинаковое имя,но Расширятьимя Нет同。 это们даmainwindow
заголовок,источникипользовательинтерфейсдокумент.сейчассуществовать,Вы Волясуществовать Нет. 2 глава,»создавать из Нет.а Qt и OpenCV проект» в «Учиться» отвечает за код и интерфейс пользователя приложения из фактического документа. Это подводит нас еще к двум Qt Внутри部инструмент,сказатьдля元верно象компиляторипользовательинтерфейскомпилятор。
Мы уже знаем, что стандарт 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
документсередина Место Включатьизсодержание:
...
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 Внутри部компилятор,Ты Волясуществоватькнига章серединаверно Чторуководитьучиться。
Всякий раз, когда создается интерфейс пользователя из Qt приложениечас,Сразу会执ХОРОШОсказатьдляuic
из Qt Внутри部инструмент Приходитьиметь дело с*.ui
документи Воля Что Конвертироватьдля Можетсуществовать C++ кодсерединаиспользоватьиздобрыйиисточниккод. существуем из-за случая,mainwindow.h
одеяло Конвертироватьдляui_mainwindow.h
документ,Ты можешьксновасуществоватьBuild
папкасерединаоказаться Должендокумент. возможно, ты заметил Понятноэтотодинточка,Да让насупомянултыизmainwindow.cpp
документуже经Включать Понятноэтотголовадокумент. Проверьте самую верхнюю часть файла, и вы найдете следующие две строки, содержащие:
#include "mainwindow.h"
#include "ui_mainwindow.h"
тыуже经知道mainwindow.h
документиз Кусочекнабори Кусочекнабор(существоватьProject
папкасередина),итолькоучитьсяприезжатьui_mainwindow.h
на самом деледа Кусочек ВBuild
папка Внутриизгенерироватьизисточникдокумент.
если Проверятьui_mainwindow.h
документизсодержание,ты заметишьодинимядляUi_MainWindow
издобрый,у него естьдвафункция:setupUi
иretranslateUi
。 setupUi
функцияужес动добавить в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) для получения) реализация да Синглтон из Пример. Обратите внимание, что ГСЧ добрыйкнига身Нетда Синглтон。 |
Ссылки:
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 поддерживатьиспользовать*.qrc
документ(资источник收набордокумент)руководить资источникуправлять,Этидокумент Толькода XML Файлы, содержащие связанную информацию, должны существовать в файле ресурсов в нашем приложении. 让нас看один Простойиз Пример,исуществоватьнасизHello_Qt_openCV
приложениесередина Включатьодиникона,клучшеучиться Система ресурсов Как работает Qtiz:
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)]
resources
。 По умолчанию путь должен быть указан к папке дляизпроекта, поэтому оставьте все как есть. Нажмите «Далее», а затем нажмите «Заканчивать». наконец,Ты Волясуществоватьпроектсерединадобавить водинимядляresources.qrc
изновыйдокумент. еслитысуществовать Qt Creator середина Открытьэтотдокумент(проходить Щелкните правой кнопкой мышищелкнутьивыбирать“существоватьредактироватьустройствосередина Открыть”),Волясуществовать Qt Creator Показать ресурс в.Добавить новый файл
добавить префикс
существоватьздесь,документ Сразудатыхотетьдобавить впроектсерединаизлюбойдокумент. Да,вперед缀по сутидаон伪папка(если需хотеть,нодаонконтейнер),Он содержит много документов. Обратите внимание.,Это не обязательно означает папку «из» или подпапку внутри папки проекта.,И это всего лишь способ сгруппировать файлы ресурсов в представлении.
images
。*.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
документизпутьнравиться Вниз:
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
свойствонастраиватьдляк Внизсодержание:
border: 2px solid #222222;
border-radius: 10px;
background-color: #9999ff;
min-width: 80px;
min-height: 35px;
использоватьoutputPushButton
做такой жеизиметь значение; Да,на этот раз,существоватьstyleSheet
свойствосерединаиспользоватьк Вниз Заказ:
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 из правил стиля Зависит в таблицах стилей от Селектор и объявление состоит из. Селектор указывает стиль «Воляиспользовать» и «Звиджет», тогда как объявление объявляет только сам стиль «да». Аналогично, перед существованием у нас есть только объявление использования, а селектор да (неявно) получает таблицу стилей из Виджеты. Даон例ребенок:
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
виджетначальствоиз КВнизи Кначальство箭головакнопка。 Можеткиспользовать::
运算символвыберите их,Как показано ниже:
QSpinBox::down-button
Всегда не забывайте обращаться Qt Creator режим помощи Внизиз“Qt Ссылка на таблицу стилей» текст глава,кполучать (или БОЛЬШЕ или меньше) Каждыйвиджетиз полного списка дочерних элементов управления. Qt даон Нет断发展израмка,и会обычныйдобавить вновый Функция,поэтому没有Сравниватьэтос己издокумент更好изссылка Понятно。
Каждый виджет Windows доступен при определенном псевдосостоянии.,Например,зависать,в соответствии с Внизждать. Можеткиспользовать:
运算символсуществоватьстиль表серединавыберите их,Как показано ниже:
QRadioButton:!hover { color: black }
Как и в случае с дочерними элементами управления, всегда обращайтесь к Qt Creator режим помощи Внизиз Qt стиль表ссылка,кполучатькаждыйвиджетиз适использоватьпсевдогосударство Список表。
Вы можете установить таблицы стилей для всего приложения, родительского и дочерних окон. существуют Фронт из Пример, мы установили только два дочерния Таблица стилей виджетиз. каждыйокновиджетизстиль Все Воля Выбирать决Вкаскад规но,этот意味着каждыйокновиджетвозвращаться Воляполучатьсуществоватьотецокновиджетилиприложение Средние настройки изстиль规но(еслидля Чтонастраивать Понятностиль表)。 Мы можем воспользоваться этим фактом, чтобы избежать повторной установки правил стиля для определенного окна во всем приложении.
сейчассуществовать,让наспытатьсяMainWindow
серединаизк Внизстиль表,этосуществоватьодин Простойиз Примерсерединаобъединить Понятноты学приезжатьизвсе知识。 убеждатьсяудалитьвсе先впереднастраиватьизстиль表(длядва“Просматривать”кнопка),исуществоватьокновиджетизstylesheet
свойствосередина Простой地использоватьк Внизсодержание:
*
{
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 добрый, отвечающий за обработку вывода (отображения) текста при интернационализации. Вам просто нужно убедиться в следующем:
tr()
функциясередина Включатькодсерединаизвсеискусство字заявление,или или конкретно,выбиратьдругойязыкчас需хотетьпереводитьизвсеискусство字заявление。Например,существоватькодсередина,еслиты需хотетьписать Такой какOpen Input Image
Издобрыйизискусство字заявление(СразукартинасуществоватьHello_Qt_OpenCV
Примерсередина Место做из Таким образом),Только Воля Чтопередача Даватьtr
функцияиписатьtr("Open Input Image")
。 Инструмент дизайна не делает этого и применяется только к тексту внутри кода. При настройке свойства в существующем дизайне вам нужна только текстовая строка use.
TRANSLATIONS
Приходитьобратитесь к定это们,СразукартинапроектдокументсерединаизSOURCES
иHEADERS
один样。Например,Если вы хотите, чтобы приложение существовало, используйте перевод на немецкий и турецкий языки.,пожалуйста Воляк Внизсодержаниедобавить впроект(*.PRO
)документсередина:
TRANSLATIONS = translation_de.ts translation_tr.ts
Убедитесь, что файл перевода для каждого всегда имеет четкое имя. Прямо сейчасчтобы ты могк随意命имя,такжебольшинствоиспользовать Включатьизязыккод Приходить命имяэто们(tr
выражать土耳Что语,de
выражать德语,и т. д),нравитьсявперед面из Пример Место示。 Это также помогает Qt Linguist инструмент(Ты Волясуществоватьназад面изучать)учитьсяпереводитьизглаз标язык。
lupdate
инструментсоздавать TS файлы (обновите их, если они уже существуют). lupdate
да Qt инструмент,Можетсуществоватьвсеисходный коди UI Найдите в файле переводимый текст, а затем обновите создателей, упомянутых на предыдущем шаге. TS документ. Ответственныйпереводить Приложениелюди员Можеткиспользовать Qt Linguist инструментлегкий Открыть TS файлов и сосредоточьтесь на простом интерфейсе пользователя для перевода приложения.lupdate
Кусочек В Qt Установитьизbin
папка Внутри。 Например,существовать Windows OS На пути из добрый выглядит так:
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
Ранее мы создали проект):
C:\Qt\Qt5.9.1\5.9.1\msvc2015\bin\lrelease.exe Hello_Qt_OpenCV.pro
проектировать После этого Заказа, если вы Войдете в папку проекта, вы заметите, что текущее существование было заменено ранее указанным файлом существующего проекта. TS документ. 随着тыизприложение越Приходить越большой,обычныйбегатьlupdate
Нет常重хотеть,Он может извлекать новые строки, которые необходимо перевести.,идальше Расширятьмногоязычныйподдерживать。
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 инструмент, пожалуйста, обязательно руководите сохранением.
lrelease
инструмент。использоватьlrelease
иlupdate
такой же,тысуществоватьвперед面изшагсерединаучитьсяприезжать。 Просто все будутlupdate
Заказзаменятьдляlrelease
,Вот и все.
Вы научились использовать Система ресурсов 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)]
QTranslator
добрыйсуществоватьтыизприложениесерединаиспользовать Различныйязык,возвращаться Можно найти запускать при существовании переключения между различными языками. 让насснова回приезжать ПримерпроектHello_Qt_OpenCV
。 Существует множество способов использования переводчика в приложении, но сейчас мы начнем с самого простого метода. первый ВоляQTranslator
Включатьдокументдобавить вmainwindow.h
документсередина,исуществоватьMainWindow
добрыйсерединаопределениедвачастныйQTranslator
верно象,Как показано ниже: QTranslator *turkishTranslator;
QTranslator *germanTranslator;
loadSettings
функцияпосле,Воляк Внизсодержаниедобавить вMainWindow
структураустройствокодсередина: turkishTranslator = new QTranslator(this);
turkishTranslator
->load(":/translations/translation_tr.qm");
germanTranslator = new QTranslator(this);
germanTranslator
->load(":/translations/translation_de.qm");
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)]
Внизу «Существующийдизайниз» вы можете найти действие «Редпресс». Очевидно, теперь у вас здесь есть три записи, которые автоматически отображаются в главном меню. это们каждый Всеверноотвечать Втысуществоватьхозяинменюсерединавходитьиз Каждый видязыкимя。
trigger()
,Затемщелкнуть“Конечно”。 Другими словами (поскольку вы существует Нет. 2 глава,»создавать из Нет.а Qt и OpenCV проект”середина Местоучитьсяиз),дляactionTurkish
верно象изкурокслотписатьк Внизкод ХОРОШО: void MainWindow::on_actionTurkish_triggered()
{
qApp->installTranslator(turkishTranslator);
}
actionGerman
верно象добавить вк Вниз ХОРОШО。 по сути,повторитьиллюстрировать,но Воля Что适отвечать ВactionTurkish
верно象: void MainWindow::on_actionGerman_triggered()
{
qApp->installTranslator(germanTranslator);
}
actionEnglish
верно象执ХОРОШОтакой жеиздействовать。 на этот раз,ты需хотетьотприложениесерединаудалитьпереводитьустройство,потому чтодля Английскийданас Приложениепо умолчаниюязык: void MainWindow::on_actionEnglish_triggered()
{
qApp->removeTranslator(turkishTranslator);
qApp->removeTranslator(germanTranslator);
}
QMainWindow
добрыйизchangeEvent
。 каждый разиспользоватьвперед面изinstallTranslator
иremoveTranslator
функция Установитьили移除переводитьустройствочас,Language Change
событие Все会发送приезжатьприложениесерединаизвсеокно。 хотеть捕获этотсобытие,и обязательно перезагрузите окно при изменении языка,нас需хотетьсуществоватьпрограммасерединакрышкаchangeEvent
функция. Просто Воляк следующую строку кода добавьте вmainwindow.h
документсерединаMainWindow
добрыйиззащищенный член,Сразусуществоватьты先впередопределениеcloseEvent
из Кусочекнаборпосле: void changeEvent(QEvent *event);
mainwindow.cpp
документсередина: 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
делатьдлядокументимя,Ран Преемник Продолжениеруководитьдействовать,直приезжать Входитькодредактироватьустройствомодель。 Воля кода меняет дляк следующего содержания:
#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 создатьиз в любом заголовочном файле:
#ifndef CVPLUGININTERFACE_H
#define CVPLUGININTERFACE_H
...
#endif // CVPLUGININTERFACE_H
Они гарантируют, что существование каждого заголовочного файла будет включено (и обработано) только один раз во время компиляции приложения. В принципе, есть много других способов. найти в C++ середина实сейчастакой жеизглаз标,но Да Самый широкий泛приниматьииспользоватьизметод,尤Чтода Qt и OpenCV Рамка получила высшую степень поддержки на платформе. и Qt Creator использовать вместе, всегда автоматически Воля его добавляет в заголовочный файл без выполнения каких-либо дополнительных действий.
Предыдущий код в основном да Qt Все необходимое в плагине интерфейса. Существует Примеринтерфейса, у нас есть только два простых типа функции, нам нужно подключиться к Я жду, но, как мы увидим позже, воля, параметры поддержки, язык и т. д., нам нужно и многое другое. Да,длянасиз Пример,Этого должно быть достаточно.
дляодин般из C++ Очень важное замечание для разработчиков: да, перед публичным участником он существует. C++ Известный как виртуальный деструктор, это один из наиболее важных методов, который многие люди забывают включить, не обращая на него особого внимания. Поэтому лучше проверить его истинное значение и запомнить, чтобы избежать утечек памяти, особенно дасуществоватьиспользовать. Qt плагинчас:
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
ХОРОШОдаонхорошая привычка:
CONFIG += plugin
Теперь существуют, нам нужно к OpenCV добавить а именноплагинпроектсередина。 К настоящему времени это должно быть для вас проще простого. Только Воляк Внизсодержаниедобавить вплагиниз*.PRO
документсередина,Сразукартина ИзвпередиспользоватьHello_Qt_OpenCV
проект Место做из Таким образом:
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
документируководитьнравиться Вниз Исправлять:
#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 Библиотека добрый определение внешнего вида. Но да, только то, что мы добавили, делает это забавным изложением. Давайте рассмотрим предыдущий код и посмотрим, что такое настоящее добавление. в Этот добрый серединаизконтента:
cvplugininterface.h
головадокумент.
Median_filter_plugin
добрыйнаследовать ПонятноQObject
иCvPluginInterface
。
Q_OBJECT
Макрос,и По умолчанию Должно быть сохраненосуществовать Влюбой Qt добрыйсерединакпозволять Qt Конкретные функции (такие как сигналы и слоты). ВнизодиндаQ_PLUGIN_METADATA
,это需хотетьсуществоватьплагинизисходный кодсередина恰好出сейчасодин次,для добавлениясвязанныйплагинизметаданные; наконецодинQ_INTERFACES
需хотетьзаявлениесуществоватьплагинсередина实сейчасизинтерфейс。 Данеобходимыйиз Макрос:
Q_OBJECT
Q_PLUGIN_METADATA
Q_INTERFACES
description
иprocessImage
функцияизопределение。 существоватьздесь,Наша Воля действительно определяет функцию плагиниз.,Вместо того, чтобы датолькоиметьзаявление Вместо того, чтобы да实сейчасизинтерфейсдобрый.median_filter_plugin.cpp
документсередина。 Убедитесь, что воляк следующие три функциидобавить вmedian_filter_plugin.cpp
документизнижний: 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
документсередина(тыуже经достаточноучитьсяэтотсодержание),Однако Преемник продолжил: «Создательдобрый контент похож на интерфейс изпользователя, представленный ниже:
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)]
Убедитесь, что тип использования такой же, как на рисунке выше.
cvplugininterface.h
документдобавить в папку проекта, а затем используйте опцию «Добавить существующие файлы» Воля ее добавьте в впроекте, как в создателе плагина.
mainwindow.h
документ,Как показано ниже:
#include <QDir>
#include <QFileDialog>
#include <QMessageBox>
#include <QPluginLoader>
#include <QFileInfoList>
#include "opencv2/opencv.hpp"
#include "cvplugininterface.h"
};
Извперед,КMainWindow
добрыйизчастныйчлендобавить водинфункция,Кажется, это хорошее место: void getPluginsList();
mainwindow.cpp
и Воляк Внизопределениедобавить вдокументвершина,Сразу послесуществоватьлюбойсуществующий#include
ХОРОШОпосле: #define FILTERS_SUBFOLDER "/filter_plugins/"
mainwindow.cpp
,этотпо сутидаgetPluginsList
функцияиз实сейчас: 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
папка Внутри Руководствосоздаватьэтотпапка,Затем Волясуществоватьначальствоодин步середина Строитьплагинкопироватьприезжать Долженновыйсоздаватьизпапкасередина。)Ниже приводится для получения плагина фильтра по прямому пути из информации. Подпапки: qApp->applicationDirPath() + FILTERS_SUBFOLDER
QDir
добрыйизentryInfoList
функцияотпапкасерединаизвлекатьQFileInfoList
。 QFileInfoList
добрыйкнига身по сутидаонQList
добрый,Чтосередина ВключатьQFileInfo
элемент(QList<QFileInfo>
),каждыйQFileInfo
элемент Всепоставлятьсвязанный磁盘начальстводокументизинформация。 существуют В этом случае,каждыйдокумент Вседаонплагин。foreach
циклсерединаиздокумент Список表,это检查plugins
папкасерединаизкаждыйдокумент,ªУбедитесь, что вы принимаете только плагины (библиотеки),пожалуйстаиспользоватьк Внизфункция: QLibrary::isLibrary
dynamic_cast<CvPluginInterface*>(pluginLoader.instance())
CvPluginInterface
совместимый),ужедобавить в нашем окнеиз Виджет список, а затем удалить. Мы можем найти Просто перезагрузите его, когда это необходимо.QMessageBox
Кпользовательпоказывать有использоватьизинформация。 такой же,наконец,Если список пуст,означает, что плагина нет,Окно на изWindowвиджет отключено,Приложение недоступно.setupUi
调использоватьпослеотMainWindow
структураустройство调использоватьэтотфункция.inputImgButton
изкод,Долженкодиспользовать ВОткрытьизображениедокумент. здесьда: 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);
}
}
Мы видели этот код раньше, и он не нуждается в объяснениях. это Толькодапозволятьты Открытьизображениедокументиубеждатьсяужеправильныйвыбиратьэто。
helpButton
писатькод,Долженкод Волясуществоватьплагинсерединапоказыватьdescription
функцияизрезультат: 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
функцияполучать Что Пример,наконец,нас Воляпроходитьинтерфейссуществоватьплагинсередина调использовать Долженфункция.
filterButton
。 唯одинизокруг Недана этот раз,Мы Воля вызываем актуальное из функции фильтра,Как показано ниже: 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
приложение,Нам необходимо выполнить следующие операции:
Plugin_User
проектизгенерироватьпапкасередина Создайтеимядляfilter_plugins
изпапка。 Дасоздаватьпроектисполняемый файлизпапка。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 режим помощь Внизиз статьи «Плагин развертывания».
тысуществоватькнига章середина学приезжатьизвсесодержание Всецельсуществоватьделатьты Подготовитьначинатьстроить Всестороннийкомпьютерное Приложение зрение, приложение Воля выполняет следующие операции:
поэтому,отсейчассуществоватьначинать,Мы, Воля, рассмотрим ваше существование этого главы, изучим все факты в первых нескольких главах.,для применения закладывает основу,Например:
QSettings
добрый Приходить实сейчасэто,Вы научились использоватьэто。дляэтот,除Нетпользовательот Приложениенастраивать页面середина Руководствовыбиратьхозяин题,в противном случаенас Воля Простой地предполагалосьприложениеиметькнига机Появление。 Тема Воляда Qt стиль表,держатьсуществоватьприложениеисполняемый файл Местосуществоватьиз同одинпапкасерединаизthemes
папкасередина,стиль表документиз Расширятьимя Волядляthm
。 Выбранная тема (а точнее таблица стилей) Волясуществоватьпроект загружается с диска.
Это может быть Qt двоичныйязыкдокумент放существоватьприложениеисполняемый файл Местосуществоватьизпапкасерединаизlanguages
папкасередина Приходить Заканчивать。 Мы можем киспользовать язык системы по умолчанию и загрузить пользовательиз языка (если у нас есть его перевод и бинарный языковой файл); В противном случае мы можем загрузить язык по умолчанию, например английский. насвозвращаться Можеткпозволятьпользовательсуществоватьбегатьчаспроходитьотнастраивать页面серединавыбиратьприложение Приходить Изменять Чтоязык。
для Для достижения этого,нас需хотеть有одиникнига章середина Место Видетьиз Нет常Взаимнопохожийизплагининтерфейс(CvPluginInterface
),Долженинтерфейс Воляизображениеделатьдлявходитьи产生выход。 Затем нам, Воля, нужно точно так же, как показано в этой главе, загрузить ииспользовать этот плагин. нас Воляпредполагалосьплагин Кусочек Вимядляcvplugins
изпапкасередина,Эта папка Воля хранится в существующей папке, где находятся исполняемые файлы нашего приложения.
кроме,нас需хотетьучитыватькомпьютерное Есть некоторые препятствия в применении зрения, а именно Воля. существовать При создании приложений важно оставаться на шаг впереди; В противном случае вы окажетесь в затруднительной ситуации, из которой нет выхода. поэтому,Они есть:
Mat
иQImage
”серединапредставлятьвсесодержание。сейчассуществовать,Вы можете использовать Qt Creator Создайте Qt Widgets приложениеи Воля Что命имядляComputer_Vision
。 Мы продлим действие этого приложения до тех пор, пока 9 Глава, «Видеоразбор» заканчивается, а дальше мы с Волей шаг за шагом вводим все новые понятия. Опираясь на знания, полученные из предыдущих глав этой главы, вы сможете самостоятельно создать первые три пункта (для тем, языков иплагинизподдержки) из приведенного выше основного списка. Настоятельно рекомендуется хотя бы попытаться сделай это; Но в следующих двух главах мы расширим эту тему. позже,существовать Нет. 5 глава,“Графический видрамка”结束час,ВолядлятыпоставлятьскачатьComputer_Vision
извесьбаза础проектиз Связь。 。 Долженбаза础проект Воля ВключатьодинMainWindow
добрый,Добрый умеет загружать и отображать графический интерфейс, содержащий изплагин. существует Проектсередина,Вы также найдете плагин интерфейса (хороший, похожий на тот, который показан в этой главе).,Даиметь Болееиз Функция,Могут быть реализованы следующие функции:
Долженбаза础проектисходный код Воля Включатьитысуществоватькнига章середина Видетьиз Функциядобрыйпохожийиз Функция,к Установить стиль,Изменятьязыкждать.
существоватьтыделатьдля Разработчикиз Карьераили Исследовать工делать期间,ты会经常遇приезжатьустойчивыйэтотиндивидуальный词。 книга章изглазизда Ктыпредставлятьодин般создаватьустойчивый Приложениебазакнигаконцепция,尤Чтодаиспользовать 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 добрый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 Кусочек беззнаковое целое число (или байт):
Mat matrix(10, 10, CV_8UC(1));
создать то же самое из матрицы,ииспользовать0
изценитьисходныйизменять Чтовсеэлемент:
Mat matrix(10, 10, CV_8UC(1), Scalar(0);
Как показано в предыдущем коде, конструктор изз имеет один параметр — количество строк и два параметра — количество столбцов в матрице. Но три параметра да, Нет очень важны, это Волятип, номер кусочка и номер канала замешаны в макросе. Да Макросизмодельи Можеткиспользоватьизценить:
CV_<bits><type>C(<channels>)
давайте посмотрим Макросизкаждыйчасть Всеиспользовать В:
<bits>
Можеткзаменятьдля:
8
:использовать В无символ号и有символ号整число16
:использовать В无символ号и有символ号整число32
:использовать В无символ号и有символ号整числокичисло с плавающей запятой64
:использовать В无символ号и有символ号число с плавающей запятой<type>
Можеткзаменятьдля:
U
:использовать В无символ号整числоS
:использовать В有символ号整числоF
:использовать Вприноситьсимвол号изчисло с плавающей запятойТеоретически,<channels>
Можеткиспользоватьлюбойценитьзаменять,Дадляодин般изкомпьютерное алгоритма зрительных функций, оно будет не выше, чем 4。
еслииспользоватьизрядчисло Нет超Проходить Четыреиндивидуальный,но Можеткупущение<channels>
параметризлевая скобкаиправая скобка。 еслирядчислотолькодляодин,нотакже Можетк完全упущение<channels>
ивперед面изC
。 для Понятнополучать更好из Можетчитатьсексиодин致секс,большинствоиспользоватьсуществоватьвперед面иназад面из Примерсерединаиспользоватьизстандартныймодель,исуществоватьиспользоватьэтот种широкоиспользоватьиз Макросиз Способсередина保持один致такжедаодин种良好изпрограммирование Привычка。
Создайтедлина стороныдля 10 ииметьдваdouble
тип(64 Кусочек)рядэлементизмного维данныенабор(три维число Группа),ииспользовать1.0
изценитьисходныйизменятьвсеценить. Отображается следующим образом:
int sizes[] = {10, 10, 10};
Mat cube(3, sizes, CV_64FC(2), Scalar::all(1.0));
тывозвращаться МожеткпозжеиспользоватьMat
добрыйизcreate
метод Приходить Изменять Чтобольшой小итип。 Даон例ребенок:
Mat matrix;
// ...
matrix.create(10, 10, CV_8UC(1));
Mat
добрыйиз先впередсодержание无关紧хотеть。 по сути,Воляаллудалить (безопасная очистка),А Воля выделяет из памяти, выделенной обратно операционной системе),и СоздайтеновыйизMat
добрый.
Ты можешьк СоздайтеMat
добрый,Должендобрыйда另одинMat
добрыйизчасть。 Это называется длязаинтересованныйизобласть(ROI),когданас需хотетьдоступизображениеизчасть,Сразу好картинаэтоданезависимыйизображениечас,это特Не有использовать。 Например, когда мы хотим отфильтровать только часть изображения. Дасоздавать ROI Mat
добрыйизметод,Должендобрый Включатьодин50x50
Пиксель Ширинаизквадрат,отизображениеиз(X = 25, Y = 25)
Кусочекнаборначинать:
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
функция,Как показано ниже:
Mat imageCopy = image.clone();
гипотезаMat
изображение Включать先впередизизображение(Приходитьс先впередизглава),Вы можете См. раздел Пример кода, выберите изображение. ROI и сделайте выделение области из всех пикселей черным:
4: Mat roi(image, Rect(500, 138, 65, 65));
roi = Scalar(0);
тывозвращаться МожетквыбиратьMat
серединаизодинилимногоиндивидуальный ХОРОШОили Список,Его подход очень похож на наш подход к управлению рентабельностью инвестиций.,除Понятно需хотетьиспользоватьrow
,rowRange
,column
илиcolRange
существоватьMat
добрыйсередина起делатьиспользовать。 Дакак做:
Mat r = image.row(0); // first row
Mat c = image.row(0); // first column
Да另одиниспользоватьrowRange
иcolRange
функцияиз Пример,Эту функцию можно использовать для выбора диапазона строк и столбцов.,Вместо того, чтобы датольковыбиратьодин ХОРОШО。 к Вниз Примеркод Волясуществоватьизображениеизсередина Сердце产生один+
символ号,Что厚度для 20 пикселей:
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 Родительский объект существует внутри изображения в верхнем левом углу позиции Кусочек. Даон例ребенок:
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
: 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
функция:
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 Итератор:
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
функция:
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
добрыйсерединаиздоступметод Таким образом,Не все будут разделены пиксели один за другим,Мы можем написать следующий код:
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
функция Взаимно Сравнивать,этовозвращатьсяпоставлять Понятноодин种更好издоступметод(Можетк说更具Можетчитатьсекс)。 Даонкороткийиз Пример:
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
Из间руководитьявный Конвертироватьиз Состояние Вниз(Как вы увидите позже Воляиз,существование да требуется в некоторых случаях),каждыйдобрый Всепоставлять Понятноодин Можетиспользовать ВКонвертироватьэтоизфункция. другому:
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 серединаизMat
добрый,нас Можеткпродолжатьизучать Как приниматьизображениеидляизображениенаполнениеMat
добрыйкдальшеиметь дело сэто。 кактысуществоватьвпереднесколько главсередина简хотеть Видетьиз Таким образом,imread
функция Можетиспользовать Вот磁盘читать Выбиратьизображение. Даон例ребенок:
Mat image = imread("c:/dev/test.jpg", IMREAD_GRAYSCALE |
IMREAD_IGNORE_ORIENTATION);
imread
только Воля C++ std::string
добрыйделатьдля Нет.одинпараметр,ВоляImreadModes
логотипделатьдля Нет.二индивидуальныйпараметр。 если Зависит от В某种原потому что Не могущийчитать Выбиратьизображение,новозвращатьсянулевойизMat
добрый(data == NULL
),в противном случае,ВолявозвращатьсяMat
добрый,Чтосерединанаполнение Понятноиметь Нет.二индивидуальныйпараметрсерединаобратитесь к定изтипицветизизображение Пиксель。 в соответствии сплатформасерединанекоторыйизображениетипиз Можетиспользоватьсекс,imread
Можеткчитать Выбиратьк Внизизображениетип:
\*.bmp
,\*.dib
\*.jpeg
,\*.jpg
,\*.jpe
\*.jp2
\*.png
\*.webp
\*.pbm
,\*.pgm
,\*.ppm
,\*.pxm
,\*.pnm
\*.sr
,\*.ras
\*.tiff
,\*.tif
\*.exr
\*.hdr
,\*.pic
Ты можешьк ВидетьImreadModes
перечислятьвыражать Можеткпередача Даватьimread
функцияиз Может能логотип。 В примере, мы используем следующий контент:
IMREAD_GRAYSCALE | IMREAD_IGNORE_ORIENTATION
Это означает, что мы хотим, чтобы изображение Воля загружало изображение в оттенках серого, а также хотим игнорировать сохранение существующего файла изображения из EXIF из информации о направлении в части данных.
OpenCV Также поддержкачитать несколько страниц с изображениями документа. поэтому,ты需хотетьиспользоватьimreadmulti
функция. Даон Простойиз例ребенок:
std::vector<Mat> multiplePages;
bool success = imreadmulti("c:/dev/multi-page.tif", multiplePages,
IMREAD_COLOR);
除Понятноimread
иimreadmulti
,OpenCV возвращатьсяподдерживатьиспользоватьimdecode
функцияот存储缓冲округчитать Выбиратьизображение. Эта функция особенно полезна, если изображение не хранится на диске и его необходимо передать в потоковом режиме из сети. использовать法иimread
функция几乎такой же,除Понятно需хотетьдля Чтопоставлятьданные缓冲округ Вместо того, чтобы дадокументимя。
OpenCV серединаизimwrite
функция Можетиспользовать ВВоляизображениеписать磁盘начальствоиздокумент. Он использует имя файла с расширением для идентификации изображения в формате. хотетьсуществоватьimwrite
функциясерединасопределение Степень сжатияидобрыйпохожийнастраивать,ты需хотетьиспользоватьImwriteFlags
,ImwritePNGFlags
ждать. Даон Простойиз Пример,展示Понятнокаксуществоватьнастраивать Понятно渐进модельи质量Взаимновернониже(вышеиз Степень сжатия)из Состояние Вниз Воляизображениеписать JPG документ:
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
и Тольковходить:
imwrite("c:/dev/output.jpg", image, params);
связанныйimwrite
функциясерединаподдерживатьиздокументтипизтакой же Список表,пожалуйста参见начальствоодин节серединаизimread
функция.
除Понятноimwrite
,OpenCV возвращатьсяподдерживатьиспользоватьimencode
функция Воляизображениеписать Внутри存缓冲округ。 иimdecode
Взаимнопохожий,существоватьизображение需хотетьпередачаприезжатьданныепоток Вместо того, чтобы дадержатьприезжатьдокументсерединаиз Состояние Вниз,этот尤Что有использовать。 использовать法иimwrite
функция几乎такой же,除Понятно需хотетьдля Чтопоставлятьданные缓冲округ Вместо того, чтобы дадокументимя。 существуют В этом случае,Зависит от Имя файла не указано,поэтомуimdecode
возвращаться需хотеть Расширятьизображениек Решатьвыход Формат。
OpenCV предоставляет простой и удобный в использовании,сказатьдляVideoCapture
,Можно сохранять файлы с диска,устройство захвата,камераилисетьвидеопоток(Например,RTSP начальствоиз RTSP Адрес) читать Получить видео (или последовательность изображений). Интернет). Ты можешьк Простой地использоватьopen
функция Приходитьпытатьсяотлюбойупомянулизисточниктип Открытьвидео,Затемиспользоватьread
функция Волявходящийизвидеорамка捕获дляизображение. Даон例ребенок:
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 (и прочего):
qApp->processEvents();
позже,Мы Волясуществовать Нет. 8 глава,"многопоточность"и Нет. 9 глава,“видеоанализировать”серединаучитьсясвязанныйэтотвопросиз更правильныйиз解决метод。
Помимо знаний, которые мы получили,VideoCapture
добрыйвозвращатьсяпоставлятьдва重хотетьфункция,Прямо сейчасset
иget
。 Они доступны для многочисленных параметров Конфигурация добрыйиз. связанный Может Конфигурацияпараметризвесь Список表,Пожалуйста, обратитесь кVideoCaptureProperties
перечислять。
Даоннавсегданочасиз Навык。 Вы также можете киспользовать Qt Creator код Заканчивать Функция,и ТолькописатьCAP_PROP_
,потому чтодлявсе Взаимно关параметрвсекэтотначало。 По сути, этот трюк также работает для поиска любой функции, задержки перечисления. существовать Нет同из IDE использовать Эти советы обычно не обсуждаются в книгах о существовании, но существование может означать экономию большого количества времени в определенных ситуациях. к упомянутому ранее изcontentдля примера, например, вы Можно найти в Qt Creator кодредактироватьустройствосерединаписатьVideoCaptureProperties
,Затемв соответствии с住Ctrl
кнопкаищелкнуть。 этот Воляприноситьтыприезжатьперечислятьизисточник,и Ты можешьк Проверятьвсе Может能изперечислять,иесли Удачливыйизразговаривать,исходный кодсерединаиздокументтолькосуществоватьждать待着ты。
Даон Простойиз Пример,Можетчитать Выбиратьвидеосерединаизрамкачисло:
double frameCount = video.get(CAP_PROP_FRAME_COUNT);
Да另один Волявидеосередина抓рамкаустройствоизтекущий Кусочекнаборнастраиватьдлярамка号100
из Пример:
video.set(CAP_PROP_POS_FRAMES, 100);
существоватьиспользоватьначальствоиVideoCapture
добрый几乎такой же,Вы можете использоватьVideoWriter
добрый Волявидеоиизображение序Списокписать磁盘。 Да,существоватьписатьсVideoWriter
добрыйизвидеочас,需хотеть Более Некоторыйпараметр。 Даон例ребенок:
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 отвечает за то, чтобы сделать его быстрым и простым. GUI。 существоватькнига Книгаиз Нет. 3 глава,“создавать Всесторонний Qt + OpenCV проект”середина,насуже经использовать Понятномодульimshow
серединаширокоиспользоватьизфункция Изодин Приходитьбыстрыйпоказыватьизображение. Но да, когда мы хотим учиться Qt и для обработки GUI Когда созданиеиз является более сложной израмкой, мы Воля полностью пропускаем этот модуль и переходим к Qt тема. Но да, существовали до этого, стоит процитировать OpenCV в документации HighGUI модульизтекущийпредставлять:
"Хотя OpenCV дизайниспользовать В全面применить, и Можно найти Универсальность функций UI рамка (напр. Qt,WinForms или Cocoa)серединаиспользовать,Там вообще нет пользовательского интерфейса,но有час需хотетьбыстрыйпытаться Функцияи Может视изменятьрезультат。Это да HighGUI модульиздизайнглаз标。”
как Ты Волясуществоватькнига章позжеучитьсяиз Таким образом,насвозвращаться Воля停конециспользоватьimshow
функция,и坚持использовать Qt Функции для правильного и последовательного отображения изображений.
Qt использовать несколько различных издобрых изображений для обработки данных изображений, видео, камер и сопутствующего компьютерного оборудования. зрениетема. В этом разделе мы Воля изучаем их и учимся существовать. OpenCV и Qt руководить связью между добрыми, чтобы стать более гибким изкомпьютерным опыт разработки визуальных приложений.
QImage
добрыйQt QImage
Может能да Qt Самое главное изискомпьютерное Изобретение, связанное со зрением, оно в основном обрабатывает данные изображений Qt добрый, который обеспечивает доступ на уровне пикселей к изображениям, к и многим другим функциям обработки данных изображения. нас Воляпредставлять Чтоструктураустройствоифункцияиз最重хотетьребенокнабор,尤ЧтодаиспользоватьOpenCV
час最重хотетьизребенокнабор。
QImage
Включатьмного Нет同изструктураустройство,Этиструктураустройствопозволятьотдокументилиоригинальныйизображениеданныеилипустойизображениесоздаватьииметь дело с Что ПиксельизQImage
。 нас Можетк Создайтеиметь Давать定большой小и ФорматизнулевойQImage
добрый,Как показано ниже:
QImage image(320, 240, QImage::Format_RGB888);
этот Воля Создайте320x240
Пиксель(ширинаивысокий)изстандартный RGB Цветное изображение. Ты можешькссылкаQImage::Format
перечислять(использоватьQImage
добрыйдокумент)кполучатькподдерживать Форматизвесь Список表。 насвозвращаться МожеткпередачаQSize
добрый Вместо того, чтобы даценить,И напишите следующий код:
QImage image(QSize(320, 240), QImage::Format_RGB888);
Следующий конструктор также начинается с OpenCV Mat
добрыйсоздаватьQImage
изметод Изодин。 здесь важно обратить внимание на да,OpenCV Mat
добрыйсерединаизданные ФорматотвечатьиQImage
добрыйсерединаизданные Форматсовместимый。 По умолчанию OpenCV к BGR Формат (нет RGB)加载彩цветизображение,поэтому,еслинаспытатьсяиспользовать Должен ФорматстроитьQImage
,но会существоватьрядданныесерединавходитьошибка。 Поэтому сначала нам нужно Что Конвертироватьдля RGB。 Даон例ребенок:
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
параметр。 Даон例ребенок:
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
изметод。 Даон例ребенок:
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 изображение. Даон例ребенок: 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
добрыйивозвращаться Конвертироватьназадизизображение. Даон Простойиз例ребенок: 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
такой жесейчассуществовать,Мы Воля Создайте Примерпроект,к Используйте то, что мы узнали до сих пор, и примените это на практике. Нет реального практического опыта,Все захватывающие методы, изученные в этой главе, потрачены впустую.,поэтому让насотнасизизображение Проверять Примерприложениеначинать:
ImageViewer
。mainwindow.ui
,Затемиспользоватьдизайнустройствоудалитьменюстолбец,состояниестолбециинструментстолбец,Затемсуществоватьокноначальство放набородин Этикеткавиджет(QLabel
)。 щелкнутьокноначальствоизпустойобласть,Затемв соответствии сCtrl + G
все будутсодержание(только Этикеткаизвиджет)布набордлясетка。 Эта Воля гарантирует, что все размеры всегда будут изменены в соответствии с размером окна.label
изalignment/Horizontal
свойство ИзменятьдляAlignHCenter
。 Затем Воля ЧтоHorizontal
иVertical
sizePolicy
свойство Все ИзменятьдляIgnored
。 Следующий,Воляк Внизinclude
заявлениедобавить вmainwindow.h
документсередина: #include <QPixmap>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QMimeData>
#include <QFileInfo>
#include <QMessageBox>
#include <QResizeEvent>
mainwindow.h
серединаизMainWindow
добрыйопределениесередина: protected:
void dragEnterEvent(QDragEnterEvent *event);
void dropEvent(QDropEvent *event);
void resizeEvent(QResizeEvent *event);
QPixmap
добавить втыизmainwindow.h
середина: QPixmap pixmap;
mainwindow.cpp
и Воляк Внизсодержаниедобавить вMainWindow
структураустройствосередина,кнсуществовать вызывается сразу при запуске программы: setAcceptDrops(true);
mainwindow.cpp
документсерединадобавить вк Внизфункция: 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();
}
}
}
mainwindow.cpp
из另одинфункциянравиться Вниз: 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!"));
}
}
mainwindow.cpp
,Мы готовы выполнить наше приложение: 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
начальствопоказыватьрезультат,Как показано в примере кода ниже:
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 виджет, виджет отображает только мигание в кружке:
Painter_Test
из Qt Widgets приложение.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)]
QBlinkingWidget
изpaintEvent
метод,ииспользоватьQPainter
руководить Некоторыйрисовать。 поэтому,первый Воляк Внизinclude
заявлениедобавить вqblinkingwidget.h
документсередина: #include <QPaintEvent>
#include <QPainter>
#include <QTimer>
QBlinkingWidget
добрыйсередина(Например,Воля Чтодобавить всуществующийиз公共членпосле): protected:
void paintEvent(QPaintEvent *event);
paintEvent
функцияпоследобавить вк Внизсодержание: private slots:
void onBlink();
qblinkingwidget.h
документсередина,Добавьте к в личный кабинет Волясуществоватьвиджетиспользовать: private:
QTimer blinkTimer;
bool blink;
qblinkingwidget.cpp
исуществоватьс动создаватьизструктураустройствосерединадобавить вк Внизкод: blink = false;
connect(&blinkTimer,
SIGNAL(timeout()),
this,
SLOT(onBlink()));
blinkTimer.start(500);
qblinkingwidget.cpp
середина: 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();
}
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)]
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)]
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)]
Promote
。 Ваш виджет настройки приложения готов к использованию. После запуска приложения вы будете видеть его каждый раз 500 Мигает один раз в миллисекунду (полсекунды).на самом деле,Дасуществовать Qt Метод создания Настроить виджет окна Универсальный. Изготовить новые изделия на заказ Qt виджетисуществоватьтыиз Qt Чтобы применить его, вам необходимо:
QWidget
изновыйдобрый.paintEvent
функция.QPainter
добрыйсуществовать Чтоначальстворуководитьрисовать。QWidget
(виджет)。на самом деле,ВоляQWidget
продвигатьдлясделанный на заказизвиджеттакжедаот Нет.трехсторонний Разработчик(илитакже许даот互联网)получатьвиджети希望существоватьприложениеокносерединаиспользоватьэточасиспользоватьизметод。
существоватьвперед面из Примерсередина,насв соответствии с闪烁переменнаясостояниеиспользоватьQPainter
изfillRect
функция Простой地每秒использовать红цвети白цветнаполнениеэто。 такой же,Вы можете использоватьdrawArc
,drawEllipse
,drawImage
иQPainter
серединаиз Болеефункциясуществоватьвиджетначальстворисовать几乎всесодержание。 здесь важно обратить внимание на да,Когда мы хотим использовать существованиевиджет,нас Воляthis
передача ДаватьQPainter
Пример。 еслинас想использоватьQImage
,нас Толькохотетьубеждаться ВоляQImage
передача Даватьэтоилииспользоватьbegin
функция ПриходитьструктураQPainter
Прямо сейчас Может。 Даон例ребенок:
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
функция调использоватьсередина。
Зависит от Внас Воляиспользовать 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 файл, убедитесь, что мультимедийный модуль доступен вам из проекта:
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 глава,“Графический видрамка”Воляда Входитькомпьютерное зренияи В области обработки изображений из последней главы, потому что для нас есть комплексное компьютерное Одна из наиболее важных функций приложения для просмотра изображений Воляпроходить Заканчивать, то есть просматривать изображения и манипулятор, мы, Воля, продолжаем изучать новое изкомпьютерное зрение Навык,Каждый раз добавляйте к нему новые,Точно так же, как то, что мы узнали о существовании в предыдущих главах.
Теперь, когда мы знакомы с 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
середина Включатьизпроект。 это们Можеткда Проволока,прямоугольник,изображение,текстждать.Начнем с простого введения, а затем перейдем к подробному обсуждению вышеизложенного:
Graphics_Viewer
из Qt Widgets приложение,добрыйпохожий Всуществовать Нет. 4 глава,“Mat
иQImage
”серединасоздаватьизпроект,кучитьсясвязанныйсуществовать Qt Отображение информации об изображении в формате . Но да, на этот раз просто добавь к нему «Графический». вид из окна виджет без каких-либо Этикетка, меню, состояние ожидания в баре. Воля ЧтоobjectName
свойствобронироватьдляgraphicsView
。
MainWindow
добрыйсерединадобавить вdragEnterEvent
иdropEvent
。 и Нетхотеть忘记ВоляsetAcceptDrops
добавить вMainWindow
добрыйизструктураустройствосередина。 очевидно,на этот раз,ты需хотетьудалитьиспользовать ВсуществоватьQLabel
начальствонастраиватьQPixmap
изкод,Потому что в проекте нет Этикетки.mainwindow.h
серединаMainWindow
добрыйизчастныйчленчасть,Как показано ниже:
QGraphicsScene scene;
scene
по сутиданас Воляиспользоватьипоказыватьсуществоватьдобавить вMainWindow
добрыйизQGraphicsView
виджетсерединаизсцена。 最有Может能изда,ты需хотетьдля Местоиспользоватьизкаждыйдобрыйдобавить водин#include
заявление,Дакодредактироватьустройство Не могущийидентифицироватьиз。 Вы также получаете эту связанную ошибку изкомпилятора, которая обычно может быть хорошим напоминанием нам о необходимости забыть о Воле, которая содержит существование издоброго. Итак, с этого момента убедитесь, что вы Qt добрыйдобавить водиндобрыйпохожий Вк Внизсодержаниеиз#include
обратитесь к令。 Да,Если определенный предмет должен быть доступен, необходимы какие-либо специальные меры.,но Волясуществовать Книгасередина明确иллюстрировать:
#include <QGraphicsScene>
graphicsView
верно象Можеткдоступсцена。 Ты можешькпроходитьсуществоватьMainWindow
структураустройствосерединадобавить вк Вниз ХОРОШОПриходитьвыполнить. (шаг 5 послеиз ХОРОШО。)graphicsView
禁использоватьacceptDrops
,потому чтодлянас希望можетбронировать放наборсуществоватьокно各处изизображение. поэтому,пожалуйстаубеждатьсятыизMainWindow
структураустройствотолько Включатьк Внизфункция调использовать: ui->setupUi(this);
this->setAcceptDrops(true);
ui->graphicsView->setAcceptDrops(false);
ui->graphicsView->setScene(&scene);
dropEvent
функциясередина,наснастраивать Этикеткаизpixmaps
свойство,на этот раз,нас需хотетьубеждатьсясоздавать ПонятноQGraphicsItem
и Воля Чтодобавить всценасередина,или ВОЗесли быть точнымдаQGraphicsPixmapItem
。 Это можно сделать двумя способами, давайте рассмотрим один: 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
метод Воля Чтодобавить всценасередина,Как показано ниже:
QGraphicsPixmapItem *item =
new QGraphicsPixmapItem(pixmap);
scene.addItem(item);
существуют в обоих случаях,Не нужно беспокоиться об указателе проекта.,потому чтодлясуществовать调использоватьaddItem
чассцена Воляиметьэтоизвсе权,исцена会с动от Внутри存середина清除。 конечно,еслинасхотеть Руководствоотсценаи Внутри存середина完全удалить Долженпроект,нас Можеткписатьодин Простойизdelete
заявление Приходитьудалить Долженпроект,Как показано ниже:
delete item;
В нашем простом коде есть большая проблема, которая не видна на первый взгляд, но если мы продолжим перетаскивать изображения Воля в окно, каждый раз Воля будет добавлять последнее изображение. на предыдущем изображении сверху и не очищайте предыдущее изображение. на самом деле,Если ты попробуешь это сам,Даонхорошая идея。 Да,первыйсуществоватьписатьaddItem
из ХОРОШОпоследобавить вк Вниз ХОРОШО:
qDebug() << scene.items().count();
Вам необходимо скачать заголовочный файл добавить вmainwindow.h
документсередина,Этот файл будет работать:
#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++ руководитьразвиватьчасизкод.
clear
иscene
руководитьдобавить в。 поэтому,Толькосуществовать调использоватьлюбойaddItem
(илиaddPixmap
ждать)Извпереддобавить вк Внизсодержание: scene.clear();
Попробуйте приложение еще раз и посмотрите результаты. Теперь, после помещения Воля в окно нашего приложения, должно остаться только существующее изображение. кроме того,记Вниз Приложениевыход,ты Воля Видетьпоказыватьизценитьвсегдадля1
,Дапотому чтодлясуществоватьлюбойчас候scene
серединавсегда Толькобронироватьодинизображение. существование Мы только что видели из Примерпроекта, мы используем Qt из Графический Все существующие основные части из видрамки, а именно сцена, проективид. Сейчас существуют, мы Воля подробно изучаем этот добрый, в то же время, для нас комплексное изкомпьютерное зрениеприложениеComputer_Vision
проектсоздавать强большойизграфика Зрительиредактироватьустройство。
QGraphicsScene
этотдобрыйпоставлять Понятноиметь дело смногоиндивидуальныйграфикаэлемент(QGraphicsItem
)необходимыйиз几乎всеметод,Прямо сейчасделатьсуществоватьвперед面из Примерсерединанастолько Воля ЧтоиодининдивидуальныйQGraphicxPixmapItem
один起использовать。 В этом разделе мы рассмотрим некоторые из наиболее важных функций доброго. Как упоминалось ранее, наша Воля основное внимание уделяет в случаях использования требуются изсвои методы, поскольку for охватывает все методы (хотя все они важны) для для целей этой книги напрасно. нас ВоляперепрыгниQGraphicsScene
изструктураустройство,Потому что они доступны только в размерах «производитель» и «производитель» соответственно. Что касается остальных методов исвоства.,Сразусуществоватьздесь,для Некоторые из них могут быть неочевидны из Пример,Вы можете найти простой код из Пример,Можеткиспользоватькнига章вперед面создаватьизGraphics_Viewer
проектруководитьпытаться :
addEllipse
,addLine
,addRect
иaddPolygon
функция Можеткотэто们изимясередина猜测出Приходить,Можеткиспользовать Приходить Ксценадобавить в Универсальныйиз几何форма。 Некоторые из них обеспечивают перегрузку для облегчения ввода параметров. создаватьидобавить всценачас,вышекаждыйфункция Все会возвращаться ЧтоверноотвечатьизQGraphicsItem
ребенокдобрый Пример(нравиться Вниз Место示)。 Возвращенный указатель можно сохранить, можно использовать для изменения, удаления или других способов использования проекта: QGraphicsEllipseItem
QGraphicsLineItem
QGraphicsRectItem
QGraphicsPolygonItem
Даон例ребенок:
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
проектсерединабольшой量использоватьэтот Пример,И предоставьте достаточно из Примерприйти на помощь, чтобы начать работу.,Дасейчассуществовать Даонкороткийиз Пример:
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
перечислятьнастраивать Приходить响отвечатьили忽略Нет同измышькнопка。 Даон Простойиз例ребенок: 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
Из间из实число,Это соответствует ожидаемому уровню детализации при расчете: 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
перечислятьсередина各элементизкомбинация。 Даон Примеркод:
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 Познакомьтесь с этой концепцией поближе, используя графические эффекты:
Graphics_Viewer
проект。 Толькосуществовать Qt Creator середина Открытьэто,ЗатемиспользоватьхозяинменюсерединаизNew File
илиProject
,выбирать C++ и C++ добрый,ЗатемщелкнутьChoose
кнопка。
QCustomGraphicsEffect
делатьдлядобрыйимя。 выбиратьQObject
делатьдлябазадобрый,наконец选серединаInclude QObject
флажок(если По умолчанию未选середина)。 Нажмите «Далее», а затем нажмите «Заканчиватькнопку».
include
заявлениедобавить вновыйсоздаватьизqcustomgraphicseffect.h
документсередина:
#include <QGraphicsEffect>
#include <QPainter>
QCustomGraphicsEffect
добрыйнаследовать ПонятноQGraphicsEffect
Вместо того, чтобы даQObject
。 убеждатьсяпервый Изменятьqcustomgraphicseffect.h
документсерединаиздобрыйопределение ХОРОШО,Как показано ниже: class QCustomGraphicsEffect : public QGraphicsEffect
QGraphicsEffect
структураустройство,в противном случае Воля出сейчаскомпиляторошибка。 поэтому,Изменятьqcustomgraphics.cpp
документсерединаиздобрыйструктураустройство,Как показано ниже: QCustomGraphicsEffect::QCustomGraphicsEffect(QObject *parent)
: QGraphicsEffect(parent)
draw
функция. по сути,Дапроходить实сейчасdraw
функция制делатьвсеQGraphicsEffect
добрыйиз Способ。 Поэтому Воляк в следующую строку кода добавьте вqcustomgraphicseffect.h
документсерединаизQCustomGraphicsEffect
добрыйопределениесередина: protected:
void draw(QPainter *painter);
QGraphicsEffect
добрыйписатьновый Эффектифильтрустройствоиз Простой程度из Простой Пример。 как вы видете,передача Даватьdraw
функцияизQPainter
добрыйизобратитесь к针Можетиспользовать Всуществовать Эффектнеобходимыйиз Изменятьпосле Простой地верно Чторуководить Исправлятьирисовать: 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));
}
mainwindow.h
документсередина: #include "qcustomgraphicseffect.h"
setGraphicsEffect
функция Приходитьиспользоватьэто。 существоватьнасизGraphics_Viewer
проектсередина,нас实сейчас ПонятноdropEvent
。 Вы можете просто скачать фрагмент кода и добавить вdropEvent
функциясередина,поэтому Воляиметьк Внизсодержание: 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)
。 Очевидно, что если число родительиребенокиз увеличится и у нас Воля будут разные системы координат из лабиринта, существующего здесь, будет полезно упомянуть функцию отображения. вот некоторые Пример Состояние。 Вы можете использоватьк Этот фрагмент кода принадлежит следующему фрагменту кода, к Создайтесцена, который содержит изсценадбрий, подобный изпроекту, упомянутому ранее:
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()
заявлениеизрезультат:
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)
Попробуем увидеть результат, выдаваемый инструкцией Нет.из:
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
Примерпроект,кподдерживать Болеепроект,выбор проекта,проектудалитьки放большойиуменьшить масштаб Функция,исуществоватьэтотпроцесссередина,нас Воля Обзорк Внизпроектиз Некоторый最重хотетьиспользовать例: О существовании мы узнали в этой главе извид, сценарипроект. поэтому,Давайте Заканчиваем это:
Graphics_Viewer
проект; Затем выберите «Новый файл» и «Проект» в главном меню, а затем выберите «C++» в окне «Новый файл или проект». и C++ добрый”,Затемщелкнуть“выбирать”кнопка。QEnhancedGraphicsView
делатьдлядобрыйимя,ЗатемвыбиратьQWidget
делатьдлябазадобрый. кроме того,еслиInclude QWidget
рядомизфлажокеще нет选середина,пожалуйста选серединаэто。 Затем,Нажмите «Далее»,Затемщелкнуть“Заканчивать”。qenhancedgraphicsview.h
головадокумент: #include <QGraphicsView>
QEnhancedGraphicsView
добрыйнаследовать Понятноqenhancedgraphicsview.h
документсерединаизQGraphicsView
Вместо того, чтобы даQWidget
,Как показано ниже: class QEnhancedGraphicsView : public QGraphicsView
QEnhancedGraphicsView
добрыйизструктураустройство实сейчас,нравитьсяэтот处Место示。 очевидно,Дасуществоватьqenhancedgraphicsview.cpp
документсередина Заканчиватьиз,Как показано ниже: QEnhancedGraphicsView::QEnhancedGraphicsView(QWidget
*parent)
: QGraphicsView(parent)
{
}
qenhancedgraphicsview.h
документсерединаиз Усиливать型виддобрыйопределениесередина: protected:
void wheelEvent(QWheelEvent *event);
qenhancedgraphicsview.cpp
документ,Как указано в следующем блоке кода: 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 Ко всем осям применяется масштаб. Затем он обновляет область просмотра, проверяя, что все перерисовывается по мере необходимости.
graphicsView
верно象(нравитьсянас先вперед Место见)。 Нам нужно нажать правой кнопкой мыши и в контекстном меню выбрать «Обновить для». Затем,входитьQEnhancedGraphicsView
делатьдляобновлениеиздобрыйимя,Затемщелкнуть“добавить в”кнопка,наконецщелкнуть“обновление”кнопка。 (Знания об улучшении вы уже почерпнули в предыдущей статье, и эта не исключение.) Зависит от ВQGraphicsView
иQEnhancedGraphicsView
добрыйдасовместимыйиз(Нет.одинданазад ВОЗизотецдобрый),поэтомунас Можетк Воляотец代продвигатьдляребенок代,и/ или Воля его понижение (если оно нам не нужно). Обновить как Волявиджет конвертировать для своих дочерний виджетподдержки добавьте больше подобных функций.
mainwindow.cpp
изdropEvent
функциявершинадобавить водин小段код,кубеждатьсясуществовать加载новыйизображениечас重набор Увеличить级Не(если быть точнымда Сравнивать例Конвертировать):
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)]
Если ты попробуешь еще немного,Вы скоро обнаружите что-то,Увеличить Функцияобщийдакизображениеизсередина Сердце起делатьиспользовать,Это странно и неудобно. для смог решить эту проблему,Нам нужно использовать существование, чтобы узнать больше советов в этой главе.,Советы и функции:
wheelEvent
снаружи,насвозвращаться ВоляиспользоватьmouseMoveEvent
。 Поэтому Воляк в следующую строку кода добавьте вqenhancedgraphicsview.h
документсерединаиззащищенный членчасть: void mouseMoveEvent(QMouseEvent *event);
private:
QPointF sceneMousePos;
qenhancedgraphicsview.cpp
документ: void QEnhancedGraphicsView::mouseMoveEvent(QMouseEvent
*event)
{
sceneMousePos = this->mapToScene(event->pos());
}
wheelEvent
функция. Убедитесь, что это выглядит так: 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
приложениеможетиметь дело с无限число量изизображение:
mainwindow.cpp
изdropEvent
серединаудалитьк Вниз ХОРОШО: scene.clear();
dropEvent
серединаудалитьк Внизкод ХОРОШО,Ранее мы добавили следующую строку кода для сброса масштабирования: ui->graphicsView->resetTransform();
mainwindow.cpp
документсерединаdropEvent
из起точка: QPoint viewPos = ui->graphicsView->mapFromParent
(event->pos());
QPointF sceneDropPos = ui->graphicsView->mapToScene
(viewPos);
sceneDropPos
,Как показано ниже: 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
проект Добавитьк Внизфинальныйсодержание:
void mousePressEvent(QMouseEvent *event);
private slots:
void clearAll(bool);
void clearSelected(bool);
void noEffect(bool);
void blurEffect(bool);
void dropShadowEffect(bool);
void colorizeEffect(bool);
void customEffect(bool);
qenhancedgraphicsview.cpp
документ. первыйдобавить вmousePressEvent
из实сейчас,Как показано ниже: 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
функцияслотпо сутиктакой жеизмодельповторить。 существоватьвперед面изкодсередина,нас Место做из Толькода Простой地создаватьи Открытьодинначальство Внизискусство(Щелкните правой кнопкой мышищелкнуть)меню,Затем Волякаждыйдействиесоединятьприезжать Волясуществовать Внизодин步серединадобавить визслот。
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));
}
}
//***
Предыдущие коды такие же,Что余слот遵循такой жеизмодель。
mainwindow.cpp
документсередина Приходитьвыполнить. Сразу после установки сцены в функции инициализации существования (конструкторе) выполните следующие операции: ui->graphicsView->setInteractive(true);
ui->graphicsView->setDragMode(QGraphicsView::RubberBandDrag);
ui->graphicsView->setRubberBandSelectionMode(
Qt::ContainsItemShape);
mainwindow.cpp
изdropEvent
функциясерединадобавить вк Внизкод ХОРОШО,кубеждаться Можетквыбиратьпроект。 Воляэто们добавить впроектсоздаватькодпослекидобавить Перед строкой сценаиз: 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 серединаиспользовать众многоизфильтридругойизображениеиметь дело с Функция,Он поддерживает цветовое пространство,много Конвертировать技术ждатьждать.