Jetson Nano от входа до практического использования (кейсы: настройка Opencv, распознавание лиц, распознавание QR-кода)
Jetson Nano от входа до практического использования (кейсы: настройка Opencv, распознавание лиц, распознавание QR-кода)

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

Оглавление

1. Знакомство с Jetson Nano

2. Конфигурация среды Jetson Nano

2.1 Знакомство с распаковкой аксессуаров

2.2 Система сжигания

2.3 Включение и основные настройки

2.4 Настройка среды разработки

2.4.1 Источники обновлений и программное обеспечение

2.4.2 Настройка времени выключения экрана

2.4.3 Установите метод ввода на китайском языке

2.4.4 Установка кода OSS

2.4.5 Установка Qt5

3. Проектные кейсы

3.1 Обнаружение лиц

3.1.1 Установка пипа

3.1.2 Установите часто используемые пакеты машинного обучения Python

3.1.3 Настройка Opencv для Python

3.1.4 Обнаружение лиц на основе Opencv

3.2 Обнаружение QR-кода (изготовление пистолета для сканирования кода)

3.2.1 Считать камеру

3.2.2 Обнаружение и считывание QR-кода

3.3 Управление двухцветной светодиодной подсветкой (GPIO)

3.3.1 Реализация Python

3.3.2 Реализация C++

4. Резюме


1. Знакомство с Jetson Nano

Jetson Nano — это компактная и мощная плата для разработки встроенных систем искусственного интеллекта, выпущенная NVIDIA в марте 2019 года. Предустановленная Ubuntu Система 18.04LTS, оснащенная 128-ядерным процессором Maxwell, разработанным NVIDIA. Графический процессор может быстро реализовать технологию искусственного интеллекта и применить ее к различным интеллектуальным устройствам. По сравнению с несколькими предыдущими продуктами Jetson (Jetson TK1、Jetson TX1、Jetson TX2、Jetson Xavier),Jetson Nano продается всего за 99 долларов США, что значительно снижает затраты на исследования и разработки терминалов искусственного интеллекта. Поэтому, как только он был запущен, он получил широкую похвалу. на。Адрес его официального сайта::Jetson Nano Developer Kit for AI and Robotics | NVIDIA

Вот некоторые преимущества Jetson Nano в деталях:

(1) Он небольшой по размеру, мощный по производительности и доступен по цене. Он использует аппаратную конструкцию, аналогичную Raspberry Pi, и поддерживает ряд популярных платформ искусственного интеллекта. NVIDIA вложила много усилий в исследования и разработки для создания соответствующего комплекта разработки Jetpack SDK. , этот комплект разработки может сделать изучение и разработку продуктов искусственного интеллекта проще и удобнее.

(2) Разработанный специально для искусственного интеллекта, его производительность выше, чем у Raspberry Pi. Он оснащен четырехъядерным процессором Cortex-A57, 128-ядерным графическим процессором Maxwell и памятью LPDDR объемом 4 ГБ, что обеспечивает достаточную вычислительную мощность искусственного интеллекта для робота. терминалы и терминалы промышленного зрения.

(3) Обеспечивает 472 GFLOP, поддерживает датчики высокого разрешения, может обрабатывать несколько датчиков параллельно и может запускать несколько современных нейронных сетей для каждого потока датчиков.

(4) Поддержка пакета компонентов NVIDIA JetPack от NVIDIA, который включает пакеты поддержки на уровне платы для глубокого обучения, компьютерного зрения, вычислений на графических процессорах, обработки мультимедиа и т. д., программные библиотеки CUDA, cuDNN и TensorRT.

(5) Поддерживает ряд популярных платформ и алгоритмов искусственного интеллекта, таких как TensorFlow, PyTorch, Caffe/Caffe2, Keras, MXNet и т. д., что позволяет разработчикам легко и быстро интегрировать модели и платформы искусственного интеллекта в продукты, чтобы легко добиться распознавания изображений и целевого назначения. цели Мощные функции, такие как обнаружение, оценка позы, семантическая сегментация, улучшение видео и интеллектуальный анализ.

В настоящее время тенденция искусственного интеллекта начала постепенно переходить на стадию приложений, и все больше продуктов надеются применить вычислительную мощность искусственного интеллекта к реальным терминалам, то есть для достижения так называемых потребностей в периферийных вычислениях. По сути, суть продвижения искусственного интеллекта в последние годы лежит в алгоритмах глубокого обучения. Однако ускорение вывода при глубоком обучении нельзя отделить от поддержки высокоскоростных графических процессоров и обычных настольных ПК или видеокарт уровня сервера (таких как). такие как NVIDIA 1080Ti и т. д.) очень дороги. Они не подходят для нужд периферийных вычислений и слишком громоздки. Таким образом, Jetson Nano, плата для разработки встроенного искусственного интеллекта, выпущенная NVIDIA, очень подходит для текущих потребностей отрасли.

2. Конфигурация среды Jetson Nano

2.1 Знакомство с распаковкой аксессуаров

Приобретенный напрямую Jetson Nano содержит только пустую машину, как показано на рисунке ниже:

На следующем рисунке показаны различные интерфейсы аппаратного обеспечения Jetson Nano:

  • Интерфейс 1: слот для SD-карты, вставьте его сзади, просто слегка нажмите на него при вытягивании. SD-карты в основном используются для хранения всей системы и связанных с ней данных, подобно жестким дискам настольных ПК;
  • Интерфейс 2: 40-контактный интерфейс GPIO, в основном используемый для подключения внешних устройств, таких как термостаты, уровни и т. д.; NVIDIA официально предоставляет библиотеку JetsonGPIO (Python) для простого управления GPIO. Библиотека Jetson.GPIO использует тот же API, что и библиотека Jetson.GPIO. Библиотека RPi.GPIO.
  • Интерфейс 3: источник входного сигнала USB-порта 5 В. Этот интерфейс по умолчанию используется в качестве источника питания; этот интерфейс также можно использовать в качестве линии передачи данных, например, высокоскоростного последовательного порта и т. д.;
  • Интерфейс 4: порт проводной сети; если у вас недостаточно денег для покупки беспроводной сетевой карты, вы можете напрямую подключить сетевой кабель к этому порту для подключения к Интернету;
  • Интерфейс 5: 4 порта USB3.0, используемые для подключения USB-устройств, например USB-камер;
  • Интерфейс 6: выходной порт HDMI, который можно использовать для подключения экрана дисплея;
  • Интерфейс 7: интерфейс дисплея DP, который можно использовать для подключения дисплея (интерфейс 6 и интерфейс 7 используются для подключения периферийных дисплеев, но интерфейсы разные. В реальных условиях можно использовать только один, обычно интерфейс HDMI; используется). Если вы хотите подключить дисплей VGA, вы можете купить порт преобразования HDMI в VGA и использовать интерфейс 6;
  • Интерфейс 8: входной источник питания 5 В постоянного тока; обратите внимание, что для Jetson Nano существует два метода подачи питания. Один использует интерфейс 3. Вам нужно только купить зарядное устройство для телефона Android на 5 В и подключить его. Это также метод по умолчанию. Другой вариант — использовать интерфейс 8. В это время необходимо закоротить J48. После завершения короткого замыкания его можно переключить на интерфейс 8 для подачи питания, как показано на рисунке ниже:
  • Интерфейс 9: камера MIPI CSI, вы можете напрямую приобрести камеру для Raspberry Pi и использовать ее;

Помимо голого железа вам также необходимо приобрести карты памяти, клавиатуры, мыши, блоки питания постоянного тока 5 В 2 А, мониторы, беспроводные сетевые карты, камеры, вентиляторы, кожухи и другие аксессуары для лучшей разработки. Эти аксессуары можно легко приобрести в Интернете.

Ниже описан выбор и установка некоторых аксессуаров.

  • Карта памяти: Как правило, карты памяти включают 16 ГБ, 32 ГБ, 64 ГБ, 128 ГБ и т. д. Чтобы облегчить дальнейшее развитие глубокого обучения, рекомендуется использовать карты памяти 32 ГБ и выше.
  • Клавиатура и мышь могут использоваться напрямую и поддерживают USB3.0;
  • В качестве источника питания выберите источник питания 5 В 2 А или 5 В 3 А, как показано на рисунке ниже. В основном, если вы используете метод доступа к питанию, как показано на рисунке ниже, вам необходимо подключить J48, в противном случае вход питания по умолчанию осуществляется через USB.
  • Монитор: для прямого подключения рекомендуется использовать монитор HDMI. Если вы хотите подключить монитор VGA компьютера, вы можете приобрести модуль преобразования HDMI в VGA для завершения подключения.
  • Беспроводная сетевая карта: Существует два способа подключения к Интернету: проводной и беспроводной. Вы можете получить доступ к Интернету, напрямую подключившись к Интернет-кабелю через интерфейс 4. Если вам нужно использовать беспроводной Wi-Fi для доступа в Интернет, вам необходимо приобрести модуль беспроводного Wi-Fi отдельно. Рекомендуется приобрести стандартный поддерживающий беспроводной модуль Wi-Fi Jetson Nano, как показано на рисунке ниже, который в основном включает в себя пару двойных антенн и чип обработки, и его совместимость может быть гарантирована.

Установка этого беспроводного WIFI немного сложнее и требует разборки компонентов графического процессора на голом металле.

Сначала подключите две антенны Wi-Fi к процессорному чипу и нажмите на слот для карты, чтобы зафиксировать антенны, как показано на рисунке ниже:

Затем снимите компонент графического процессора с голого металла Jetson Nano, как показано на рисунке ниже:

После его удаления установите чип Wi-Fi в слот для карты, как показано на рисунке ниже:

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

  • Камера: Камеру можно использовать двумя способами: напрямую использовать камеру CSI Raspberry Pi, а другой — использовать USB-камеру. Если вы используете камеру Raspberry Pi, просто подключите ее, как показано на рисунке ниже (обратите внимание на переднюю и заднюю часть):
  • Вентилятор: в обычных обстоятельствах нет необходимости использовать вентилятор для отвода тепла для Jetson Nano. Однако, если используется технология глубокого обучения и операции вывода выполняются с высокой частотой, лучше всего установить охлаждающий вентилятор на графический процессор. компонент, как показано на рисунке ниже. Показать:
  • Корпус: открытая плата разработки подвержена короткому замыканию. По соображениям безопасности лучше всего установить корпус для всего Jetson Nano после установки вышеуказанных аксессуаров. Существуют различные типы корпусов, и их можно установить в соответствии с инструкциями к приобретенному корпусу. На рисунке ниже показана более распространенная прозрачная оболочка Jetson Nano:

2.2 Система сжигания

Nvidia официально называется Jetson Nano предоставляет версию образа системы на SD-карте, которая была обновлена ​​и поддерживается. Образ содержит соответствующую систему Ubuntu, настроенную среду cuda и среду opencv, поэтому для завершения работы Jetson вам нужно только загрузить и установить образ. Большинство конфигураций среды Nano. Вы можете перейти прямо на официальный сайт, чтобы загрузить изображение.,Адрес загрузки::Jetson Download Center | NVIDIA Developer,Дважды щелкните изображение, чтобы загрузить последнюю версию изображения.,Как показано ниже:

В этой статье загружается образ версии JP4.3, обновленный 17 декабря 2019 г. Скачивается сжатый zip-пакет, и вы можете получить файл с суффиксом img. Этот файл — это то, что нам нужно. . Общий объем файла изображения составляет около 12,5 ГБ. Все это содержимое необходимо хранить на SD-карте. Поэтому рекомендуется выбирать SD-карту большей емкости, например 64 ГБ или 128 ГБ. В обычных обстоятельствах, если SD-карта новая, ее можно запрограммировать напрямую, но иногда необходимо перепрограммировать старую SD-карту. В этом случае SD-карту необходимо отформатировать заранее, чтобы избежать ошибок в процессе зеркалирования. Если на SD-карте ранее был запрограммирован образ Jetson Nano, вам необходимо сначала удалить и повторно объединить разделы SD-карты. Это связано с тем, что SD-карта, запрограммированная с помощью Jetson Nano, будет иметь 12 подразделов, поэтому вам нужно. Чтобы использовать Диспетчер дисков, необходимо удалить и объединить эти разделы, а затем записать новый образ (если это новая SD-карта, эти операции не требуются), как показано на следующем рисунке:

Как показано на рисунке выше, старая зеркальная карта Jetson Nano образует 12 подразделов. Сравните 12 разделов диска 2 на рисунке выше, последовательно выполните процесс «Удалить том», а затем «Новый простой том». диск 2.

Если это новая SD-карта, вам нужно всего лишь отформатировать ее следующим образом. Далее начинается официальный процесс сжигания. Существует множество инструментов записи. В этой статье рекомендуется Win32DiskImager, который можно загрузить и установить непосредственно в Интернете. Дважды щелкните, чтобы открыть Win32DiskImager, выберите образ img и настройте соответствующую букву диска SD-карты, как показано на следующем рисунке:

Нажмите «Записать», чтобы завершить запись образа. Все время записи занимает около 15 минут.

2.3 Включение и основные настройки

После завершения записи вставьте SD-карту в слот для карт на задней панели Jetson Nano, а затем включите его.

Первоначальная установка требует базовой настройки, включая пароль учетной записи, пароль Wi-Fi, метод ввода, часовой пояс и т. д. Вы можете завершить ее в соответствии с подсказками. После завершения настройки по умолчанию будет выполнена операция обновления. Применение изменений. требуется подключение к Интернету. Если подключение к Интернету отсутствует, сначала нажмите «Отмена» и подождите, пока вы снова не подключитесь к сети, прежде чем выполнять обновления вручную. Обновление занимает много времени, просто подождите. Наконец, вы попадете на рабочий стол, как показано на рисунке ниже:

2.4 Настройка среды разработки

2.4.1 Источники обновлений и программное обеспечение

После установки системы следует сначала обновить исходники, иначе последующие обновления и апгрейды будут проходить очень медленно. Однако, поскольку Jetson Nano использует систему Ubuntu 18.04.2 LTS с архитектурой aarch64, которая отличается от системы Ubuntu с архитектурой AMD, ее необходимо заменить исходным кодом aarch64. Будьте осторожны, не заменяйте его исходным кодом x86-64. (Недавно я попробовал последнюю версию Jetpack 4.6. Лично я считаю, что нет никаких проблем без изменения исходного кода, поэтому эта часть содержимого изменения исходного кода размещена здесь только для справки)

Здесь мы выбираем для обновления источник из Университета Цинхуа. Сначала создайте резервную копию исходного источника и измените имя файла source.list, если он вам понадобится:

Язык кода:javascript
копировать
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak    
sudo gedit /etc/apt/sources.list

Затем удалите все и скопируйте следующее:

Язык кода:javascript
копировать
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe

На этом смена источника заканчивается.

Откройте терминал и введите следующую команду для обновления:

Язык кода:javascript
копировать
sudo apt-get update
sudo apt-get full-upgrade

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

2.4.2 Настройка времени выключения экрана

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

Нажмите «Яркость» & Заблокируйте, а затем Turn screen off when inactive for Изменить на Никогда не бывает достаточно, как показано на рисунке ниже:

2.4.3 Установите метод ввода на китайском языке

Так как в процессе разработки часто приходится пользоваться китайским поиском и писать необходимые китайские комментарии.,Поэтому рекомендуется для системы Установить китайский метод ввода。Jetson Nano поставляется с китайским методом ввода ibus, но для ввода китайского языка требуется простая настройка. Непосредственно введите команду ibus в терминал, и появится интерфейс, показанный ниже, указывающий, что Jetson Nano уже поставляется со своей собственной средой методов ввода ibus.

Загрузите метод ввода пиньинь для ibus ниже и введите команду:

Язык кода:javascript
копировать
sudo apt-get install ibus-pinyin

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

Затем выберите интерфейс «Добавить или удалить язык», и система выберет языковую поддержку, как показано на рисунке ниже:

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

После завершения установки переместите китайский язык вперед в интерфейсе языковой поддержки, как показано на рисунке ниже:

Затем нажмите «Применить ко всей системе». Наконец, нажмите «Система ввода с клавиатуры». Изменить на iBus.

Перезагрузите систему(очень важно!!!),Затем введите следующую команду в терминале, чтобы войти в интерфейс конфигурации ibus:

Язык кода:javascript
копировать
 ibus-setup

Нажмите кнопку «Добавить» в интерфейсе конфигурации, затем разверните параметр «Китайский» и выберите «Интеллектуальный пиньинь». Если вы не можете найти здесь опцию «Китайский», вы можете выключить и перезапустить ее, а затем повторить поиск.

После завершения добавления введите следующую команду, чтобы перезапустить ibus.

Язык кода:javascript
копировать
ibus restart

Наконец, измените метод ввода на метод ввода Пиньинь Pi на верхней панели задач рабочего стола, как показано на следующем рисунке:

На этом этапе вы можете использовать китайский ввод. Как показано ниже:

2.4.4 Установка кода OSS

Visual Studio Code (VS Code) — это бесплатная интегрированная среда разработки (IDE), доступная для Windows, Mac и Linux. В последние годы VS Code привлекает все больше внимания и становится предпочтительной средой компиляции для большинства разработчиков программирования. Будучи проектом с открытым исходным кодом, запущенным Microsoft, он привлек бесчисленное количество сторонних разработчиков и конечных пользователей и стал одним из лучших проектов с открытым исходным кодом. Это мощный, быстрый, простой и удобный пользовательский интерфейс с большим количеством плагинов. Это отличная среда разработки.

Собственный код VS не подходит для Jetson Nano. В настоящее время не существует официальной версии VS Code для устройств ARM, таких как Jetson Nano. Однако, поскольку исходный код открыт, любой может скомпилировать версию. Среди них Code-OSS — это такой «VS Code» во встроенной среде. Основанный на VS Code, Code-OSS — это не просто редактор кода, он имеет встроенную функцию проводника для управления всей папкой проекта вместо одного скрипта и богатый набор сторонних плагинов. Фактически, Code-OSS обладает почти всеми полными функциями VS Code, поэтому использование его в качестве редактора кода для редактирования кода, например Python, сделает весь процесс разработки более удобным. Конкретный метод установки описан ниже.

Откройте браузер Chromiun и введите URL-адрес:

Нажмите «Пакеты», просмотрите список имен пакетов и выберите пакет с суффиксом «arm64» (aarch64), как показано на следующем рисунке:

Нажмите, чтобы перейти на страницу сведений и найти соответствующую команду wget, как показано на рисунке ниже:

Эта команда демонстрирует, как загрузить установочный пакет, следующим образом:

Язык кода:javascript
копировать
wget --content-disposition https://packagecloud.io/headmelted/codebuilds/packages/debian/stretch/code-oss_1.42.0-1575969886_arm64.deb/download.deb

Скопируйте эту команду в терминал, чтобы загрузить установочный пакет. Как показано ниже:

в это время,Инсталляционный пакет скачан в домашний корень Оглавление,Вы можете просмотреть загруженный установочный пакет deb через проводник.,Как показано ниже:

Введите следующую команду в терминале, чтобы завершить окончательную установку:

Язык кода:javascript
копировать
sudo dpkg -i code-oss_1.42.0-1575969886_arm64.deb

После завершения установки можно поискать Code OSS в поиске, и появится приложение Code OSS. Это нужная нам IDE для программирования на Python. Нажмите на приложение, чтобы открыть его, как показано ниже:

Ниже приводится краткая демонстрация того, как использовать Code OSS для выполнения сценариев Python.

Сначала установите плагин Python в Code OSS. Метод установки плагина точно такой же, как и у обычного VS Code. Читатели, не знакомые с VS Code, могут сначала ознакомиться с основными правилами использования VS Code. настольный ПК, а затем переключитесь в среду Jetson Nano. Установка плагина показана на рисунке ниже. Найдите python на панели «Расширения» и выберите первый всплывающий плагин для установки:

следующий вhomeОглавление Создайте новый подcodeпапка,Эта папка используется для хранения сценариев кода Python. Затем в коде Откройте папку с кодом, которую вы только что создали в OSS, затем создайте новый файл, нажмите Ctrl+S, чтобы сохранить файл, назовите файл main.py и введите следующий код:

Язык кода:javascript
копировать
a = 36
b = 64
print(a+b) 

Затем нажмите Ctrl+F5, чтобы запустить скрипт. Эффект следующий:

На этом установка и работа редактора Python завершены.

2.4.5 Установка Qt5

На этапе фактического развертывания продукта, учитывая такие факторы, как скорость терминального устройства, стабильность, использование памяти и т. д., C++ обычно используется для разработки конечного продукта, тогда как Python используется для разработки алгоритмов только на этапе проектирования модели продукта. Поэтому нам нужен компилятор, который может разрабатывать C++ в Jetson Nano, чтобы облегчить разработку посадочных продуктов. VS Code сам по себе может разрабатывать приложения на C++, но Code-OSS плохо поддерживает C++. Поэтому вам необходимо установить отличный компилятор C++ для выполнения задач разработки на C++. В этой статье рекомендуется использовать Qt.

Qt — это кроссплатформенная библиотека разработки на C++, в основном используемая для разработки программ с графическим пользовательским интерфейсом (Graphical User Interface, GUI). Конечно, она также может разрабатывать программы командной строки (Command User Interface, CUI) без интерфейса. Qt разработан исключительно на C++, поэтому его использование для разработки приложений C++ имеет естественные преимущества. Qt поддерживает множество операционных систем, таких как общие операционные системы Windows, Linux и Unix, системы смартфонов Android, iOS, WinPhone и встроенные системы QNX, VxWorks и т. д. Конечно, QT также полностью поддерживает среду Ubuntu Jetson Nano.

Установить QT под Jetson Nano относительно просто. Вам нужно всего лишь ввести команду:

Язык кода:javascript
копировать
sudo apt-get install qt5-default qtcreator -y

В настоящее время установлена ​​версия Qt5.9.5.

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

Откройте Qt Creator, как показано ниже:

Нажмите «Новый проект», чтобы создать новый проект. Здесь выберите приложение Qt COnsole Appliation в разделе «Приложение», то есть создайте Qt-версию консольной программы C++:

Тогда проект называется QTtest:

Затем нажмите «Далее» по умолчанию, чтобы завершить создание проекта. Как видите, Qt создал файл C++ main.cpp для написания кода C++, а также файл конфигурации QTtest.pro для настройки всего проекта. Эффект показан на рисунке ниже:

В настоящее время вы можете напрямую нажать клавиши Ctrl + R, чтобы запустить проект, но поскольку у нас нет выходного кода, всплывающий терминал не выводит никакого значения. Давайте изменим код main.cpp, чтобы он также выполнял сложение двух целых чисел и выводил результат. Завершенный код выглядит следующим образом:

Язык кода:javascript
копировать
#include <QCoreApplication>
#include <QtDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    int c=64;
    int d=36;
    qDebug() << (c+d);
    return a.exec();
}

На этом этапе снова нажмите клавиши Ctrl+R, чтобы запустить проект и вывести результаты, показанные на рисунке ниже:

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

Наконец, давайте посмотрим на исполняемый отладочный проект build-QTtest-unknown-Debug, сгенерированный под основным Оглавлением, который сравнивается с QTtest.,Создайте в этой папке отладочную версию исполняемой программы QTtest. Войдите в папку с помощью команды терминала cd.,Затем введите

Язык кода:javascript
копировать
./QTtest

Программа будет выполнена напрямую, как показано на рисунке ниже:

Другими словами, по сути мы успешно развернули и разработали приложение. Функция приложения очень проста и реализует только сложение двух фиксированных целых чисел. Несмотря на простоту, он выявил относительно распространенную форму того, как мы обычно разрабатываем продукты искусственного интеллекта, то есть сначала используем сценарии Python в VS Code для проверки алгоритма, и, наконец, используем QT для написания соответствующего приложения на C++ и, наконец, используем QT для написания соответствующего приложения на C++ и, наконец, сгенерировать двоичную исполняемую программу. Окончательно сгенерированная двоичная исполняемая программа является нашим «продуктом». Этот исполняемый программный код инкапсулирован, невидим и может запускаться напрямую.

На этом мы завершили обычную настройку разработки Jetson Nano. Далее мы продемонстрируем несколько небольших проектов, чтобы читатели могли узнать больше о методах разработки Jetson Nano.

3. проектСлучай

3.1 Обнаружение лиц

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

3.1.1 Установка пипа

Спасибо, Джетсон. В Nano предустановлена ​​версия Python 3.6, поэтому вы можете прочитать ее напрямую. пип。

Введите следующую команду в терминале для установки:

Язык кода:javascript
копировать
sudo apt-get install python3-pip python3-dev

После завершения установки pip на данный момент имеет версию 9.01. Вам необходимо обновить pip, иначе при установке других библиотек Python в дальнейшем возникнут проблемы. Команда обновления выглядит следующим образом:

Язык кода:javascript
копировать
python3 -m pip install --upgrade pip

Обновленная версия — 19.0.3. Хотя обновление завершено, в pip3 есть небольшая ошибка, которую необходимо исправить вручную.

Сначала откройте файл pip3 с помощью следующей команды:

Язык кода:javascript
копировать
sudo vim /usr/bin/pip3

Введите символ «а» на клавиатуре, чтобы войти в режим вставки, а затем вы можете начать редактирование файла:

Язык кода:javascript
копировать
from pip import main
if __name__ == '__main__':
    sys.exit(main())

строить Изменить на:

Язык кода:javascript
копировать
from pip import __main__
if __name__ == '__main__':
    sys.exit(__main__._main())

Затем нажмите клавишу Esc, чтобы войти в командный режим. Наконец, нажмите английскую клавишу «:», чтобы войти в режим последней строки, введите wq и нажмите Enter, чтобы сохранить изменения и выйти из редактора.

3.1.2 Установите часто используемые пакеты машинного обучения Python

Язык кода:javascript
копировать
sudo apt-get install python3-scipy
sudo apt-get install python3-pandas
sudo apt-get install python3-sklearn

3.1.3 Настройка Opencv для Python

Есть два способа установить opencv под Python. Один из них — загрузить исходный код Opencv и перекомпилировать его для создания соответствующего пакета Python, а затем скопировать пакет в путь к установочному пакету Python; другой — напрямую использовать команду sudo pip3 install python3-opencv; Следует отметить, что второй метод по сути устанавливает скомпилированный пакет opencv, а его версия opencv является исправленной. Если вы хотите использовать последнюю версию opencv, например opencv4, то второй метод не подходит. В этом разделе мы просто будем использовать первый метод для его установки.

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

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

Результаты вывода показаны ниже:

Поэтому нам не нужно перекомпилировать и мы можем использовать его напрямую.

3.1.4 Обнаружение лиц на основе Opencv

(1)pythonвыполнить Распознавание лиц

В этом разделе мы сначала напишем скрипт Python для обнаружения лиц на изображениях. Используйте Code OSS, чтобы открыть папку кода, созданную в разделе 2.4.4, и создайте в этой папке новый скрипт Python с именем face_detect_test.py. Код выглядит следующим образом. Показывать:

Язык кода:javascript
копировать
import cv2 
filepath = "test.jpg" 
img = cv2.imread(filepath) # Читать картинки 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # конвертировать серый 
# Классификатор распознавания лиц OpenCV 
classifier = cv2.CascadeClassifier( "haarcascade_frontalface_default.xml" ) 
color = (0, 255, 0) # Определить цвет рисования 
# Вызов распознавания лиц 
faceRects = classifier.detectMultiScale( gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32)) 
if len(faceRects): # Если больше 0, распознается лицо. 
    for faceRect in faceRects: # Оформляйте каждое лицо индивидуально 
        x, y, w, h = faceRect 
        # Рамка для лица 
        cv2.rectangle(img, (x, y), (x + h, y + w), color, 2) 
cv2.imshow("image", img) # отображать изображение 
c = cv2.waitKey(10) 
cv2.waitKey(0) 
cv2.destroyAllWindows()

Путь к файлу в приведенном выше коде используется для хранения пути к изображению, которое в данный момент необходимо обнаружить. Как правило, его можно разместить в том же каталоге, что и исходный файл. При построении opencvРаспознание классификатор лиц, требуется соответствующее Распознание файл конфигурации лиц, в котором хранятся файлы, используемые для Распознавания. Соответствующие параметры алгоритма лиц, этот файл можно найти в файле установки opencv. Оглавление: /usr/share/opencv4/. Найдя его, скопируйте в исходный файл Оглавление.

Нажмите Ctrl+F5 для запуска, диаграмма эффекта выглядит следующим образом:

(2)реализация на С++Распознавание лиц

В этом разделе описывается приложение C++ для обнаружения лиц на изображениях с использованием Qt5 для разработки. Соответствующие методы реализации такие же, как и в версии Python. В основном объясняет, как интегрировать Opencv в QT для разработки проектов на C++.

Разработка Opencv на C++ требует некоторой дополнительной настройки. Давайте сначала посмотрим на расположение opencv. Расположение заголовочного файла предустановленного Opencv4.1.1 Jetson Nano показано на рисунке ниже:

Файлы библиотеки размещаются по адресу:

Язык кода:javascript
копировать
/usr/lib/aarch64-linux-gnu

поэтому,Просто включите два вышеуказанных Оглавления в файл профиля Qt.

Используйте Qt Creator, чтобы снова открыть проект QTtest, созданный в разделе 2.4.5, и отредактируйте файл QTtest.pro следующим образом:

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

CONFIG += c++11 console
CONFIG -= app_bundle
CONFIG += C++11  # Добавить поддержку C++11.

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

INCLUDEPATH += /usr/include/opencv4 #Добавляем путь к заголовочному файлу

LIBS += -L/usr/lib/aarch64-linux-gnu -lopencv_core -lopencv_imgcodecs -lopencv_imgproc -lopencv_highgui -lopencv_objdetect  #Добавляем библиотеки, которые необходимо связать


SOURCES += main.cpp

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

Затем измените файл main.cpp, код следующий:

Язык кода:javascript
копировать
#include <iostream>
#include <string>
#include <opencv4/opencv2/opencv.hpp>
#include <opencv4/opencv2/core.hpp>
#include <opencv4/opencv2/highgui.hpp>
#include <opencv4/opencv2/imgproc.hpp>
#include <opencv4/opencv2/objdetect.hpp>
#include <opencv4/opencv2/imgproc/types_c.h>


using namespace std;
using namespace cv;
int main( int argc, char** argv )
{
    std::string filepath( "test.jpeg" );
    Mat img,gray;
    img = imread( filepath, IMREAD_COLOR );
    cvtColor(img, gray, CV_BGR2GRAY);

    CascadeClassifier classifier;
    classifier.load("haarcascade_frontalface_default.xml");
    Scalar color=Scalar(0, 255, 255);

    vector<Rect> faceRects;
    classifier.detectMultiScale(gray,faceRects,1.2,3,0,Size(32,32));

    for (size_t i = 0; i < faceRects.size(); i++)
    {
        rectangle(img, faceRects[i], color);
    }

    namedWindow( "Display window", WINDOW_AUTOSIZE );
    imshow( "Display window", img);
    waitKey(0);
    return 0;
}

Перегенерируйте весь проект, а затем поместите файлы test.jpeg и haarcascade_frontalface_default.xml в папку build-QTtest-unknown-Debug, созданную в результате компиляции. Результат запуска проекта следующий:

3.2 Обнаружение QR-кода (изготовление пистолета для сканирования кода)

Alipay и WeChat теперь широко используют QR-коды в качестве способов оплаты. При совершении реальных покупок мы часто показываем QR-коды на наших мобильных телефонах продавцам для сканирования. Можем ли мы сделать сканер QR-кода самостоятельно? С помощью Jetson Nano, встроенной платы для разработки искусственного интеллекта, мы можем создать собственный сканер кода.

3.2.1 Считать камеру

В этом разделе мы надеемся прочитать изображение через камеру и проанализировать QR-код на изображении в реальном времени, то есть реализовать функцию сканера кода. В этом разделе реализована функция чтения с камеры. Обычно есть два варианта камер: один — относительно дешевая камера CSI (камера Raspberry Pi), а другой — USB-камера. Стоит отметить, что если используется USB-камера, для чтения и рендеринга изображений будет использоваться графический процессор Jetson Nano. Если в настоящее время мы все еще выполняем некоторую работу по глубокому обучению, это, очевидно, потребует некоторых ресурсов графического процессора. Напротив, Jetson Nano будет использовать конвейер Gstreamer для обработки чтения и рендеринга камеры CSI и будет использовать специальное аппаратное ускорение, поэтому общий эффект обработки будет лучше.

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

(1) Считайте камеру CSI

Использование Gstreamer для чтения камер CSI в основном делится на три этапа: создание конвейера Gstreamer; привязка конвейера к видеопотоку opencv; покадровое извлечение и отображение. Подробный код, основанный на Python, впервые приведен ниже:

Язык кода:javascript
копировать
import cv2

# Установите параметры конвейера gstreamer
def gstreamer_pipeline(
    capture_width=1280, #Ширина предварительно захваченного изображения камерой
    capture_height=720, #Высота предварительно снятого изображения камерой
    display_width=1280, #Ширина изображения, отображаемого в окне
    display_height=720, #Высота изображения, отображаемого в окне
    framerate=60,       #Захват частоты кадров
    flip_method=0,      #Повернуть ли изображение
):
    return (
        "nvarguscamerasrc ! "
        "video/x-raw(memory:NVMM), "
        "width=(int)%d, height=(int)%d, "
        "format=(string)NV12, framerate=(fraction)%d/1 ! "
        "nvvidconv flip-method=%d ! "
        "video/x-raw, width=(int)%d, height=(int)%d, format=(string)BGRx ! "
        "videoconvert ! "
        "video/x-raw, format=(string)BGR ! appsink"
        % (
            capture_width,
            capture_height,
            framerate,
            flip_method,
            display_width,
            display_height,
        )
    )


if __name__ == "__main__":
    capture_width = 1280
    capture_height = 720
    display_width = 1280
    display_height = 720
    framerate = 60
    flip_method = 0

    # Создать конвейер
    print(gstreamer_pipeline(capture_width,capture_height,display_width,display_height,framerate,flip_method))

    #Привязка конвейера и видеопотока
    cap = cv2.VideoCapture(gstreamer_pipeline(flip_method=0), cv2.CAP_GSTREAMER)

    if cap.isOpened():
        window_handle = cv2.namedWindow("CSI Camera", cv2.WINDOW_AUTOSIZE)
        
        # Отображать покадрово
        while cv2.getWindowProperty("CSI Camera", 0) >= 0:
            ret_val, img = cap.read()
            cv2.imshow("CSI Camera", img)

            keyCode = cv2.waitKey(30) & 0xFF         
            if keyCode == 27:# Клавиша ESC для выхода
                break

        cap.release()
        cv2.destroyAllWindows()
    else:
        print("Не удалось открыть камеру")

Следуя первой части раздела 3.1.4, создайте в Code-OSS новый файл с именем csi_camera_test.py, затем скопируйте приведенный выше код в файл, сохраните его и нажмите Ctrl+F5, чтобы запустить сценарий (предварительное условие: убедитесь, что он установлена ​​точная камера CSI Raspberry Pi), эффект бега следующий:

Вы можете видеть, что изображение видеопотока может отображаться нормально, но из-за самой камеры Raspberry Pi на изображении все равно много шума, а также несколько искажается цвет (в реале рекомендуется купить камеру получше). промышленные сценарии). Ниже мы приводим синхронно версию для C++. Следуя второй части раздела 3.1.4, измените файл main.cpp следующим образом:

Язык кода:javascript
копировать
#include <iostream>
#include <string>
#include <opencv4/opencv2/opencv.hpp>
#include <opencv4/opencv2/core.hpp>
#include <opencv4/opencv2/highgui.hpp>
#include <opencv4/opencv2/imgproc.hpp>
#include <opencv4/opencv2/objdetect.hpp>
#include <opencv4/opencv2/imgproc/types_c.h>
#include <opencv4/opencv2/videoio.hpp>

using namespace std;
using namespace cv;

string gstreamer_pipeline (int capture_width, int capture_height, int display_width, int display_height, int framerate, int flip_method)
{
    return "nvarguscamerasrc ! video/x-raw(memory:NVMM), width=(int)" + to_string(capture_width) + ", height=(int)" +
           to_string(capture_height) + ", format=(string)NV12, framerate=(fraction)" + to_string(framerate) +
           "/1 ! nvvidconv flip-method=" + to_string(flip_method) + " ! video/x-raw, width=(int)" + to_string(display_width) + ", height=(int)" +
           to_string(display_height) + ", format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink";
}

int main( int argc, char** argv )
{
    int capture_width = 1280 ;
    int capture_height = 720 ;
    int display_width = 1280 ;
    int display_height = 720 ;
    int framerate = 60 ;
    int flip_method = 0 ;

    //Создать конвейер
    string pipeline = gstreamer_pipeline(capture_width,
    capture_height,
    display_width,
    display_height,
    framerate,
    flip_method);
    std::cout << «Использование конвейера gstreamer: \n\t" << pipeline << "\n";

    //Привязываем канал к видеопотоку
    VideoCapture cap(pipeline, CAP_GSTREAMER);
    if(!cap.isOpened())
    {
        std::cout<<"Не удалось открыть камеру."<<std::endl;
        return (-1);
    }

    //Создаем окно отображения
    namedWindow("CSI Camera", WINDOW_AUTOSIZE);
    Mat img;

    //Отображать покадрово
    while(true)
    {
        if (!cap.read(img))
        {
            std::cout<<"Не удалось захватить"<<std::endl;
            break;
        }
        imshow("CSI Camera",img);

        int keycode = cv::waitKey(30) & 0xff ; //Клавиша ESC для выхода
            if (keycode == 27) break ;
    }

    cap.release();
    destroyAllWindows() ;
}

Необходимо добавить дополнительные заголовочные файлы opencv для обработки видео #include <opencv4/opencv2/videoio.hpp>。кроме того,Вам также необходимо изменить файл pro.,Подключите библиотеку opencv_videoio, соответствующую обработке видео.,Полный файл профиля выглядит следующим образом:

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

CONFIG += c++11 console
CONFIG -= app_bundle
CONFIG += C++11  # Добавить поддержку C++11.

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

INCLUDEPATH += /usr/include/opencv4 #Добавляем путь к заголовочному файлу

LIBS += -L/usr/lib/aarch64-linux-gnu -lopencv_core -lopencv_imgcodecs -lopencv_imgproc -lopencv_highgui -lopencv_objdetect -lopencv_videoio  #Добавляем библиотеки, которые необходимо связать


SOURCES += main.cpp

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

(2) Чтение USB-камеры

По сравнению с чтением камер CSI, чтение USB-камер проще и требует всего двух шагов: покадровое открытие кадра; Однако следует отметить, что Jetson Nano поддерживает не все USB-камеры. При покупке рекомендуется выбирать USB-камеры без драйверов. В этой статье используется камера 4K HD.

Полный код версии Python приведен ниже:

Язык кода:javascript
копировать
import cv2
 
 #Создаем модуль захвата камеры
cap = cv2.VideoCapture(1)

#Создать окно
window_handle = cv2.namedWindow("USB Camera", cv2.WINDOW_AUTOSIZE)

# Отображать покадрово
while cv2.getWindowProperty("USB Camera", 0) >= 0:
    ret_val, img = cap.read()
    print(img.shape)
    
    # Изображение слишком большое, его необходимо отрегулировать.
    height, width = img.shape[0:2]
    if width>800:
        new_width=800
        new_height=int(new_width/width*height)
        img = cv2.resize(img, (new_width,new_height))
 
    cv2.imshow("USB Camera", img)

    keyCode = cv2.waitKey(30) & 0xFF         
    if keyCode == 27:# Клавиша ESC для выхода
        break

#Выпуск ресурсов
cap.release()
cv2.destroyAllWindows()

В приведенном выше коде при открытии камеры используется cap = cv2.VideoCapture(1). Параметр 1 здесь обусловлен тем, что текущий Jetson Nano также подключен к камере CSI. Идентификатор камеры CSI равен 0, поэтому идентификатор камеры USB равен 1. Это можно получить путем тестирования во время фактического использования. Кроме того, приведенный выше код ограничивает размер изображения. Если ширина превышает 800, масштабированное изображение будет отображаться снова. Рендеринг выглядит следующим образом:

Видно, что эта USB-камера 4K имеет хороший эффект отображения изображения, с более реалистичными цветами и меньшим уровнем шума. Мы продолжим использовать эту камеру для обнаружения QR-кода позже.

Код версии C++ приведен ниже. Измените файл main.cpp, код выглядит следующим образом:

Язык кода:javascript
копировать
#include <iostream>
#include <string>
#include <opencv4/opencv2/opencv.hpp>
#include <opencv4/opencv2/core.hpp>
#include <opencv4/opencv2/highgui.hpp>
#include <opencv4/opencv2/imgproc.hpp>
#include <opencv4/opencv2/objdetect.hpp>
#include <opencv4/opencv2/imgproc/types_c.h>
#include <opencv4/opencv2/videoio.hpp>

using namespace std;
using namespace cv;

int main( int argc, char** argv )
{
    //Открываем камеру
    VideoCapture cap(1);

    //Создаем окно отображения
    namedWindow("USB Camera", WINDOW_AUTOSIZE);
    Mat img;

    //Отображать покадрово
    while(true)
    {
        if (!cap.read(img))
        {
            std::cout<<"Не удалось захватить"<<std::endl;
            break;
        }
        int new_width,new_height,width,height,channel;
        width=img.cols;
        height=img.rows;
        channel=img.channels();
        cout<<width<<"  "<<height<<"  "<<channel<<endl;

        new_width=800;
        if(width>800)
        {
            new_height=int(new_width*1.0/width*height);
        }

        resize(img, img, cv::Size(new_width, new_height));
        imshow("USB Camera",img);

        int keycode = cv::waitKey(30) & 0xff ; //Клавиша ESC для выхода
            if (keycode == 27) break ;
    }

    cap.release();
    destroyAllWindows() ;
}

Эффект следующий:

3.2.2 Обнаружение и считывание QR-кода

В этом разделе будет использоваться Opencv для реализации Обнаружения. и чтение Функция QR-кода. После opencv4.0 был интегрирован модуль чтения QR-кода. Поэтому мы можем использовать последнюю версию opencv для реализации Обнаружения. и чтение QR-кода。Обнаружение и распознавание QR-код в основном делится на 3 этапа: используйте функцию QRCodeDetector() для создания детектора QR-кода; используйте функциюDetectAndDecode для Обнаружения изображения; и распознавание QR-кода;Вывод результатов обнаружения。

Главное здесь — прочитать каждый кадр видеопотока и затем обнаружить изображение.,для удобства,Мы приводим только полный пример для USB-камеры.,Для камер CSI вы можете перенести соответствующий код обнаружения QR-кода в соответствии с содержимым раздела 3.2.1. В сочетании с кодом для получения видео с USB-камеры в разделе 3.2.1.,Дает полную версию Обнаружения на Python. и чтение QR-код:

Язык кода:javascript
копировать
import cv2
import numpy as np
 
 #Создаем модуль захвата камеры
cap = cv2.VideoCapture(1)

#Создать окно
window_handle = cv2.namedWindow("USB Camera", cv2.WINDOW_AUTOSIZE)

#Создать детектор QR-кода
qrDecoder = cv2.QRCodeDetector()

# Отображать покадрово
while cv2.getWindowProperty("USB Camera", 0) >= 0:
    ret_val, img = cap.read()
    #print(img.shape)
    
    # Изображение слишком большое, его необходимо отрегулировать.
    height, width = img.shape[0:2]
    if width>800:
        new_width=800
        new_height=int(new_width/width*height)
        img = cv2.resize(img, (new_width,new_height))

    # Обнаружение и распознавание QR-кода
    data,bbox,rectifiedImage = qrDecoder.detectAndDecode(img)
    if len(data)>0:
        print("Раскодированные данные : {}".format(data))
        n = len(bbox)
        for j in range(n):
            cv2.line(img, tuple(bbox[j][0]), tuple(bbox[ (j+1) % n][0]), (255,0,0), 3)
    else:
        print("QR-код не обнаружен")

    #отображать изображение
    cv2.imshow("USB Camera", img)

    keyCode = cv2.waitKey(30) & 0xFF         
    if keyCode == 27:# Клавиша ESC для выхода
        break

#Выпуск ресурсов
cap.release()
cv2.destroyAllWindows()

Визуализации следующие:

Полный код версии C++ выглядит следующим образом:

Язык кода:javascript
копировать
#include <iostream>
#include <string>
#include <opencv4/opencv2/opencv.hpp>
#include <opencv4/opencv2/core.hpp>
#include <opencv4/opencv2/highgui.hpp>
#include <opencv4/opencv2/imgproc.hpp>
#include <opencv4/opencv2/objdetect.hpp>
#include <opencv4/opencv2/imgproc/types_c.h>
#include <opencv4/opencv2/videoio.hpp>
#include <opencv4/opencv2/imgcodecs.hpp>

using namespace std;
using namespace cv;

int main( int argc, char** argv )
{
    //Открываем камеру
    VideoCapture cap(1);

    //Создаем окно отображения
    namedWindow("USB Camera", WINDOW_AUTOSIZE);
    Mat img;

    //Создаем детектор QR-кода
    QRCodeDetector qrDecoder = QRCodeDetector();

    //Отображать покадрово
    while(true)
    {
        if (!cap.read(img))
        {
            std::cout<<"Не удалось захватить"<<std::endl;
            break;
        }
        int new_width,new_height,width,height,channel;
        width=img.cols;
        height=img.rows;
        channel=img.channels();
        //cout<<width<<"  "<<height<<"  "<<channel<<endl;

        //Регулируем размер изображения
        new_width=800;
        if(width>800)
        {
            new_height=int(new_width*1.0/width*height);
        }
        resize(img, img, cv::Size(new_width, new_height));

        //Обнаружение и чтение QR-кода
        Mat bbox, rectifiedImage;
        std::string data = qrDecoder.detectAndDecode(img, bbox, rectifiedImage);
        if(data.length()>0)
        {
            cout << «Декодированные данные: " << data << endl;

            int n = bbox.rows;
            for(int i = 0 ; i < n ; i++)
            {
                line(img, Point2i(bbox.at<float>(i,0),bbox.at<float>(i,1)), Point2i(bbox.at<float>((i+1) % n,0), bbox.at<float>((i+1) % n,1)), Scalar(255,0,0), 3);
            }
        }
        else
            cout << «QR-код не обнаружен» << endl;

        imshow("USB Camera",img);

        int keycode = cv::waitKey(30) & 0xff ; //Клавиша ESC для выхода
            if (keycode == 27) break ;
    }

    cap.release();
    destroyAllWindows() ;
}

Эффект такой, как показано ниже:

3.3 Управление двухцветной светодиодной подсветкой (GPIO)

3.3.1 Реализация Python

Очень важным функциональным модулем Jetson Nano является аппаратное управление, которое обеспечивает множество функций DIY IoT. На предыдущем физическом изображении Jetson Nano мы видим 40 аккуратно расположенных контактов GPIO, которые используются Jetson Nano для управления сигналами от аппаратных устройств. Итак, как использовать эти интерфейсы GPIO?

Здесь Jetson Nano предоставляет готовую библиотеку Python: Jetson.GPIO. В исходной системе Jetson Nano по умолчанию предварительно установлена ​​библиотека Jetson.GPIO. Если она была случайно удалена или удалена, вы можете установить ее с помощью следующей команды:

Язык кода:javascript
копировать
sudo pip3 install Jetson.GPIO

Затем установите разрешения:

Язык кода:javascript
копировать
sudo groupadd -f -r gpio
sudo usermod -a -G gpio <your_user_name>

Просто перезапустите после настройки:

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

Прежде чем использовать конкретно GPIO, давайте сначала поймем функциональное распределение этих контактов:

Функция каждого контакта отмечена на рисунке выше. Два столбца контактов в середине соответствуют 40 контактам. В основном мы ориентируемся на конкретный порт GPIO и порт GND. GPIO можно понимать как порт ввода информации, а его высокий и низкий уровни могут контролироваться кодом Python. GND представляет собой заземление (в школьной физике GPIO здесь можно понимать просто так. Как только GPIO установлен на высокий уровень). уровень, это эквивалентно включению. Положительный полюс источника питания и GND эквивалентен отрицательному полюсу источника питания. Добавьте небольшую лампу и резистор в середине, чтобы сформировать базовую структуру цепи). В этом разделе мы узнаем, как использовать GPIO для включения небольшого светодиодного индикатора. Лампа изображена на картинке ниже (купить такой фонарик можно в любом интернет-магазине, очень недорого):

Модуль на рисунке имеет три контакта: контакт, отмеченный знаком «-» слева, подключен к GND, контакт посередине подключен к GPIO, а контакт, отмеченный буквой «S» справа, также подключен к GPIO. .

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

Когда на выводе S высокий уровень, светодиод загорается другим цветом.

Основная принципиальная схема двухцветного светодиодного фонаря выглядит следующим образом:

Судя по приведенной выше схематической диаграмме, то, что нам нужно сделать, очень просто. Здесь мы выбираем GPIO 13 (соответствует контакту 22) и GPIO15 (соответствует контакту 18) в качестве управляющих сигналов двух цветов и выбираем контакт 30 для GND. Поэтому нам нужно только подключить три интерфейса светодиода соответственно.

Язык кода:javascript
копировать
# импортироватьбиблиотека GPIO
import Jetson.GPIO as GPIO
 
# Импортировать библиотеку времени
import time 
 
# Определить сигнальный контакт
pin1 = 22
pin2 = 18
 
# Установить режим GPIO
GPIO.setmode(GPIO.BOARD)

# Установите начальное значение начального сигнала контакта
GPIO.setup(pin1, GPIO.OUT, initial=GPIO.LOW) 
GPIO.setup(pin2, GPIO.OUT, initial=GPIO.LOW) 
 
# Переключение состояния светодиодного индикатора каждые две секунды
print('Нажмите ctrl+c, чтобы выйти')
try:
    while True: 
      time.sleep(2) 
      GPIO.output(pin1, GPIO.HIGH) 
      GPIO.output(pin2, GPIO.LOW) 
      time.sleep(2) 
      GPIO.output(pin2, GPIO.HIGH) 
      GPIO.output(pin1, GPIO.LOW) 
except KeyboardInterrupt:
    pass

# Выключайте свет после остановки
GPIO.setup(pin1, GPIO.OUT, initial=GPIO.LOW) 
GPIO.setup(pin2, GPIO.OUT, initial=GPIO.LOW) 

# Очистить ресурсы
GPIO.cleanup()

финальный Эффект такой, как показано ниже:

3.3.2 Реализация C++

Сначала необходимо скомпилировать и установитьC++-версия библиотеки Jetson GPIO.。Конкретные команды следующие::

Язык кода:javascript
копировать
git clone https://github.com/pjueon/JetsonGPIO
cd JetsonGPIO/build
make all
sudo make install

После завершения установки созданный файл библиотеки libJetsonGPIO.a будет автоматически скопирован в /usr/local/lib/Оглавление.,Скопируйте заголовочный файл JetsonGPIO.h в /usr/local/include/Оглавление.,Позже мы сможем написать программу на C++ и использовать ее напрямую.

После установки перезагрузите систему:

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

После перезапуска мы можем использовать следующую команду, чтобы проверить, правильно ли установлена ​​версия C++ библиотеки GPIO:

Язык кода:javascript
копировать
find /home -name JetsonGPIO.h

Обычно выводится соответствующий путь к заголовочному файлу, как показано ниже:

Язык кода:javascript
копировать
/home/qb/code/JetsonGPIO/include/JetsonGPIO.h

Затем создайте папку с именем CGpioDemo, а затем создайте в ней два файла: CMakelists.txt и CGpioDemo.cpp. Содержимое CMakelists.txt следующее:

Язык кода:javascript
копировать
cmake_minimum_required (VERSION 3.8)

project ("CGpioDemo")

#Добавляем путь к заголовочному файлу
include_directories(/home/qb/code/JetsonGPIO/include)

#Добавляем путь к файлу библиотеки
link_directories(/home/qb/code/JetsonGPIO/build)

# Добавьте исходный код в исполняемый файл этого проекта.
add_executable (CGpioDemo "CGpioDemo.cpp")

# TODO: При необходимости добавьте тесты и установите таргеты.
target_link_libraries( CGpioDemo -lJetsonGPIO -lpthread)

Обратите внимание, что /home/qb/code/JetsonGPIO/include и /home/qb/code/JetsonGPIO/build в приведенном выше коде необходимо изменить в соответствии с их собственными путями. Эти два пути — это пути к только что скомпилированной библиотеке JetsonGPIO.

Содержимое CGpioDemo.cpp следующее:

Язык кода:javascript
копировать
//импортируем файл
#include <iostream>
#include <chrono> 
#include <thread>
#include <signal.h>

//Импорт библиотеки Jetson GPIO-файл
#include <JetsonGPIO.h>

using namespace std;


// Определить флаг выхода программы
bool done = false;

// Определить функцию обратного вызова сигнала прерывания ключа
void signalHandler(int s) {
    done = true;
}

int main() {

    // Определить пин
    int pin1 = 22;
    int pin2 = 18;

    //Определяем сигнал функции обратного вызова, программа завершается при нажатии клавиши Ctrl+C
    signal(SIGINT, signalHandler);

    //Установим режим 
    GPIO::setmode(GPIO::BOARD);

    //LED закрепить начальные настройки
    GPIO::setup(pin1, GPIO::OUT, GPIO::LOW);
    GPIO::setup(pin2, GPIO::OUT, GPIO::LOW);

    std::cout << "в соответствии с CTRL+C Выйти из программы" << std::endl;

    int curr_value = GPIO::LOW;

    //прыгаем каждые 2 секунды
    while (!done) {

        std::this_thread::sleep_for(std::chrono::milliseconds(2000));
        GPIO::output(pin1, GPIO::HIGH);
        GPIO::output(pin2, GPIO::LOW);

        std::this_thread::sleep_for(std::chrono::milliseconds(2000));
        GPIO::output(pin2, GPIO::HIGH);
        GPIO::output(pin1, GPIO::LOW);
    }

    //Выключаем свет
    GPIO::output(pin2, GPIO::LOW);
    GPIO::output(pin1, GPIO::LOW);

    //Очистить ресурсы
    GPIO::cleanup();
    return 0;
}

Затем скомпилируйте cmake по методу C++.

4. Резюме

Этот блог от Jetson Установка Nano будет объяснена с самого начала и до разработки Распознавания. лица, пистолет для сканирования QR-кода, двухцветные светодиодные фонари и т. д. Случай исчерпан. Это руководство больше основано на реальном использовании и учит читателей шаг за шагом создавать продукты с искусственным интеллектом, исходя из концепции встроенных продуктов. Каждое руководство включает версии как на Python, так и на C++. Чтобы адаптироваться к новым читателям, выбранные тексты относительно просты. Судя по реальной ситуации, искусственный интеллект в настоящее время больше использует глубокое обучение для операций высокоточного вывода. По сравнению с традиционными алгоритмами глубокое обучение может значительно повысить точность обнаружения, распознавания и семантической сегментации изображений. Однако как эффективно реализовать алгоритмы глубокого обучения. стала актуальной проблемой. Самая горячая тема — как эффективно реализовать так называемые периферийные вычисления. Джетсон Плата для разработки искусственного интеллекта, выпущенная NVIDIA, Nano очень подходит в качестве встроенной платформы для глубокого обучения. Особенно в сочетании с комплектом разработки TensorRT, выпущенным NVIDIA, она может еще больше ускорить вывод моделей, обученных с помощью различных платформ глубокого обучения. Согласно анализу данных, опубликованному NVIDIA, использование TensorRT может ускорить время вывода более чем в 3 раза. Поэтому будущее использование Jetson Одно из ключевых направлений Nano — практическое применение глубокого обучения.

В этом руководстве будет продолжено обновление контента, связанного с глубоким обучением Jetson Nano.

Издатель: Full stack программист и руководитель стека, укажите источник для перепечатки: https://javaforall.cn/151747.html Исходная ссылка: https://javaforall.cn

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose