Raspberry Pi コンピュータビジョンプログラミング: 1~5

原文:Raspberry Pi Computer Vision Programming

ライセンス: CC BY-NC-SA 4.0

翻訳者:フェイロン

この記事は[ApacheCN Computer Vision Translation Collection]から引用されており、翻訳後編集 (MTPE)プロセスを使用して効率を可能な限り向上させています。

他人があなたに利益がないと言うなら、しない方がいいし、他人があなたが何かをやったと言えば、本当にやった方が良いです。

1. コンピュータービジョンとRaspberry Piの概要

OpenCV は、コンピューター ビジョン用のシンプルかつ強力なプログラミング フレームワークです。コンピューター ビジョンの分野の初心者も専門家も気に入っています。プログラミング言語として Python 3 を使用して OpenCV プログラムを作成することで、コンピューター ビジョンを簡単に学ぶことができます。シングルボード コンピューターの Raspberry Pi ファミリは、優先開発言語として Python を使用します。Raspberry Pi ボードと Python 3 を使用して OpenCV プログラミングを学習することは、コンピューター ビジョン プログラミングの驚くべき分野への素晴らしい旅を始めるための最良の方法の 1 つです。この章では、Raspberry Pi とコンピューター ビジョンを始めるために必要なすべての重要な概念について学びます。この章を終えると、さまざまな Raspberry Pi マザーボード モデルでRaspbianオペレーティング システム( OS ) をセットアップできるようになります。これらのボードをインターネットに接続する方法も学習します。

この章では、次のトピックについて説明します。

  • コンピュータービジョンについて学ぶ
  • シングルボードコンピュータ
  • Raspberry Pi シリーズ シングルボード コンピュータ
  • Raspberry Pi で Raspbian OS をセットアップする
  • さまざまな Pi ボード モデルを LAN または Wi-Fi 経由でインターネットに接続します

この章を終えると、独自の Raspberry Pi ボードをセットアップできるようになります。

コンピュータービジョンについて学ぶ

コンピュータ ビジョンの分野は、コンピュータ サイエンス、数学、電気工学など (ただしこれらに限定されない) さまざまな分野を組み合わせたものです。意思決定を支援するために、現実世界から画像やビデオをキャプチャ、処理、分析する方法が含まれています。コンピュータ ビジョンとは、生物学的 (つまり、人間および人間以外の) 視覚を模倣することを意味します。ほとんどのコンピュータ ビジョン システムの最終目標は、意思決定のために静止画像やビデオ (事前に記録されたビデオやライブ フィードを含む) から有用な情報を抽出することです。生物視覚システムも同様に機能します。さらに、生物学的視覚とは異なり、コンピューター ビジョンは、赤外線画像や深度画像など、生物学的実体には見えない可視スペクトルの画像を取得して処理することもできます。

コンピューター ビジョンには、キャプチャした画像やビデオから情報を抽出する分野も含まれます。コンピューター ビジョン システムは、画像、ビデオ、ライブ ビデオ ストリームなどのさまざまな種類のデータを入力として受け入れ、重要な意思決定を行うために意味のある情報をさらに処理、分析、抽出できます。

以下の図に示すように、人工知能、マシン ビジョン、コンピューター ビジョンの分野は、画像処理、パターン認識、機械学習などの多くのトピックで重複し、共有しています。

図 1.1 – さまざまな科学分野間の関係

図 1.1 – 異なる科学分野間の関係

コンピューター ビジョンの分野の研究者になるには、数学についてのしっかりした背景と理解を持っている必要があります。ただし、OpenCV と Python 3 を使用してコンピューター ビジョン用のプログラムを作成するには、多くの数学の知識は必要ありません。この本では、画像処理とコンピューター ビジョンを始めるのに必要な数学的および理論的概念をすべて学ぶことができることに注意してください。

コンピュータ ビジョン システムの一般的な目標は、次の 1 つ以上です。

  • 物体認識、視覚検出のための分類、および動作分析
  • 画像を使用してシーンを再構成する
  • 画像のノイズ低減と復元

これらの重要な用語に詳しくなくても、プレッシャーを感じる必要はありません。私たちは旅を通じて、これらの概念の多くを探求し、実装していきます。

OpenCV

OpenCV (オープンソース コンピューター ビジョンとも呼ばれます) は、コンピューター ビジョンと機械学習用のオープンソース ライブラリです。画像処理とコンピュータビジョンのための多くの機能を備えています。多くのプログラミング言語やOSで利用できるクロスプラットフォームライブラリです。コンピュータービジョンと機械学習関連の機能が多数あります。また、いくつかのグラフィカル ユーザー インターフェイス( GUI ) およびイベント処理機能も備えています。

OpenCV は、Berkeley Software Distribution ( BSD ) に基づいてライセンス供与されており、学術目的および商業目的での使用は無料です。C++ プログラミング言語で書かれています。C/C++、Python、Java を含む (ただしこれらに限定されない) ほとんどの一般的なプログラミング言語のインターフェイスを備えています。Windows、Android、Linux、macOS、その他の Unix 系オペレーティング システムなど、さまざまなオペレーティング システム上で実行されます。この本では、OpenCV と Python 3 を使用して、コンピューター ビジョンに関連するプログラムを作成します。

このライブラリには、機械学習およびコンピューター ビジョン タスク用に 2,500 を超える最適化されたアルゴリズムが含まれています。47,000 人を超えるコンピューター ビジョンの専門家からなるコミュニティがあり、1,800 万回以上ダウンロードされています。OpenCV は、さまざまな業界セクターの教育、研究機関、政府機関、学術界で広く使用されています。Google、Yahoo、Microsoft、Intel、IBM、Sony、Honda、Toyota などの有名な組織が OpenCV を使用しています。

OpenCVの歴史を見てみましょう。OpenCV はもともと、画像とビデオを処理するためのフレームワークを開発するための Intel Research の内部プロジェクトでした。当初はWillow Garageによってサポートされ、その後Itseez によってサポートされました。

知らせ

このページから Willow Garage の Web サイトにアクセスできます。

2012 年 8 月、独立した非営利組織である OpenCV.org が、OpenCV のさらなる開発とサポートの責任を引き継ぎました。OpenCV Web サイトを管理しています。2016 年 5 月、インテルは Itseez を買収しました。次の URL には、Intel および OpenCV.org からのプレス リリースがあります。

OpenCV 関連の開発の簡単なタイムラインは次のとおりです。

図 2: OpenCV のタイムライン

図 1.2 – OpenCV タイムライン

OpenCV ライブラリのさまざまなバージョンやプレスリリースなど、すべての詳細はこのページで見つけることができます。

Raspberry Pi をプラットフォームとしてコンピューター ビジョン プログラムを作成するため、シングルボード コンピューターと Raspberry Pi について詳しく見ていきます。Raspberry Pi シングルボード コンピューターのさまざまなモデルで Raspbian OS をセットアップする方法を学びます。

シングルボードコンピュータ

シングル ボード コンピュータ( SBCと略記)は、単一のプリント基板( PCBと略記)上の完全なコンピュータ システムです。通常、ボードにはプロセッサ、RAM、入出力( I/O )、ネットワーク用のイーサネット ポート、および USB デバイスとのインターフェース用の USB ポートが備わっています。シングルボード コンピューターの中には、Wi-Fi と Bluetooth を備えているものもあります。SBC は、Ubuntu、Windows、Debian などの OS ディストリビューションを実行します。これらの OS ディストリビューションには、これらの SBC 専用にカスタマイズされたバージョンがあります。

従来のコンピュータとは異なり、シングルボード コンピュータはモジュール式ではなく、すべてのコンポーネント (CPU、RAM、GPU、インターフェイス ポートなど) が単一の PCB 自体に統合されているため、ハードウェアをアップグレードできません。SBC は、学術、研究、その他さまざまな業界で低コストのコンピューターとして使用されています。組み込みシステムにおける SBC の使用は非常に広く普及しており、多くの個人、研究機関、企業が SBC に基づいて完全に機能し、使用可能な製品を開発、リリースしています。これらの製品の多くはクラウドファンディングで支援されています。SBC の主な利点は、オンボードの汎用入出力( GPIO ) ピンです。これらのピンによって提供される機能には、さまざまなバス (シリアル ペリフェラル インターフェイス( SPI )、I2C、および SMBus)、デジタル I/O、アナログ入力、およびパルス幅変調( PWM ) 出力が含まれます。このような専門用語に圧倒されないように注意してください。これらの概念のほとんどを、実験を使ってさらに詳しく学びます。ほとんどすべての一般的な SBC には、何らかの形式の GPIO が搭載されています。小型フォームファクターとオンボード GPIO により、学校、大学、トレーニング センター、ブート キャンプ、メーカーの現場で人気があります。これらはセンサー ネットワークやモノのインターネット( IoT )の分野で頻繁に使用されます

まとめると、SBC の利点は次のとおりです。

  • 低コスト
  • 小さいサイズ
  • 低消費電力
  • オンボードネットワーキングとI/Oを提供

ただし、SBC には独自の欠点があります。SBC のすべてのコンポーネントは同じ PCB 上にあるため、コンポーネントが機械的または電気的な理由で損傷した場合、修復が困難になる可能性があります。同じ理由で、SBC では何もアップグレードすることもできません。SBC の主な欠点はこれらのみです。

1976 年にジョン タイタスによって設計されたマイクロコンピュータ トレーナー MMD-1 は、Intel マイクロプロセッサ C8080A をベースとした最初の真のシングルボード マイクロコンピュータでした。プロトタイプ開発段階ではDynamic Microと呼ばれていましたが、量産ユニットはMMD-1 ( Mini-Micro Designer 1の略) と呼ばれていました。

ここからはRaspberry Piシリーズについて詳しく紹介していきます。しかし、その前に、他の人気のある SBC ファミリーに会うことになります。

Beagleboard 家族

BeagleBoard.org Foundation は、米国に拠点を置く組織です。これは、組み込みシステムの分野におけるオープンソースのハードウェアとソフトウェアの設計、開発、テスト、使用に関する教育とコラボレーションを提供することを目標とする非営利団体です。彼らは、飼い犬の人気品種であるビーグルにちなんで名付けられたさまざまなベニヤユニットを開発しました。このページでは、彼らが開発し、生産中の現在の SBC のリストを見つけることができます。Beagle ボード関連製品やアクセサリーも同じ URL で見つけることができます。

この記事の執筆時点では、同社の最新製品はPacketBeagleです。

ASUS ティンカーボード

ASUS Tinkerboard は台湾の ASUS によって設計および製造されています。そのサイズ、レイアウト、ピン配置は、第 2 世代および第 3 世代の Raspberry Pi ボードと互換性があります。ASUS Tinkerboard のすべてのバージョンの詳細については、このページをご覧ください。下の画像は、ASUS Tinkerboard の上面図を示しています。

図 3: ASUS Tinkerboard

図 1.3 – ASUS Tinkerboard

NVIDIA ジェットソン

NVIDIA Jetson は、コンピューター ビジョン、AI、音声処理タスク用のモジュール ファミリです初心者にとってベストメンバーはJetson Nanoです。まずはJetson Nano Developer Kitの Web ページから始めるのが最適です以下は開発者キットの側面図です。

図 4: Nvidia Jetson Nano

図 1.4 – Nvidia Jetson Nano

インテルのマザーボード

Intel Corporation も、SBC と呼ばれるボードを多数製造しています。現在作成されているモジュールに関する詳細情報は、このページで見つけることができます。私たちは、いくつかの優れたインテル SBC とモジュールを使用する特権に恵まれています。これらの製品の多くは製造中止になっており、その完全なリストとサポート ドキュメントはこのページにあります。インテルからは、使用済みのボードや製造中止になったボードが大量に入手できる場合があることに注意してください。勉強にも最適です。コンピューター ビジョンの初心者には、 Intel Up Squared Kitをお勧めします詳細については、このページをご覧ください。

ラズベリーパイ

Raspberry Pi は、英国に本拠を置く Raspberry Pi Foundation によって開発された一連の低コストのクレジット カード サイズの SBC です。Raspberry Pi は、学校での基本的なコンピューター スキルとプログラミングの教育を促進するために開発されたもので、これを非常にうまく行っています。Raspberry Pi は、組み込みシステム市場だけでなく、学術界や産業用途でのコンピューター サイエンス研究でも注目を集め、本来の用途を大きく超えています。

Raspberry Pi Foundation は、多くの人気のある OS ディストリビューションのダウンロードを提供します。Raspberry Piでは、Python、C、C++、Javaなどの複数のプログラミング言語を使用できます。詳細については、Raspberry Pi Foundation の Web サイトをご覧ください。

ラズベリーパイモデル

Raspberry Pi ボードにはさまざまなモデルがあります。さらに、これらのモデルに関連するアクセサリも多数あります。現在生産中のモデルのリストは、Raspberry Pi Foundation の製品ページで確認できます。残念ながら、このページには Raspberry Pi ファミリの生産終了した製品ボードに関する情報はありません。

さらに、Raspberry Pi は、産業および組み込みアプリケーション向けに、より柔軟な形式で利用できます。これはコンピューティング モジュールと呼ばれます。計算モジュールの反復も多数あります。財団はコンピューティング モジュールのプロトタイプ キットも提供しています。コンピューティング モジュールとプロトタイピング キットの詳細については、前述した同じ Raspberry Pi 製品ページで見つけることができます。

すでに説明したように、Raspberry Pi 開発ボードには多くのモデルが用意されています。これらすべてのボードの技術仕様について詳細に議論したいと思うかもしれませんが、簡単に議論するのは困難です。この本の初版では、モデルの数がはるかに少なく、信頼できるすべての Raspberry Pi ボード モデルの仕様について詳しく説明しました。この本の第 2 版が書かれて以来、10 を超える Raspberry Pi モデルが登場しました。したがって、Raspberry Pi のいくつかのボード モデルの技術仕様についてのみ説明します。

コンピューター ビジョンの例では、ヘッダー モデルを備えた Raspberry Pi 4B 4 GB および Raspberry Pi ZeroW を使用します。ただし、これらの例は他の Raspberry Pi ボード モデルでも動作します。これは、私たちが使用するすべてのソフトウェア (オペレーティング システム、プログラミング言語、OpenCV ライブラリ) に完全な下位互換性があるためです。

ラズベリーパイ モデル 4B

Raspberry Pi 4B の製品仕様は、このページで確認できます。

以下の表に製品仕様の詳細を示します。

図5:Raspberry Piモデル4Bの製品仕様一覧

図 1.5 – Raspberry Pi Model 4B の製品仕様リスト

以下の画像は、Raspberry Pi ボード上のすべての重要なコネクタとコンポーネントを示しています。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-ZIAjENYf-1681873103260)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_06.jpg)]

図 1.6 – Raspberry Pi 4B の上面図

以下の画像は、Raspberry Pi モデル 4B の上面図を示しています。

図 7: Raspberry Pi 4B の上面図

図 1.7 – Raspberry Pi 4B の上面図

こちらがモデルの斜めからの写真です。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-Wc9P9c4z-1681873103261)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_08.jpg)]

図 1.8 – 傾けた Raspberry Pi 4B

このモデルの 4GB バージョンを使用します。

ラズベリーパイゼロW

Raspberry Pi Zero W の仕様については、このページで確認できます。

以下の表は、このモデルの仕様を詳しく説明しています。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-MhjB8Jre-1681873103261)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_09.jpg)]

図 1.9 – Raspberry Pi Zero W 製品仕様リスト

これらのモデルはどこで購入できますか?

Raspberry Pi ボードとアクセサリの購入先は、RPi Web サイトの製品ページで確認できます。スクリーンショットは次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-xuCCrKBC-1681873103261)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_10.jpg)]

図 1.10 – Raspberry Pi の購入

Raspberry Pi ボードとアクセサリも Amazon で見つけることができます。大都市に住んでいる場合は、Raspberry Pi ボードや関連製品を販売している趣味の電気店がたくさんあります。

Raspberry Pi用のオペレーティングシステム

多くのオペレーティング システムには、Raspberry Pi ボードに合わせて調整されたオペレーティング システムのバージョンがあります。ただし、以前のマザーボード モデルはすべてのオペレーティング システムをサポートしているわけではありません。最新モデルのボードであるRaspberry Pi 4B は、前述のすべてのオペレーティング システムをサポートしています。

Raspbian オペレーティング システムは、Raspberry Pi ボードのすべてのモデルをサポートしており、初心者に最も推奨されるオペレーティング システムです。次のセクションでインストール方法を説明します。

Raspbian は、Linux の人気ディストリビューションである Debian をベースにした無料のオペレーティング システムです。Raspbian は Raspberry Pi ハードウェア用に最適化されています。Raspbian プロジェクトの詳細については、そのホームページで見つけることができます。

知らせ

Raspbian のホームページには、Raspberry Pi Foundation とは提携しておらず、Raspberry Pi および Debian プロジェクトのファンによって運営されていると記載されています。

Raspbian Web ページは、推奨される Raspbian イメージのリストが記載されています。OS イメージは SD カードに書き込むことができるファイルで、Raspberry Pi ボードの起動に使用できます。これは RPi を始める最も簡単な方法です。これから、使ってみることにします。RPi Foundation のダウンロード ページで提供されているイメージは、Raspbian で最も推奨されているイメージです。次のセクションでは、このイメージを使用して RPi を始める方法を学びます。

Raspberry Pi で Raspbian をセットアップする

セットアップは、多くの初心者愛好家が SBC を使い始めるのを妨げる問題の 1 つです。多くの場合、これらの手順は非常に一般的なものであり、さまざまなタイプのハードウェア コンポーネントのすべての状況をカバーしているわけではありません。そのため、RPi 上での Raspbian のセットアップにセクション全体を費やしました。このセクションでは、コンピューティング モジュールを除く、インストールされているすべてのボード モデルのセットアップについて詳しく説明します。

これを設定するには次のコンポーネントが必要です。

  • Raspberry Pi ボードの任意のモデル。
  • Raspberry Pi 4B ボードをお持ちの場合は、USB Type-C ピンを備えた 5V 3A 電源が必要です。USB Type-C のピン配置の写真は次のとおりです。

図 11: USB Type-C ピン

図 1.11 – USB Type-C のピン配置

  • 安全を期すために、Raspberry Pi Foundation から公式のRaspberry Pi 15.3W USB-C 電源を購入することをお勧めします。商品のURLはこちらのページです。
  • 他のすべての Raspberry Pi モデルでは、Micro-USB タイプのピンを備えた 5V 2.5A 電源に互換性がある必要があります。これは Micro-USB ピンの写真です。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-af0eJqov-1681873103262)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_12.jpg)]

図 1.12 – マイクロ USB ピン

  • この目的のために、Raspberry Pi ユニバーサル電源を購入するとよいでしょう。
  • USB キーボードとマウス: 以下に示すように、マウス パッドが統合された USB キーボードを購入することをお勧めします。

図 13: マウスパッドが統合されたキーボード

図 1.13 – マウスパッドが統合されたキーボード

  • RPi Zero および RPi Zero W の場合、これらのボード モデルには周辺機器インターフェイスへの Micro-USB タイプのコネクタしかないため、マウス パッド付きのキーボードを使用する必要があります。さらに、RPi Zero および RPi Zero W の場合は、以下に示すように、USB から Micro-USB OTG コンバーターが必要です。

図 14: USB OTG ケーブル

図 1.14 – USB OTG ケーブル

  • 任何型号的 Raspberry Pi 板均可与任何 microSD 卡配合使用。 该准则指出,我们应使用至少 16 GB 的 10 级 microSD 卡。 您可能需要访问这个页面获取指导,并访问这个页面获得兼容性列表。 RPi 1 Model A 和 RPi 1 Model B 使用 SD 卡。 因此,最好使用 microSD 到 SD 卡的适配器,如下所示:

図 15: MicroSD から SD カードへのアダプター/コンバーター

图 1.15 – MicroSD 到 SD 卡的适配器/转换器

  • 用于视觉显示的 HDMI 监视器或 VGA 监视器。
  • 除 RPi 4B,RPi Zero 和 RPi Zero W 外,所有 RPi 板型号均具有 HDMI 输出,并可使用 HDMI 公对公电缆直接连接到 HDMI 监视器:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I2hqXXkc-1681873103263)(https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/raspi-cv-prog/img/B16208_01_16.jpg)]

图 1.16 – HDMI 电缆

RPi 4B 具有微型 HDMI 输出。 因此,我们需要一个微型 HDMI 到 HDMI 转换器。 RPi Zero 和 RPi Zero W 都具有 mini-HDMI 输出。 因此,对于他们来说,我们需要一个 mini-HDMI 至 HDMI 转换器。 下图分别显示了 HDMI,mini-HDMI 和 micro-HDMI 端口:

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-tI74jrSV-1681873103263)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_17.jpg)]

図 1.17 – HDMI、ミニ HDMI、マイクロ HDMI ポート

また、ミニおよびマイクロ HDMI の端を RPi ボードに接続し、HDMI をモニターに接続する必要があります。VGA モニターを使用する場合は、ボード モデルに応じて、HDMI / mini-HDMI / micro-HDMI から VGA へのコンバーターが必要になります。

これは HDMI - VGA コンバーターの写真です。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-TUVEDrM0-1681873103263) (https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_18.jpg)]

図 1.18 – HDMI から VGA へのコンバータ

これは、mini-HDMI - VGA コンバーターの写真です。

図 19: Mini-HDMI - VGA コンバータ

図 1.19 – Mini-HDMI - VGA コンバータ

これはマイクロ HDMI - VGA コンバーターの写真です。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-j0p0zvvs-1681873103264)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_20.jpg)]

図 1.20 – マイクロ HDMI から VGA へのコンバータ

Windows コンピューターと有線または無線のインターネット接続が必要です。

最後に、以下に示すように、SD カード リーダーが必要です。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-TBvICJKG-1681873103264)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_21.jpg)]

図 1.21 – SD カード リーダー

多くのラップトップにはこの機能 (SD カード リーダー) が組み込まれています。その場合、内蔵リーダーを使用できるため、別途リーダーを用意する必要はありません。

この章が終わるまでに、さらに多くのハードウェア コンポーネントが必要になります。必要に応じてご相談させていただきます。今のところは続行できます。

必要なソフトウェアをダウンロードする

まず、すべての無料ソフトウェアをダウンロードする必要があります。以下の手順に従って、必要なソフトウェアをすべてダウンロードしてください。

  1. Raspbian OSの最新のイメージファイルが必要です。このファイルは、 Raspberry Pi Foundation Web サイトのダウンロード ページからダウンロードできます。次のスクリーンショットは、ダウンロードできるさまざまなオプションを示しています。

    [外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-UOEP0j4y-1681873103268)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_22.jpg)]

    図 1.22 – Raspbian イメージのダウンロード ページ

  2. URL にアクセスするまでにページが更新されている可能性がありますが、ダウンロード オプションは通常同じままです。最初のオプションは、デスクトップと推奨ソフトウェアを備えたRaspbian Busterで、初心者に最適です。2 番目のオプションは、デスクトップを備えたRaspbian Busterです。3 番目のオプションはRaspbian Buster Liteで、最小限のソフトウェアが付属しています。すべてのダウンロード オプションの中で最小のサイズです。

  3. ZIP ファイルを直接ダウンロードすることも、イメージの torrent ファイルをダウンロードすることもできます。torrentファイルをダウンロードすることをお勧めします。Raspbian Buster デスクトップと推奨ソフトウェアの torrent ファイルをダウンロードしたらこのページからtorrent ファイルをダウンロードできます。無料のクラシック バージョンをダウンロードして PC にインストールします。次に、BitTorrent を使用して torrent ファイルを開いてダウンロードを開始します。以下は、完了したダウンロードのスクリーンショットです。

    [外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-ux9TKWwH-1681873103269)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_23.jpg)]

    図 1.23 – BitTorrent アプリケーションウィンドウ

  4. 画面の下部にダウンロード場所が表示されます。さらに、以下に示すように、完了したインストールを右クリックし、「含まれているフォルダーを開く」オプションをクリックすることもできます。

    [外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-NacmHJuF-1681873103269)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_24.jpg)]

    图 1.24 –打开下载图像的位置

    这将打开包含 Raspbian OS 映像的 ZIP 文件的文件夹。

  5. 我们需要用于解压缩文件的软件。 7-Zip 是免费的开源软件。 我们可以下载适当的可安装文件(32 位 x86 或 64 位 x64)并进行安装。 安装完成后,使用该软件打开 ZIP 文件。 以下是 7-Zip 的屏幕截图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lW83VdWv-1681873103269)(https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/raspi-cv-prog/img/B16208_01_25.jpg)]

    图 1.25 – 7-Zip 应用窗口

    双击 ZIP 文件,然后在菜单中单击提取按钮。 这将提取文件。 提取的文件具有img扩展名。

  6. 我们需要软件将此图像写入 microSD 卡,Win32DiskImager 是完成此任务的理想软件。 从这个页面下载。 运行安装文件并安装它。

手动准备 microSD 卡

在 microSD 卡的上安装 OS 的最好方法是手动进行操作。 这使我们能够手动准备 SD 卡,以便我们可以更轻松地访问/boot/config.txt配置文件,在某些情况下,在启动 RPi 之前必须对其进行修改。 我们将在后面详细讨论。 默认的 Raspbian 映像只有两个分区:引导系统。 我建议至少选择一个 16 GB 的 Class 10 microSD 卡。 然后,请按照下列步骤操作:

  1. 新しい microSD カードを開梱し、カード リーダーに挿入します。カード リーダーを Windows ラップトップまたはコンピュータに接続します。多くのラップトップやコンピューターには SD カード リーダーが付属しています。これを行うには、microSD カードを microSD - SD カード アダプターに挿入し、アダプターをコンピューターまたはラップトップの SD カード リーダーのスロットに差し込みます。

  2. 新しいドライブがWindows File Explorer左側のパネルに表示されます。ドライブを右クリックし、「フォーマット」を選択します。以下は「フォーマット」ウィンドウのスクリーンショットです。

    [外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-3wVsSS6b-1681873103270)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_26.jpg)]

    図 1.26 – microSD カードのフォーマット

  3. 「クイックフォーマット」チェックボックスが選択されていることを確認してください。次に、「開始」ボタンをクリックします。以下に示すような警告メッセージが表示されます。

    [外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-WEDI5RSr-1681873103270)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_27.jpg)]

    図 1.27 – 確認ダイアログ

  4. OKボタンをクリックするとフォーマットが完了します。

  5. フォーマットが完了したら、Raspbian OS イメージ ファイルを microSD カードに書き込む必要があります。Win32DiskImager次のスクリーンショットに示すように、Raspbian OS イメージ ファイルを開いて選択します。

    [外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-3AWL2JCd-1681873103270)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_28.jpg)]

    図 1.28 – Win32 Disk Imager アプリケーション ウィンドウ

  6. 次に、「書き込み」ボタンをクリックします。次の警告ボックスが表示されます。「OK」ボタンをクリックするだけです。

    [外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-dyaVm5C8-1681873103270)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_29.jpg)]

    図 1.29 – microSD カードへのイメージの書き込みを確認するダイアログ

  7. オペレーティング システムが SD カードに正常に書き込まれると、次のメッセージ ボックスが表示されます。

    [外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-kCFLkPBy-1681873103270)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_30.jpg)]

    図 1.30 – 確認メッセージボックス

    これは、イメージが microSD カードに正常に書き込まれたことを意味します。これで、これを使用して RPi を起動できるようになりました。

  8. この手順は、HDMI モニターの代わりに VGA モニターを使用している場合にのみ必要です。HDMI モニターを使用している読者は、この手順を無視しても問題ありません。microSD カードの BOOT パーティションには、Windows ファイル エクスプローラーを使用してアクセスできますファイルが入っていますconfig.txtファイルをダブルクリックして開きます。/boot/config.txtVGA モニタで正しく表示するには、ファイル内の設定を次のように編集する必要があります。

    a) は に変更#disable_overscan = 1されますdisable_overscan = 1

    b) は に変更#hdmi_force_hotplug = 1されますhdmi_force_hotplug = 1

    c) に変更さ#hdmi_group = 1れますhdmi_group = 2

    d) は に変更#hdmi_mode = 1されますhdmi_mode = 16

    e) は に変更#hdmi_drive = 2されますhdmi_drive = 2

    f) は に変更#config_hdmi_boost = 4されますconfig_hdmi_boost = 4

    g) ファイルを保存します。

コメント行( で始まる行#)は無効になります。これらの行のコメントを解除して有効にする必要があります。これは、これらのコメントの行の先頭を削除することで実行できます#

知らせ

Linux または macOS を使用している場合は、このページでこれらのオペレーティング システムの microSD カードに Raspbian OS をインストールする手順を参照してください。]。

初めてRaspberry Piを起動する

次の手順を使用して、microSD カード経由で Pi を初めて起動してみましょう。

  1. microSD カードを Pi の microSD カード スロットに挿入します。RPi 1 Model AおよびRPi 1 Model BにはSDカードスロットがありません。したがって、これらのマザーボード モデルの場合は、microSD から SD カードへのコンバータを使用する必要があります。
  2. Pi を HDMI モニターに接続します。前述したように、VGA モニターをお持ちの場合は、HDMI/ミニ HDMI/マイクロ HDMI - VGA コンバーターを使用して接続します。
  3. USBマウスとUSBキーボードを接続します。単一のキーボードとマウス パッドを使用することをお勧めします。RPi Zero および RPi Zero W の場合は、最初に USB OTG ケーブルに接続し、次に USB OTG ケーブルをボードに接続する必要があります。
  4. RPi ボードを適切な電源に接続します。モニターを電源に接続します。この時点で電源がオフになっていることを確認する必要があります。
  5. すべての接続を一度に確認してください。次に、モニターの電源をオンにします。最後にRPiの電源を入れます。

これで、RPi ボードが起動を開始します。ボード上の緑色の LED が点滅し始めます。おめでとう!RPi ボードが初めて起動されます。

知らせ

HDMI モニターに信号が表示されない場合は、RPi の電源を切り、microSDカード/boot/config.txtを に変更しますこの変更された設定で RPi を起動すると、HDMI モニターに信号が表示されます。#hdmi_force_hotplug = 1hdmi_force_hotplug = 1

RPi が起動すると、以下に示すように、Raspbian デスクトップとガイド付きセットアップ ウィンドウが表示されます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-upBEd22H-1681873103271)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_31.jpg)]

図 1.31 – Raspbian のようこそウィンドウ

「次へ」ボタンをクリックすると、次のウィンドウが表示されます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-zkMoJ3TW-1681873103271)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_32.jpg)]

図 1.32 – 国/地域を設定するウィンドウ

前のウィンドウで、言語を設定します。選択した国に基づいてタイムゾーンが自動的に選択されます。必要に応じて変更することもできます。「次へ」ボタンをクリックすると、次のウィンドウが表示されます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-scTeOMX8-1681873103271)(https://gitcode.net/apachecn/apachecn- cv-zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_33.jpg)]

図 1.33 – 新しいパスワードを設定するウィンドウ

デフォルトのユーザーに新しいパスワードを設定することを選択できますpi空白のままにすると、デフォルトのパスワードが保持されます。次のウィンドウが表示されます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-UWfh7jVs-1681873103271)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_34.jpg)]

図 1.34 – 設定画面のウィンドウ

デスクトップ ビューの端に黒い境界線がある場合は、このチェックボックスをオンにします。Raspbian OS は次回の起動時に修正します。「次へ」ボタンをクリックすると、次のウィンドウが表示されますが、これはボード モデルに Wi-Fi が搭載されている場合のみです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-04Ea5c4J-1681873103271)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_35.jpg)]

図 1.35 – Wi-Fi 接続

資格情報がわかっているネットワークを選択し、「次へ」ボタンをクリックします。次のウィンドウが表示されます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-5eN80CXC-1681873103272)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_36.jpg)]

図 1.36 – 自宅の Wi-Fi への接続

ここにWi-Fiパスワードを入力し、「次へ」ボタンをクリックします。次のウィンドウが表示されます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-myPj0tAk-1681873103272)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_37.jpg)]

図 1.37 – ソフトウェアの更新

我们可以在此处更新 Raspbian 操作系统和已安装的软件。 我们将在本章的后半部分学习如何手动进行操作。 单击跳过下一个按钮,将出现以下窗口:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m64BkRI5-1681873103272)(https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/raspi-cv-prog/img/B16208_01_38.jpg)]

图 1.38 –完成初始设置的确认

我们已经完成了大部分设置。 现在,在我们重新启动 RPi 之前,还有一些事情要做,因此请单击下一个按钮。

现在,在桌面的左上角,您应该看到一个 Raspberry 图标。 它是 Raspbian 的菜单,其功能类似于 Microsoft Windows 上的 Windows 徽标。 单击徽标,然后导航到首选项 | Raspberry Pi 配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-feZUcFJf-1681873103272)(https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/raspi-cv-prog/img/B16208_01_39.jpg)]

图 1.39 – Raspbian 菜单中的 Raspberry Pi 配置

这是 Raspberry Pi 配置工具。 它将打开一个窗口,如下所示,我们可以更改 Raspberry Pi 板的设置:

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-CM709H0K-1681873103272) (https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_40.jpg)]

図 1.40 – システムの構成

前のスクリーンショットは[システム]タブのものです。現時点では、ここで何も変更する必要はありません。インターフェイスのタブは次のとおりです

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-XHb3ybib-1681873103273)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_41.jpg)]

図 1.41 – 設定インターフェイス

カメラ、SSH、VNC を有効にします。パフォーマンスタグは次のとおりです

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-ePKTEx8w-1681873103273)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_42.jpg)]

図 1.42 – メモリとオーバークロックのオプション

このメニューには、オーバークロックと GPU メモリのオプションがあります。RPi 4B の場合、オーバークロックは無効になっています。次の章では、RPi 4B ボードをオーバークロックする方法を学びます。ローカリゼーションタグは次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-reWxiiKe-1681873103273)(https://gitcode.net/apachecn/apachecn- cv-zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_43.jpg)]

図 1.43 - 場所のオプション

お住まいの地域に応じて、これらの設定を変更することをお勧めします。

これらすべての設定を選択に従って変更したら、Raspbianメニューの[閉じる]ボタンをクリックしてRPi ボードを再起動できます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-2YZMpgNK-1681873103273)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_44.jpg)]

図 1.44 – Pi の再起動

ここには、RPi を再起動するオプションがあります。pi再起動後、デフォルト ユーザーの元のパスワードを保持することを選択すると、起動時に次の警告メッセージ ウィンドウが表示されます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-DJVbj3Ug-1681873103273)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_45.jpg)]

図 1.45 – デフォルトのパスワードが変更されていない場合の再起動後のメッセージ

デフォルトのパスワードを使用することを選択した限り、毎回の起動後にパスワードが表示され続けます。

さまざまな RPi ボード モデルをインターネットに接続します

イーサネット ケーブルを Pi ボードの RJ45 イーサネット ポートに直接接続できます。これにより、接続が自動的に検出され、インターネットに接続されます。

知らせ

Wi-Fi ルーター、マネージド スイッチ、またはインターネット ゲートウェイでDHCP (動的ホスト構成プロトコル)が有効になっていることを確認します。

PRi 1 A、PRi 1 A+、RPi Zero、RPi Zero W、および RPi 3 A+ にはイーサネット ポートがありません。ただし、RPi Zero W と RPi 3 A+ には Wi-Fi が内蔵されています。残りのモデルでは、USB Wi-Fi ドングルを使用できます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-hD4Y41ZK-1681873103274)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_46.jpg)]

図 1.46 – USB Wi-Fi アダプター

この Wi-Fi アダプターを USB ポートに差し込みます。十分な USB ポートがない場合は、電源付きの USB ハブを使用してください。Raspberry Pi Zero の場合は、前述したように追加の USB OTG ケーブルを使用する必要があります。

USB Wi-Fi アダプターを接続したら、電源をオンにする必要がありますlxterminalこれはコマンドラインツールです。Raspbian タスクバーと Raspbian メニューの下にAccessories小さな黒いアイコンがあります。クリックすると、次のウィンドウが表示されます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-oBuypEc2-1681873103274)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_47.jpg)]

図 1.47 – Raspberry Pi LXterminal ウィンドウ

ここで Linux コマンドを入力できます。入力後、Enterコマンド実行を押してください。Raspbian のネットワーク インターフェイスを手動で設定できるように、これをオンにしました。それは簡単です。ネットワーク関連の情報はすべて/etc/network/interfacesファイルに保存されます。USB Wi-Fi ドングルを接続した後に Wi-Fi に接続するには、ファイルにいくつかのエントリを追加する必要があります。まず、次のコマンドを実行して元のファイルをバックアップします。

mv /etc/network/interfaces /etc/network/interfaces.bkp

次に、次のコマンドを実行して、インターフェイスファイルを最初から作成できます。

sudo nano /etc/network/interfaces

前のコマンドは、nanoというプレーン テキスト エディターを使用してネットワーク インターフェイスのファイルを開きます。これはシンプルな WYSIWYG エディターです。ここに次の行を入力します。

source-directory /etc/network/interfaces.d
auto lo
iface lo inet loopback
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-ssid "AshwinIon"
wpa-psk "internet1"

行を入力したら、Ctrl+を押しXてから を押しますY上記の設定では、SSID を自分のものに置き換えAshwinIon、パスワードに置き換えますinternet1次に、コマンド プロンプトで次のコマンドを実行します。

sudo service networking restart

これにより、ネットワーク サービスが再起動され、Wi-Fi に接続されます。いずれの場合(イーサネットまたは Wi-Fi)でも、RPi には一意の IP アドレスが割り当てられます。lxterminalでコマンドを実行すると、ifconfigそれを見つけることができます。コマンドの出力には、inet以下の。

RPi の IP アドレスを知るもう 1 つの方法は、RPi ボードが接続されているルーターまたは管理対象スイッチのアクティブ クライアント テーブルを確認することです。これはルーターのアクティブなクライアント テーブルのスクリーンショットです。RPi のエントリが確認できます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-lIHKVMQL-1681873103274)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_01_48.jpg)]

図 1.48 – ホーム Wi-Fi ルーターのアクティブ クライアント テーブル

RPi を更新する

Advanced Package Tool ( APT ) は、Debian、Ubuntu、Raspbian、およびそれらの派生製品のパッケージ管理ツールです。APT はソフトウェアのインストール、アップグレード、削除に使用されます。これを使用して RPi ボード上のオペレーティング システムとソフトウェアを更新する方法を学びます。

次のコマンドを実行します。

sudo apt-get update

このコマンドは、オンライン ソフトウェア ソース リポジトリからのパッケージのリストを同期します。すべてのパッケージのインデックスが更新されます。これにより、アプリのすべてのリポジトリがすべての最新アップデートのリストで更新されます。このコマンドは、アップグレードコマンドを実行する前に実行する必要があります

次に、次のコマンドを実行します。

sudo apt-get dist-upgrade –fix-missing -y

これにより、すべてのパッケージがダウンロードされ、インストールされます。また、古いパッケージも削除されます。インターネットの速度によっては、時間がかかります。最後に、次のコマンドを実行してファームウェアを更新します。

sudo rpi-update

これによりファームウェアが更新されます。その後、RPi ボードはあらゆる点で最新の状態に保たれます。

最後に、次のコマンドを実行して RPi をシャットダウンできます。

sudo shutdown -h now

次に、次のコマンドで再起動します。

sudo reboot

これによりファームウェアが更新されます。その後、RPi ボードはあらゆる点で最新の状態に保たれます。

要約する

この章では、コンピューター ビジョン、OpenCV、SBC、Raspberry Pi などの重要な用語を学びました。Raspberry Pi 上で Raspbian オペレーティング システムをセットアップする方法と、インターネットにアクセスできるように Pi を構成する方法を学びました。Pi を更新する方法も学びました。

この章を完了すると、Raspberry Pi で Raspbian OS のセットアップを続けることができます。さらに、Wi-Fi またはイーサネットを使用して RPi ボードをインターネットに接続できます。これにより、今後のコンピューター ビジョンの冒険に備えることができます。

次の章では、RPi にリモートでアクセスする方法、RPi をオーバークロックする方法、RPi に Python 3 用の OpenCV 4 をインストールする方法を学習します。

2. コンピュータビジョン用に Raspberry Pi を準備する

前の章では、シングルボード コンピューター、コンピューター ビジョン、OpenCV の基礎を学びました。Raspberry Pi ( RPi ) 4B と RPi Zero Wの詳細なスペックがわかりました。また、すべての RPi マザーボード モデルで Raspbian OS をセットアップする方法についても詳しく説明しました。

この章では、RPi ボードをコンピューター ビジョン用に準備する方法を学びます。前の章の終わりから、コンピューター ビジョン用の OpenCV ライブラリと、デスクトップおよびコマンド プロンプトへのリモート アクセスに必要なその他のソフトウェアのインストールを開始します。RPi と Windows PC の間でファイルを転送する方法を学びます。また、RPi をオーバークロックし、ヒートシンクを取り付けてプロセッサーの温度を下げることで、RPi のコンピューティング能力を活用する方法も学びます。

この章で取り上げるトピックは次のとおりです。

  • SSH を使用して RPi にリモートログインします
  • リモートデスクトップアクセス
  • RPiボードにOpenCVをインストールする
  • ラジエーターとRPi 4Bのオーバークロック

SSH を使用して RPi にリモートログインします

Windows 上のさまざまなソフトウェアを使用して、RPi ボードのコマンド プロンプトにリモート アクセスできます。関係のないすべての Linux コマンドを Windows からリモートで実行できます。第 1 章「Computer Vision と Raspberry Pi の概要」で、Raspberry Pi 構成ツールを使用して SSH を有効にする方法について説明したことを思い出してください。SSH経由でのリモートログインが可能になります。

開始するには、次の手順に従います。

  1. まず、利用可能な SSH ソフトウェアを無料でインストールする必要があります。最も人気のあるのは PUTTY です私は、SFTP に付属する Bitvise SSH クライアントと呼ばれる別の一般的な SSH クライアントを使用することを好みます。Windows 用のインストールファイルを以下からダウンロードしてインストールできます。その後、Bitvis SSH クライアントを開きます。次のウィンドウが表示されます。

    [外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-CNTYJ12S-1681873103274)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_02_01.jpg)]

    図 2.1 – ビット単位の接続ウィンドウ

    ホスト名、ユーザー名、パスワードを入力します。ホスト名は RPi ボードの IPv4 アドレスにほかなりません。このアドレスの確認方法は第 1 章「コンピューター ビジョンと Raspberry Pi」で学びました。

  2. 必要な情報を入力後、「ログイン」ボタンをクリックしてください。これにより RSA キー交換が開始され、次のメッセージ ボックスが表示されます。

    [外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-p6Cu9CA5-1681873103275)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_02_02.jpg)]

    図 2.2 – 最初の接続のメッセージ ウィンドウ

  3. 「同意して保存」ボタンをクリックします。これにより、交換された RSA キーが保存されます。同じ Windows コンピューターを使用して Raspberry Pi に再度接続しようとすると、このメッセージ ボックスは表示されないことに注意してください。その後、2 つの別々のウィンドウが表示されます。1 つ目は Raspberry Pi コマンド プロンプトです。同様にlxterminal、ここから Linux コマンドを実行することもできます。

    [外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-dcxrRDr9-1681873103275)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_02_03.jpg)]

    図 2.3 – ビットごとの SSH ウィンドウ

  4. ここに表示されるテキストのフォントとサイズは、タイトル バーを右クリックしてプロパティを変更することで変更できます。ファイル転送ウィンドウは次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-z3TV5GOg-1681873103275)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_02_04.jpg)]

図 2.4 – ビットごとの FTP ファイル転送ウィンドウ

左側のペインには Windows デスクトップがあり、右側のペインにはユーザーのホーム ディレクトリがあり/home/piますpiWindows と RPi の間のこれらのペイン間でファイルをドラッグ アンド ドロップするだけです。

知らせ

*sudo raspi-configコマンドを使用して、コマンド プロンプトから Raspberry Pi 構成ツールにアクセスできます。これはツールのコマンド ライン バージョンです。

これでRaspbian OSのコマンドプロンプトにリモート接続してファイルを転送できるようになります。次に、Raspbian OS デスクトップにリモートでアクセスする方法を学びます。

リモートデスクトップアクセス

Bitvise SSH クライアントは、ファイル転送や RPi のコマンド プロンプト ターミナルへのアクセスに最適です。ただし、RPi のデスクトップにリモート アクセスするには、別のソフトウェアを使用する必要があります。私たちが取れるアプローチは 2 つあります。1 つ目は VNC (これを有効にする方法については、第 1 章「Computer Vision と Raspberry Pi」Raspberry Pi 構成ツールで説明します) で、もう 1 つは Windows の組み込みリモート デスクトップ接続ツールを使用します以下に示すように、Windows の検索バーで見つけることができます。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gxoQgoUo-1681873103275)(https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/raspi-cv-prog/img/B16208_02_05.jpg)]

图 2.5 – Windows 搜索栏中的“远程桌面连接”选项

但是在使用它之前,我们需要在 RPi 上安装xrdp。 安装非常简单。 我们只需要在 RPi 的lxterminal上运行以下命令:

sudo apt-get install xrdp -y

信息

您可能想在这个页面上阅读有关xrdp的更多信息。

在 RPi 上安装xrdp后,您需要执行以下步骤:

  1. 在 Windows PC 上打开“远程桌面连接”应用:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9MZIPD6o-1681873103276)(https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/raspi-cv-prog/img/B16208_02_06.jpg)]

    图 2.6 –远程桌面连接

  2. 在标有“计算机”和“用户名”的文本框中输入 IP 地址和pi。 您可能要选中“允许我保存凭据”复选框并保存连接设置。 单击“连接”按钮后,将出现以下窗口:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FEK3N1jf-1681873103276)(https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/raspi-cv-prog/img/B16208_02_07.jpg)]

    図 2.7 – Raspbian OS のリモート デスクトップ接続資格情報

  3. この接続のパスワードを保存する場合は、パスワードを入力し、チェックボックスをオンにします。OKボタンをクリックすると、しばらくすると RPi リモート デスクトップ ウィンドウが表示されます。LAN 上のトラフィックが少ない場合、リモート デスクトップはスムーズに動作します。以下はリモート デスクトップ ウィンドウのスクリーンショットです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-vpHVhkGe-1681873103276)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_02_08.jpg)]

図 2.8 – Raspbian OS リモート デスクトップ

ここからすべての GUI 関連タスクを実行できます。リモート デスクトップを使用する場合、RPi ボード用に別のディスプレイが必要ないことを示します。

RPiボードにOpenCVをインストールする

RPi に OpenCV をインストールするには、次の手順に従ってください。

  1. まず、いくつかの依存関係をインストールする必要があります。次のコマンドを実行して、これらの依存関係をすべてインストールします。

    sudo apt-get install -y libhdf5-dev libhdf5-serial-dev libatlas-base-dev libjasper-dev libqtgui4 libqt4-test
    
  2. インストールが成功したら、RPi に OpenCV をインストールできます。

    pip3 install opencv-python==4.0.1.24
    
  3. OpenCV が正常にインストールされたら、次のコマンドを実行して検証できます。

    python3 -c "import cv2; print(cv2.__version__)"
    

    次のような出力が得られるはずです。

    4.0.1
    

これは、インストールが完了し、Python 3 プログラムに OpenCV をインポートできることを意味します。

次に、RPi 4B をオーバークロックし、それにクーラーを取り付ける方法を学びます。

ラジエーターとオーバークロック RPi 4B

オーバークロックとは、プロセッサを意図した速度よりも高速で実行することを意味します。プロセッサーをオーバークロックすると、プロセッサーが発熱し、より多くの熱が放散される傾向があります。Raspberry Pi マザーボード モデルにはヒートシンクが内蔵されていません。パッシブ ラジエーターは、Amazon などの多くのオンライン ストアから購入できます。ファン付きラジエーターの例を次に示します。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-4dBt9XAw-1681873103276)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_02_09.jpg)]

図 2.9 – RPi の小型ヒートシンク

ヒートシンク ファンは、5V または 3.3V 電源に接続することで電力を供給できます。ファンの速度は電圧に依存し、RPi 電源ピンに接続できます。次の章では、RPi の GPIO と電源ピンを詳しく見ていきます。私が見つけた最高かつ最も効果的なクーラーは、RPi 4B のICE Tower ファンです。

ICE Tower がインストールされた私自身の Pi は次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-WP1kWbMc-1681873103276)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_02_10.jpg)]

図 2.10 – Raspberry Pi にインストールされた ICE Tower

簡単な取り付け手順が記載された小冊子が付属しています。

知らせ:

オーバークロックできるようにするには、RPi のプロセッサにアクティブ冷却ヒートシンクとファンを取り付ける必要があります。適切な冷却を行わずにプロセッサをオーバークロックすると、プロセッサが損傷する可能性があります。

RPi ボードの CPU、GPU、RAM をオーバークロックできます。このセクションでは、RPi 4B ボードをオーバークロックする方法について説明します。

次のコマンドを使用してファームウェアを更新してください。

sudo rpi-update

Pi をオーバークロックする前に、ファームウェアを更新する必要があります。これが完了したら、次のコマンドを実行します。

sudo nano /boot/config.txt

これはnanoテキストエディタで開きます/boot/config.txtファイルの最後に次の行を追加します。

over_voltage=6
arm_freq=2147 

オーバークロックには追加の電力が必要となるため、最初の行では過電圧を設定します。次の行では、CPU のデフォルトのクロック周波数をオーバーライドします。変更を保存し、RPi を再起動します。

多くの場合、RPi はバックアップの開始に失敗することがあります。この場合、/boot/config.txt(Windows PC を使用して) オーバークロックの設定をそれぞれover_voltage = 2とに変更するとよいでしょうarm_freq = 1750

これらの設定でも RPi を起動できない場合は、両方の行をコメントアウトすると RPi が起動します。オーバークロックはすべてのプロセッサーで安定して動作するわけではありません。

これらの余分なメガヘルツはすべて、RPi ボード上で計算量の多いプロセスを実行するときに現れます。次のコマンドを使用して、クロックをリアルタイムで監視できます。

watch -n1 vcgencmd measure_clock arm

RPi で重いプログラムを起動すると、出力は 20 億 (2 GHz) を超えます。

RPi ボードをオーバークロックすることで得られるこの追加の処理能力はすべて、コンピューター ビジョンの実験に役立ちます。

要約する

この章では、RPi にリモートでログインする方法と、RDP を使用して RPi デスクトップにリモートでアクセスする方法を学習しました。また、OpenCV のインストール方法とそれを検証する方法についても学びました。さらに、RPi ボードをオーバークロックする方法も学びました。

この本では、この章で学んだすべてのスキルを使用して、コンピュータ ビジョン用のプログラムを作成しながら、Raspbian OS コマンド プロンプトとデスクトップにリモート アクセスします。また、ファイル転送や、ほとんどのプログラムで OpenCV ライブラリも使用します。

次の章では、Python、NumPy、Matplotlib、RPi GPIO ライブラリの基本を学びます。SciPy エコシステムについても学びます。

3. Python プログラミングの概要

前の章では、Raspberry Pi (RPi) ボードのコマンド プロンプトとデスクトップにリモート アクセスする方法を学びました。Python 3 用の OpenCV もインストールしました。最後に、RPi をオーバークロックする方法を学び、RPi のさまざまなヒートシンクをチェックしました。

前の章の続きから、この章では RPi での Python 3 プログラミングを見ていきます。Scientific Python ( SciPy ) エコシステムとその中のすべてのライブラリについて簡単に紹介します。次に、NumPy N 次元配列( ) を使用したndarray数値計算の基本プログラムを作成します。また、Matplotlib を使用してデータを視覚化する方法も学習します。最後に、 RPi の Python汎用入出力( GPIO ) ライブラリを使用して、RPiのハードウェアの側面を調べます。

つまり、次のトピックについて説明します。

  • Python 3 について学ぶ
  • SciPy エコシステム
  • NumPy と Matplotlib を使用したプログラミング
  • RPi GPIO プログラミング

スキル要件

この章のコード ファイルはGitHubにあります

このページの「動作中のコード」を確認するには、以下のビデオをご覧ください。

Python 3 について学ぶ

Python は、高レベルのインタープリタ型の汎用プログラミング言語です。グイド ヴァン ロッサムによって個人的な趣味のプロジェクトとして作成されましたが、それ以来、今日の形に成長しました。以下は、Python プログラミング言語の開発における主要なマイルストーンのタイムラインです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-NnFfSnC4-1681873103276)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_24.jpg)]

図 3.1 – Python 開発マイルストーンのタイムライン

Guido van Rossum は、Python プロジェクトの生涯を通じて慈悲深い独裁者の称号を獲得しました。彼は 2018 年 7 月に辞任し、それ以来Python 運営委員会のメンバーを務めています。

Python について詳しくは、ホームページwww.python.orgをご覧ください。

Python プログラミング言語には、Python 2 と Python3 という 2 つの主要なバージョンがあります。それらのほとんどは互いに互換性がありません。前のタイムラインで示したように、Python 2 は 2019 年 12 月 31 日に廃止されました。これは、Python 2 が開発されなくなったことを意味します。公式サポートももう存在しません。活発に開発中であり、引き続きサポートされている Python の唯一のバージョンは Python3 です。多くの組織によって作成されているコードの多く (実際、数十億行のコード) は依然として Python 2 です。したがって、Python 2 から Python 3 への移植には多大な労力が必要です。

RPi および Raspberry Pi OS 上の Python

ダウンロードした Raspberry Pi OS イメージには Python がプリインストールされています。Raspberry Pi OS イメージには、Python のバージョン (Python 2 および Python 3) が付属しています。Python 3 について詳しく説明し、Python 3 を使用してすべてのプログラムを作成します。

lxterminalRPi を開くか Telnet で接続し、次のコマンドを実行します。

python -V

これにより、次の出力が生成されます。

Python 2.7.16

-Vオプションは Python インタープリターのバージョンを返します。したがって、pythonこのコマンドは Python 2 インタープリターを指します。ただし、Python3 が必要です。したがって、コマンド プロンプトで次のコマンドを実行します。

Python3 -V

これにより、次の出力が生成されます。

Python 3.7.3

これは Python 3 インタープリタであり、本書のすべてのプログラミング演習で使用されます。ディスク (この場合は microSD カード) 上のインタープリタの場所を見つけるには、次のコマンドを実行します。

which python3

これにより、次の出力が生成されます。

/usr/bin/python3

ここに、Python 3 インタープリターの実行可能ファイルがあります。

Raspberry Pi OS 上の Python 3 IDE

Python 3 でプログラミングを開始する前に、 Python でプログラムを作成するためにどの統合開発環境( IDE ) が利用できるかを学びます。これまでのところ、Raspberry Pi OS には 2 つの IDE が付属しています。これには、次のようにRaspbian メニューのプログラミングオプションからアクセスできます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-xQ8KrySM-1681873103277)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_01.jpg)]

図 3.2 – Raspbian メニューの Thonny and Geany Python IDE

最初のオプションはGeany IDE で、Python 2 や Python 3 などの多くのプログラミング言語やマークアップ言語で動作します。2 番目のオプションはThonny Python IDEで、Python 3 と MicroPython のバリアントをサポートします。

私は個人的に、Python Foundation によって開発および保守されている統合開発学習環境( IDLE ) を使用することを好みます。詳細については、このページをご覧ください。Raspberry Pi OS の古いバージョンには IDLE が付属していました。ただし、最新バージョンの Raspberry Pi OS には存在しません。代わりに、Geany と Thonny がいます。ただし、次のコマンドを使用して IDLE をダウンロードできます。

sudo apt-get install idle3 -y

インストールが完了すると、次のスクリーンショットに示すように、Raspbian メニューの[プログラミング]メニュー オプションにインストールが表示されます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-mB6p8IsR-1681873103277) (https://gitcode.net/apachecn/apachecn- cv-zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_02.jpg)]

図 3.3 – Python 3 IDLE オプション

クリックして開きます。あるいは、次のコマンドを使用してコマンド プロンプトから起動することもできます。

idle

コマンドが GUI を呼び出すときに RPi のコマンド プロンプト (PuTTY や Bitvise などの SSH クライアントを使用) にリモート接続している場合、このコマンドは機能せず、エラーがスローされることに注意してください。ビジュアル モニターが RPi に直接接続されている場合、または RPi デスクトップにリモートでアクセスしている場合に機能します。これにより、以下に示すように新しいウィンドウが起動されます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-bqtjQAqI-1681873103277)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_03.jpg)]

図 3.4 – IDLE での Python 3 対話モード

これは、Python 3 インタープリター プロンプトまたは Python 3 シェルです。この概念については、この章で後ほど詳しく説明します。

次に、上部メニューの[ファイル] | [新しいファイル]に移動します。これにより、以下に示すように、新しいコード エディター ウィンドウが開きます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-9PQXN27i-1681873103277)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_04.jpg)]

図 3.5 – 新しい空の Python プログラム

この場合、インタープリタ ウィンドウも開いたままになります。閉じるか最小化することができます。フォント サイズのせいで IDLE のインタープリタまたはコード エディタでテキストを読むのが難しい場合は、メニューから [オプション] | [IDLE の設定]に移動して、テキストのフォントとサイズを設定できます。設定ウィンドウは次のようになります。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-XlTs4UMl-1681873103277)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_05.jpg)]

図 3.6 – IDLE 構成

カスタムHelloWorld プログラムを作成しましょう。ウィンドウに次のテキストを入力します。

print('Hello World!')

次に、メニューから「モジュールの実行」をクリックします。保存するように求められます。OKボタンをクリックすると、保存ダイアログボックスが表示されます。私は、本のコードを章ごとの目次に置き、章ごとにサブディレクトリを作成することを好みます。piユーザーのホーム ディレクトリで次のコマンドを実行して、ディレクトリ構造を作成できます。

mkdir book
mkdir book/dataset
mkdir book/chapter01

このように章ごとに個別の目次を作成できます。さらに、データを保存するには別のデータセットディレクトリが必要です。指定したディレクトリ構造を作成した後、次の一連のコマンドを実行します。

cd book
tree

tree次のコマンドの出力でディレクトリ構造を確認できます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-OeTIrlMl-1681873103278)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_06.jpg)]

図 3.7 – 書籍プログラムの保存に使用されるディレクトリ構造

IDLE の保存ダイアログまたは Raspberry Pi OS のファイル マネージャーアプリケーションを使用して、同じディレクトリ構造を作成できます。

現在の章に対応するディレクトリを作成した後、ファイルを として保存しますprog00.pyファイル名を入力するだけで、IDLE が自動的に.pyファイルに拡張子を割り当てます。ファイルは Python 3 インタープリターによって実行され、出力は次のようにインタープリター シェルに表示されます。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PeREdZw6-1681873103278)(https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/raspi-cv-prog/img/B16208_03_07.jpg)]

图 3.8 –在 IDLE 中执行 Python 3 程序

我们也可以使用nano编辑器编写相同的代码。 唯一的区别是,保存时我们还需要提供扩展名。 我们可以导航到具有prog00.py文件的目录,然后运行以下命令将该文件提供给 Python 3 解释器:

python3 prog00.py

Python 3 解释器将执行程序并打印输出,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kRlsfOHQ-1681873103278)(https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/raspi-cv-prog/img/B16208_03_08.jpg)]

图 3.9 –在 LXTerminal 中执行 Python 3 程序

以交互模式使用 Python 3

我们已经看到如何使用 IDLE 和 Nano 编辑器编写 Python 3 程序。 我们还看到了如何使用 IDLE 和 Raspberry Pi OS 的命令提示符启动程序。 以这种方式运行 Python 3 程序称为脚本模式。

別のモード、インタラクティブ モードがあります。対話型モードでは、コマンド ライン インタープリターとして機能する Python インタープリターを起動します。ステートメントを入力して実行すると、インタプリタから即座にフィードバックが得られます。インタラクティブ モードは 2 つの方法で開始できます。最初の方法はすでに見ました。IDLE を開始すると、インタープリターが開き、これを使用して Python 3 ステートメントを実行できます。python3もう 1 つの方法は、コマンド プロンプトでコマンドを実行することです。これにより、次のようにコマンド プロンプトで Python 3 インタープリターが起動されます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが組み込まれている可能性があります。画像を保存して直接アップロードすることをお勧めします (img-Gjtnb3eg-1681873103278)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_09.jpg)]

図 3.10 – コマンド プロンプトでの対話モードの Python 3

プロンプトで次のステートメントを入力します。

>>> print('Hello World!')

次に、 を押しますEnterが実行され、出力が次の行に表示されます。このようにして、単一行のステートメントやこのような小さなコード スニペットを実行できます。この章では、対話モードを広範囲に活用します。次の章からは、スクリプト モードを使用します。つまり、プログラムをファイルに保存し、コマンド プロンプトまたは IDLE から起動します。

Python 3 プログラミングの基礎

Python 3 プログラミングの基本を学ぶことから始めましょう。Python 3 の対話型プロンプトを開きます。次のステートメントを入力します。

>>> pi = 3.14
>>> print(pi)

piこれにより、変数の値が表示されます。次のステートメントを実行します。

>>> print(type(3.14))

次の出力が表示されます。

<class 'float'>

ここで変数のデータ型を宣言していないことに気づいたかもしれません。これは、Python が動的に型指定されるプログラミング言語であるためです変数はクラス型であるとも言います。これは、これがオブジェクトであり、Python のすべての変数およびその他の構成要素に適用されることを意味します。Python ではすべてがオブジェクトです。これにより、Python は真のオブジェクト指向プログラミング言語になります。ほとんどすべてのものにプロパティとメソッドがあります。

コマンド プロンプトを終了するには、Ctrl+を押すDか、exit()ステートメントを実行します。

独自のクラスとそのクラスのオブジェクトを作成しましょう。ファイルを保存して という名前を付けprog01.py、次のコードを追加します。

class Person:
    def __init__(self, name='', age=0):
        self.name = name
        self.age = age
    def show(self):
        print(self.name)
        print(self.age)

前のコードでは、Person.__init__()クラスを初期化関数として定義しました。Personこの関数は、クラスのオブジェクトが作成されるたびに自動的に呼び出されます。selfパラメーターはクラスの現在のインスタンスへの参照であり、クラス定義内のクラスに属する変数にアクセスするために使用されます。

さらにコードを追加してみましょうprog01.py以下に示すようにクラス オブジェクトを作成します。

p1 = Person('Ashwin', 25)
p1.show()

p1クラスを作成し、show()関数呼び出しを使用してオブジェクトのプロパティを表示しました。ここでは、クラスオブジェクトの作成中にクラスのメンバー変数に値を代入しています。

オブジェクトを作成してメンバー変数に値を割り当てる別の方法を見てみましょう。次のコードをファイルに追加します。

p2 = Person()
p2.name = 'Jane'
p2.age = 20
print(p2.name)
print(p2.age)

前のコードでは、オブジェクトを作成し、デフォルトのパラメーターを使用して初期化関数を呼び出しています。次に、これらの値をクラス変数に割り当て、クラス オブジェクトを使用して直接アクセスします。プログラムを実行して出力を確認します。

次に、Python 3 インタープリターを開き、次のステートメントを実行します。

>>> import sys
>>> print(sys.platform)

これにより、現在のオペレーティング システム (Linux) の名前が返されます。最初のステートメントはsys、Python 標準ライブラリである をインポートします。Python インタープリターが付属しています。これは、Python インタープリターには多数の便利なライブラリが付属していることを意味します。sys.platform現在のオペレーティング システム名の文字列を返します。

別の例を試してみましょう。前の章では、OpenCV ライブラリをインストールしました。もう一度インポートしてみましょう。Raspberry Pi OS コマンド プロンプトから直接テストしました。同じ操作を対話モードで実行してみましょう。

>>> import cv2
>>> print(cv2.__version__)

最初のステートメントは、OpenCV ライブラリを現在のセッションにインポートします。2 番目のステートメントは、インストールされている OpenCV ライブラリのバージョン番号を含む文字列を返します。

Python 3 プログラミングの基本には多くのトピックが含まれていますが、すべてをカバーするのは困難です。さらに、それを行うことについては、本書の範囲を超えます。ただし、この本では私たちが頻繁に研究するトピックを使用します。

次のセクションでは、SciPy エコシステム ライブラリについて説明します。

SciPy エコシステム

SciPy エコシステムは、科学、数学、工学関数をプログラミングするためのライブラリのコレクションです。コアコンポーネントとして次のライブラリがあります。

  • ナムピー
  • サイピー
  • マットプロットリブ
  • IPython
  • シンピー
  • パンダ

この本では、SymPy と pandas を除くすべてのライブラリを使用します。このセクションでは、NumPy ライブラリと Matplotlib ライブラリを紹介します。この本の後続の章では、他の 2 つのライブラリの有用な側面を学びます。

NumPy の基本

NumPy は、Python を使用した数値計算のための基本パッケージです。線形代数用の行列ライブラリです。NumPy は、ndarray汎用データの効率的な多次元コンテナとしても使用できます。任意のデータ型を定義して使用することもできます。NumPy は、Python プログラミング言語の拡張機能です。大規模な多次元配列と行列、およびこれらの配列の操作に使用できる高度な数学関数の大規模なライブラリのサポートが追加されます。この本では、NumPy 配列を使用して画像を表現し、複雑な数学的演算を実行します。NumPy には、これらすべての操作のための多くの組み込み関数が付属しています。したがって、基本的な配列操作について心配する必要はありません。コンピューター ビジョンの概念とコードに直接集中できます。すべての OpenCV 配列構造は、NumPy 配列との間で変換されます。したがって、NumPy で何を行う場合でも、いつでも OpenCV で NumPy を使用できます。

この本では、OpenCV で NumPy を広範囲に使用します。NumPy の真の機能を示す簡単なサンプル プログラムから始めましょう。

NumPy は Raspberry Pi OS にプリインストールされています。したがって、個別にインストールする必要はありません。

Python 3 インタープリターを開いて、次の例を試してください。

ndarrayの創生

ndarrayいくつかの作成例を見てみましょう。本書ではメソッドが頻繁に使用されていますarray()さまざまな型の配列を作成する方法はたくさんあります。本書全体を通じて、必要に応じてこれらの方法を検討します。以下のコマンドに従って作成してくださいndarray

>>> import numpy as np
>>> x=np.array([1,2,3])
>>> x
array([1, 2, 3])
>>> y=arange(10)
>>> y=np.arange(10)
>>> y
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

ndarray基本操作

linspace()次に関数について学習します。start_num3 つのパラメータ (とend_num)を取りますcountstart_numこれにより、から始まり、で終わる等距離の点を持つ配列が作成されますend_num次の例を試すことができます。

>>> y=np.arange(10)
>>> y
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a=np.array([1,3,6,9])
>>> a
array([1, 3, 6, 9])
>>> b=np.linspace(0,15,4)
>>> b
array([ 0.,  5., 10., 15.])
>>> c = a - b
>>> c
array([ 1., -2., -4., -6.])

配列内の各要素の二乗を計算するために使用できるコードは次のとおりです。

>>> a**2
array([ 1,  9, 36, 81], dtype=int32)

使用されるndarray線形代数

線形代数に関連するいくつかの例を見てみましょう。transpose()線形代数に関連する演算を実行するときに役立つ、 、inv()solve()およびdot()関数の使用方法を学習します。

>>> a = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a.transpose()
array([[1, 4, 7],
       [2, 5, 8],
       [3, 6, 9]])
>>> np.linalg.inv(a)
array([[-4.50359963e+15,  9.00719925e+15, -4.50359963e+15],
       [ 9.00719925e+15, -1.80143985e+16,  9.00719925e+15],
       [-4.50359963e+15,  9.00719925e+15, -4.50359963e+15]])
>>> b = np.array([3, 2, 1])
>>> np.linalg.solve(a, b)
array([-9.66666667, 15.33333333, -6\.        ])
>>> c = np.random.rand(3, 3)
>>> c
array([[0.91827923, 0.75063499, 0.40049332],
       [0.09520566, 0.16718726, 0.6577751 ],
       [0.95343917, 0.50972786, 0.65649385]])
>>> np.dot(a, c)
array([[ 3.96900804,  2.61419309,  3.68552507],
       [ 9.86978019,  6.89684344,  8.82981189],
       [15.77055234, 11.17949379, 13.9740987 ]])

知らせ:

NumPy については、ここで詳しく学ぶことができます。

マットプロットリブ

Matplotlib は、出版品質のグラフィックスを生成する Python 用のプロット ライブラリです。図面、3D ビジュアライゼーション、画像など、さまざまなタイプのビジュアライゼーションを作成できます。OpenCV などのコンピューター ビジョン ライブラリで使用する Matplotlib の基本を理解することが重要です。

Matplotlib は John D. Hunter によって開発され、オープンソース コミュニティによって継続的に開発されています。これは SciPy エコシステムの不可欠な部分です。SciPy エコシステム内の他のすべてのライブラリは、データ視覚化に Matplotlib を使用します。pyplotは、データを視覚化するための MATLAB のようなインターフェイスを提供する Matplotlib のモジュールです。

Matplotlib は Raspberry Pi OS にプリインストールされていないため、Matplotlib でプログラミングを開始する前に、まずインストールする必要があります。

pip3ツールを使用してインストールできます。OpenCV をインストールするときにこのツールを使用する方法を説明しました。さらに詳しく見てみましょう。PIP インストール パッケージまたはPython の PIP インストールpipを表しますこれは再帰的な頭字語です (最初の文字自体が頭字語の一部であることを意味します)。これは Python インタープリターに付属するコマンド ライン ツールで、ライブラリのインストールに使用されます。は、このツールの Python 3 バージョンです。まず、Python ライブラリのリポジトリである Python Package Index に接続します。次に、必要なライブラリをダウンロードしてインストールします。pip3

知らせ:

Python パッケージのインデックス作成の詳細については、このページこのページを参照してくださいpip

次のコマンドを実行して Matplotlib をインストールできます。

pip3 install matplotlib

Matplotlib は大規模なライブラリであり、必須のライブラリが多数あります。これらの前提条件ライブラリがすべてpip3自動的にインストールされ、その後 Matplotlib がインストールされます。インターネット接続の速度によっては、これを行うには時間がかかります。

インストールが完了したら、いくつかのサンプル プログラムを作成できます。Python 3 をスクリプト モードで使用し、IDLE または Nano エディターを使用してプログラムを作成します。新しいファイルを作成しprog02.py、次のコードをそれに追加します。

import matplotlib.pyplot as plt
import numpy as np
x = np.array([1, 2, 3, 4], dtype=np.uint8)
y = x**2 + 1
plt.plot(x, y)
plt.grid('on')
plt.show()

plt前述のコードの最初の行では、 Matplotlibにエイリアスされたモジュールをインポートしますpyplot次に、NumPy をインポートします。関数呼び出しを使用して、8 ビットの符号なし整数のリストを渡してarray()線形ndarray(データ型を参照) を作成します。uint8次に、 を定義しますy = x * 2 + 1plot()関数のグラフyx描画されます。関数呼び出し'on'または を渡すことで、グリッドをオンまたはオフにできます'off'関数呼び出しはイベント ループを開始し、現在アクティブなビジュアライゼーション オブジェクトをすべて検索してから、ビジュアライゼーション ウィンドウを開いてプロットまたはその他のビジュアライゼーションを表示します。出力は次のとおりです。grid()show()

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-gvziYr2l-1681873103279)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_10.jpg)]

図 3.11 – Matplotlib の視覚化

ご覧のとおり、これは視覚化を示しています。オンにするとグリッドが表示されます。下部には画像コントロールもあり、保存、ズーム、視覚化操作を実行できます。コマンド プロンプトで IDLE を使用するか、RPi 上でプログラムを直接実行するにはリモート デスクトップを使用する必要があることに注意してください。リモート SSH コマンド ラインからプログラムを実行してもエラーはスローされませんが、出力は表示されません。

prog02.pyコード ファイルを として保存しますprog03.pyplot()関数呼び出しの後とgrid()呼び出しの前に、次の行を追加します。

y = x + 1
plt.plot(x, y)
plt.title('Graph')
plt.xlabel('X-Axis')
plt.ylabel('Y-Axis')

コードの残りの部分はそのまま残ります。プログラムを保存します。ここでは、同じウィンドウ内で複数のプロットを視覚化する方法を示します。また、図にタイトルとラベルを追加しました。prog03.pyファイルを実行すると、出力は次のようになります。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-KyqLWrRm-1681873103279)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_11.jpg)]

図 3.12 – Matplotlib の複数のグラフ

plt.show()次の行を前に追加することで、ビジュアライゼーションをディスクに保存できます。

plt.savefig('test1.png', dpi=300, bbox_inches='tight')

これにより、視覚化ファイルが現在のディレクトリに保存され、 という名前が付けられますtest1.png

さらに興味深い部分に移りましょう。imshow()関数を使用して画像として視覚化できますndarray例を見てみましょう。という新しいファイルを作成しprog04.py、次のコードを追加します。

import matplotlib.pyplot as plt
import numpy as np
x = np.array([[0, 1, 2, 3, 4],
              [5, 6, 7, 8, 9]], dtype = np.uint8 )
plt.imshow(x)
plt.show()

前のコードでは、2D 配列 (サイズ5x2) を作成し、imshow()呼び出してそれを画像として視覚化します。出力は次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-AsjtMWie-1681873103279)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_12.jpg)]

図 3.13 – 数値を画像として視覚化する

由于这是一幅图像,因此我们确实不需要网格和轴刻度。 我们可以在plt.show()之前的代码中添加以下两行以将其关闭:

plt.axis('off')
plt.grid('off')

运行修改后的代码并观察输出。

图像已被渲染,我们称之为默认颜色图。 配色图是用于可视化的配色方案。 如果将plt.imshow(x)更改为plt.imshow(x, cmap='gray'),则输出如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DU0RZall-1681873103279)(https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/raspi-cv-prog/img/B16208_03_13.jpg)]

图 3.14 –灰度模式下的图像

有很多颜色图。 我们甚至可以创建自己的自定义颜色图; 但是,对于计算机视觉算法的演示,由于现有的颜色图已足够,因此不需要。 如果您对我们可以使用的可用颜色图名称感到好奇,可以按以下方法查找它们。 以交互方式打开 Python 3 解释器,然后将pyplot模块导入 Matplotlib:

>>> import matplotlib.pyplot as plt

plt.colormaps()列表具有所有颜色图的名称。 首先,我们检查有多少个颜色图,这很容易。 运行以下语句:

>>> print(len(plt.colormaps()))

这将打印彩色图。 最后,运行以下语句以查看所有可用颜色图的列表:

>>> print(plt.colormaps())

该列表相当长,我们将仅使用列表中的一些色图进行演示。 在prog04.py文件中,将plt.imshow(x)更改为plt.imshow(x, cmap='Accent'),以下内容将是输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0xRfrMYN-1681873103279)(https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/raspi-cv-prog/img/B16208_03_14.jpg)]

图 3.14 –带有重音色图的图像

Matplotlib に関するこの知識は、OpenCV とコンピューター ビジョンを始めるのに十分です。

これまで、ndarray1 次元および 2 次元のビジュアライゼーションの例を見てきました。次に、ランダム 3D を作成する方法ndarrayとそれを視覚化する方法を見てみましょう。次のコードを観察してください。

import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(3, 3, 3)
plt.imshow(x)
plt.axis('off')
plt.grid('off')
plt.show()

前のコードでは、np.random.rand()を使用してランダムな 3 次元配列を作成しました。各次元のサイズを渡すだけです。前の例では、3x3x3サイズ の 3 次元行列を作成していました。前のコードを実行して、出力を自分で確認してください。この本で使用するすべての画像は 2 次元または 3 次元で表されますndarrayデータ視覚化に関するこの知識は、画像の操作を開始すると非常に役立ちます。

Python 3 RPi GPIO プログラミング

オンボード GPIO ピンは、RPi および同様のシングルボード コンピューターの主なユニークなセールス ポイントの 1 つです。RPi ボードの一部の初期モデルには 26 ピンがありました。最新モデルには 40 個の GPIO ピンがあります。コマンド プロンプトでコマンドを実行すると、pinoutボード ピンの詳細を取得できます。RPi 4B ボードからのコマンド出力は次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-DoLSguug-1681873103280)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_15.jpg)]

図 3.16 – コマンドのピン配置のパート 1

左上には GPIO の 40 ピンが見えます。そこにはピン番号 1 がマークされています。その上の赤い丸はピン番号 2 です。ピン 1 に隣接するピンはピン 3 などとなります。出力の次の部分には、すべてのピンの番号が表示されます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-NHMwxvhk-1681873103280)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_16.jpg)]

図 3.17 – コマンドのピン配置のパート 2

前の出力からわかるように、電源ピン ( 3V35V、およびGND ) と、GPIOxxというラベルが付いたデジタル I/O ピンがあります。

GPIOを使用したLEDプログラミング

次に、GPIO ピンを出力ピンとして使用して LED をプログラムする方法を見ていきます。まずはLEDを点滅させる簡単な回路を用意します。

このためには、ジャンパー ケーブル、LED、220 オームの抵抗が必要です。以下のような回路を準備します。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-DWflvhno-1681873103280)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_17.jpg)]

図 3.18 – LED 抵抗回路

前の回路図で見たように、LED のアノードを物理ピン 8 に接続し、LED のカソードを220オームの抵抗を介して物理ピン 6 (グランド (GND) ピン) に接続しました

知らせ:

この本にはこのような美しい回路図がたくさん出てきます。これらの生成には、Fritzing というオープンソース ソフトウェアを使用しました。このページからフリッツィングのホームページにアクセスできます。Fritzing ファイルの拡張子は.fzz. これらのファイルは、この本のダウンロード可能なコード パッケージの一部です。

それでは、コードに入りましょう。このためには、GPIO ライブラリをインストールする必要があります。Raspberry Pi OS の最新バージョンには、GPIO ライブラリがインストールされています。ただし、存在しない場合は、次のコマンドを実行してインストールできます。

sudo apt-get install python3-rpi.gpio -y

次に、同じディレクトリに新しいファイルを作成しprog05.py、次のコードをそれに追加します。

import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)
while True:
    GPIO.output(8, GPIO.HIGH)
    sleep(1)
    GPIO.output(8, GPIO.LOW)
    sleep(1)

前述のコードでは、最初の 2 行で必要なライブラリをインポートします。setwarnings(False)すべての警告を無効にし、setmode()ピン アドレッシング モードを設定するために使用されます。GPIO.BOARDと の2 つのモードがありますGPIO.BCMモードではGPIO.BOARD、ピンを物理的な位置番号で参照します。モードではGPIO.BCM、ピン Broadcom SOC チャネル番号によってこれらのピンを参照します。私がGPIO.BOARDパターンを好む理由は、ピンの物理的な位置番号によって覚えやすいからです。setup()各 GPIO ピンを入力または出力として設定するために使用されます。

前のコードでは、最初のパラメータはピン番号、2 番目のパラメータはモード、3 番目のパラメータはピンの初期状態です。OR信号をoutput()ピンに送信するために使用されますライブラリからインポートされ、指定された秒数の遅延が発生します。前のプログラムを実行して LED を点滅させます。プログラムを終了するには、キーボードの を押しますHIGHLOWsleep()timeCtrl + C

同様に、同じ回路に次のコードを記述して LED を点滅させ、遭難( SOS ) メッセージを視覚的に伝えることができます。

import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)   # Ignore Warnings
GPIO.setmode(GPIO.BOARD)  # Use Physical Pin Numbering
GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)
def flash(led, duration):
    GPIO.output(led, GPIO.HIGH)
    sleep(duration)
    GPIO.output(led, GPIO.LOW)
    sleep(duration)
while True:
    flash(8, 0.2)
    flash(8, 0.2)
    flash(8, 0.2)
    sleep(0.3)
    flash(8, 0.5)
    flash(8, 0.5)
    flash(8, 0.5)

    flash(8, 0.2)
    flash(8, 0.2)
    flash(8, 0.2)
    sleep(1)

flash()前のプログラムでは、ピン番号とフラッシュ メモリの持続時間を受け入れるカスタム関数を定義しました。次に、指定された期間の間、提供されたピンが に設定されHIGH、さらに指定された期間の間、そのピンが に設定されますLOWしたがって、この端子に接続された LED は一定時間点灯と消灯を繰り返します。. . . - - - . . .SOS のモールス信号 (3 つの点、次の 3 つの点、その後の 3 つの点) のパターンで発生する場合、それは救難信号と呼ばれます。.(ドット) 文字では LED を 0.2 秒間点滅し、-(ダッシュ) 文字では 0.5 秒間点滅します。これらすべてを前の無限whileループに追加しました。Ctrl + Cプログラムを実行すると、キーボードを押して終了するまで、SOS メッセージの点滅が始まります。

GPIO と Python 3 プログラミングをさらに見てみましょう。以下のような回路を準備します。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-toBpcU9o-1681873103280)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_18.jpg)]

図 3.19 – 2 つの LED を備えた回路図

ここでわかるように、別の LED のアノードを 220 オームの抵抗を介してピン 10 に接続し、同じ LED のカソードを GND ピンに接続するだけです。2つのLEDを交互に点滅させます。これのコードは次のとおりです。

import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(10, GPIO.OUT, initial=GPIO.LOW)
while True:
    GPIO.output(8, GPIO.HIGH)
    GPIO.output(10, GPIO.LOW)
    sleep(1)

    GPIO.output(8, GPIO.LOW)
    GPIO.output(10, GPIO.HIGH)
    sleep(1)

これで、前の 2 つの例で説明した上記のコードのすべての機能を理解できるようになりました。このコードにより、実行後に LED が 1 秒間交互に点滅します。

同じ出力を生成する別の方法があります。次のプログラムを見てください。

import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(10, GPIO.OUT, initial=GPIO.LOW)
counter = 0
while True:
    if counter % 2 == 0:
        led1 = 8
        led2 = 10
    else:
        led1 = 10
        led2 = 8
    GPIO.output(led1, GPIO.HIGH)
    GPIO.output(led2, GPIO.LOW)
    sleep(1)
    counter = counter + 1

前のプログラムでは、Python 3 のステートメントを使用する場合の使用法を示すために、少し異なるロジックを使用しました。counterという変数があり、0開始するように設定されています。whileループ内で、counter値が偶数か奇数かを確認し、それに応じてどの LED をオンまたはオフにするかを設定します。ループの最後で をcounterインクリメントします1プログラムの出力は前の出力と同じで、Ctrl + Cを押すと終了できます。

では、たくさんのLEDを試してみましょう。このためにはブレッドボードが必要になります。以下のような回路を準備します。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-CHv2laoo-1681873103280)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_19.jpg)]

図 3.20 – チェイサー回路図

プログラミングについては、別のアプローチを試してみます。Python 3gpiozeroライブラリを使用します。ライブラリが Raspbian ディストリビューションにデフォルトでインストールされていない場合は、次のコマンドを使用してインストールできます。

pip3 install gpiozero

ピンのアドレス指定には BCM 番号付けシステムが使用されます。次のコードを Python ファイルに保存し、実行して、美しいキャッチアップ効果を確認します。

from gpiozero import LED
from time import sleep
led1 = LED(2)
led2 = LED(3)
led3 = LED(4)
led4 = LED(17)
led5 = LED(27)
led6 = LED(22)
led7 = LED(10)
led8 = LED(9)
led9 = LED(11)
sleeptime = 0.2
while True:
	led1.on()
	sleep(sleeptime)
	led1.off()
	led2.on()
	sleep(sleeptime)
	led2.off()
	led3.on()
	sleep(sleeptime)
	led3.off()
	led4.on()
	sleep(sleeptime)
	led4.off()
	led5.on()
	sleep(sleeptime)
	led5.off()
	led6.on()
	sleep(sleeptime)
	led6.off()
	led7.on()
	sleep(sleeptime)
	led7.off()
	led8.on()
	sleep(sleeptime)
	led8.off()
	led9.on()
	sleep(sleeptime)
	led9.off()

これまでのコードはすべて一目瞭然なので、簡単に理解できるはずです。最初の行では、 をインポートしますLEDBCM ピン番号をパラメータとして渡すことができます。on()変数に割り当てることができ、その変数を関数で呼び出して、off()それぞれに関連付けられた LED をオンまたはオフにすることができます。私たちもon()その間にいるoff()のでsleep()呼ばれます。

GPIOを使用したボタンプログラミング

次に、内部プルアップ抵抗を使用してボタンを RPi ボードに接続する方法を見てみましょう。以下のような回路を準備します。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6dQftXAV-1681873103281)(https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/raspi-cv-prog/img/B16208_03_20.jpg)]

图 3.21 –接口按钮图

在前面的电路中,我们将按钮的一端连接到引脚号 7,另一端连接到 GND。 将以下代码保存到 Python 文件中:

from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
button = 7
GPIO.setup(button, GPIO.IN, GPIO.PUD_UP)
while True:
    button_state = GPIO.input(button)
    if button_state == GPIO.HIGH:
        print ("HIGH")
    else:
        print ("LOW")
    sleep(0.5)

在前面的代码中,我们将引脚 7 初始化为输入引脚。 在setup()中,第二个参数决定 GPIO 引脚的模式(INOUT)。 第三个参数GPIO.PUD_UP决定是否将其连接到内部上拉电阻。 如果我们将按钮连接到内部上拉电阻,则在未按下按钮时,按钮所连接的 GPIO 引脚将设置为HIGH。 如果按下按钮,则将其设置为LOWGPIO.input()并返回按钮状态。 启动程序,如果按钮打开,输出将显示HIGH,如果按下按钮,输出将显示LOW。 以下是输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IouSSlgj-1681873103281)(https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/raspi-cv-prog/img/B16208_03_21.jpg)]

图 3.22 –按钮程序的输出

因此,这就是我们可以检测到按键按下的方式。 可以通过按Ctrl + C终止程序。

我们也可以尝试略有不同的电路和代码。 准备电路,如下所示:

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-ay6bo5g7-1681873103281)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_22.jpg)]

図 3.23 – ボタンの別の回路

前の回路では、ボタンの一端をピン 7 に接続し、もう一端を 3V3 ピンに接続しました。この端を 5V ピンに接続しないでください。ボタンを押すとピン 7 に接続され、GPIO ピンは最大 3V3 (3.3 V) までしか処理できないためです。5V 電源に接続すると、ピンとボードが損傷します。回路を準備し、次を使用してコードをコピーします。

cp prog06.py prog07.py

新しいファイルでは、次のように関数呼び出しにいくつかの小さな変更を加えるprog07.pyだけです。setup()

GPIO.setup(button, GPIO.IN, GPIO.PUD_DOWN)

これにより、ボタンが内部プルダウン抵抗に接続されます。ボタンがオンの場合、ボタンに接続されているピンは に設定されたままになりLOW、ボタンが押されると、そのピンは に設定されますHIGHプログラムを実行すると、出力は次のようになります。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-Vsp4eWPI-1681873103281)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_03_23.jpg)]

図 3.24 – 2 番目のボタン プログラムの出力

番組の先頭に表示されますLOWボタンを押すと に変わりますHIGHプログラムはを押すと終了できますCtrl + Cこれは、キーの押下を検出する別の方法です。

要約する

この章では、Python 3 プログラミングの基本を学びました。また、SciPy エコシステムについて学び、NumPy ライブラリと Matplotlib ライブラリを試しました。最後に、RPi の GPIO ピンを LED とボタンで使用する方法を確認しました。

次の章では、Python 3 と OpenCV を使用したプログラミングを開始します。また、Web カメラと RPi カメラ モジュールを使用したプログラミングについて学ぶために、いくつかの実践的な演習にも挑戦します。

4. コンピュータビジョンの概要

前の章では、Python 3、NumPy、Matplotlib、および汎用入出力( GPIO ) プログラミングの基本を学びました。この章では、画像とビデオの取得に焦点を当てます。この章には、本書全体で使用するコーディング例が多数あります。

この章では、次のトピックについて説明します。

  • 画像データセットを探索する
  • OpenCV を使用して画像を処理する
  • Matplotlib を使用して画像を視覚化する
  • OpenCV と NumPy を使用して幾何学的形状を描画する
  • GUIを使用する
  • イベント処理とプリミティブ ペイント アプリケーション
  • USBウェブカメラの使用
  • Piカメラモジュール

スキル要件

この章のコード ファイルはGitHubにあります

このページの「動作中のコード」を確認するには、以下のビデオをご覧ください。

画像データセットを探索する

Python と OpenCV を使用したコンピューター ビジョン プログラムの場合は、サンプル イメージが必要になります。インターネットではたくさんの写真を見つけることができます。ただし、これらの画像の多くは著作権によって保護されています。ほとんどのコンピューター ビジョンの研究者や専門家は、標準の画像データセットを使用しています。常に次の画像データセットを使用することを好みます。

これらのデータセットをダウンロードします。圧縮されたzip形式になります~/book/datasetそれらをディレクトリに抽出します。この章から始めて、画像を必要とする多くのコンピューター ビジョン プログラムを作成し、すべてのニーズにこれらのデータセットからの画像を使用します。画像のもう 1 つのオプションは、ネットワーク カメラと RPi カメラ モジュールを使用して画像をキャプチャすることです。画像についてはこの章で後ほど説明します。

OpenCV を使用して画像を処理する

このセクションでは、OpenCV API と Python を使用して画像を読み取り、保存する方法を学習します。この本のすべてのプログラムは OpenCV ライブラリを使用します。次の Python 3 ステートメントを使用してインポートできます。

import cv2

cv2.imread()関数はディスクからイメージを読み取り、 NumPy に保存しますndarray2 つのパラメータを受け入れます。最初のパラメータは、ディスク上のイメージ ファイルの名前です。画像は、現在の Python 3 スクリプトが保存されているディレクトリに配置するか、画像ファイルへの絶対パスを引数として関数に渡す必要がありますcv2.imread()

2 番目のパラメータは、画像を読み取るモードを指定するフラグです。このフラグには、次のいずれかの値を指定できます。

  • cv2.IMREAD_GRAYSCALE: グレースケール モードでディスクからイメージを読み取ります。このフラグに対応する値は です0
  • cv2.IMREAD_UNCHANGED: ディスクからイメージをそのまま読み取ります。このフラグに対応する値は です-1
  • cv2.IMREAD_COLOR: これはカラー モードで画像を読み取り、パラメータ引数のデフォルト値です。このフラグに対応する値は です1これはパラメータのデフォルト値です。

カラーモードで画像を読み取るコードは次のとおりです。

import cv2
img = cv2.imread('/home/pi/book/dataset/4.2.03.tiff', cv2.IMREAD_COLOR)

最後の行を次のフラグで書き換えることができます。

img = cv2.imread('/home/pi/book/dataset/4.2.03.tiff', 1)

数値ロゴを含むソース画像のスタイルを読み取るコードを記述する前の手順は非常に簡単です。したがって、本書全体でこれを使用します。

cv2.imshow('Mandrill', img)
cv2.waitKey(0)
cv2.destroyWindow('Mandrill')

cv2.imshow()関数は、画面上のウィンドウに画像を表示します。2 つのパラメータを受け入れます。ndarrayウィンドウの名前である文字列が最初のパラメータであり、表示する画像を含むNumPy変数が 2 番目の変数です。

cv2.waitKey()Function は、キーボード イベントをバインドするために使用される関数です。パラメータを 1 つ受け取ります。これは、関数がキーボードのキーの押下を検出するまで待機する必要があるミリ秒数です。これを として渡すと0、キーボード上のキーが押されるまで無期限に待機します。これは、キーボード イベントを処理できる OpenCV ライブラリ内の唯一の関数です。cv2.imshow()関数を呼び出した後はすぐに呼び出す必要があります。cv2.waitKey()これを呼び出さなかった場合、イベントを取得して処理する唯一の関数であるため、画面上に画像を表示するウィンドウは存在しません。

cv2.destroyWindow()この関数は、破棄するウィンドウの名前をパラメータとして受け取ります。現在のプログラムによって表示されているすべてのウィンドウを削除する必要がある場合、cv2.destoyAllWindows()関数を使用してこれを行います。この本では、ほぼすべての OpenCV プログラムでこれらの関数を使用します。

また、事前に特定の名前のウィンドウを作成しておき、必要に応じて後でプログラム内でそのウィンドウに画像を関連付けることもできます。画像を処理する前にウィンドウを作成することをお勧めします。次のコード スニペットはこれを示しています。

cv2.namedWindow('Lena', cv2.WINDOW_AUTOSIZE)
cv2.imshow('Mandrill', img)
cv2.waitKey(0)
cv2.destroyWindow('Mandrill')

それらを結合して次のスクリプトを作成しましょう。

import cv2
img = cv2.imread('/home/pi/book/dataset/4.2.03.tiff', 1)
cv2.imshow('Mandrill', img)
cv2.waitKey(0)
cv2.destroyWindow('Mandrill')

前述のコードは、画像をインポートして画面に表示し、キーボードのキーストロークを待って画像ウィンドウを閉じます。上記のコードの出力のスクリーンショットを次に示します。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-8dBgMVxt-1681873103281)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_04_01.jpg)]

図 1: OpenCV を使用したカラー画像の読み取りと視覚化

cv2.imwrite()関数はndarrayNumPy をディスク上の特定のパスに保存します。最初のパラメータは文字列で、画像の保存に使用するファイルの名前です。2 番目のパラメータは画像を保持する NumPy 配列の名前です。さらに、cv2.waitKey()関数はキーボード上の特定のキーストロークを検出できます。以下に示す 2 つの関数のデモンストレーションを見てみましょう。

import cv2
img = cv2.imread('/home/pi/book/dataset/4.2.03.tiff', 1)
cv2.imshow('Mandrill', img)
keyPress = cv2.waitKey(0)
if keyPress == ord('q'):
    cv2.destroyWindow('Mandrill')
elif keyPress == ord('s'):
    cv2.imwrite('test.jpg', img)
    cv2.destroyWindow('Mandrill')

ここで、keyPress = cv2.waitKey(0)この行はキーボードのキーストロークの値をkeyPress変数に保存します。ord()この関数は 1 つの文字を受け入れ、その文字の Unicode (Unicode オブジェクトの場合) を表す整数を返します。変数に基づいてkeyPress、すぐに終了することも、イメージをディスクに保存した後に終了することもできます。たとえば、Escキーを押す、cv2.waitKey()関数は27値を返します。

Matplotlib を使用して画像を視覚化する

Matplotlib は、Python 3 プログラミング言語用の非常に強力なデータ視覚化ライブラリです。画像の可視化も可能です。また、さまざまな描画オプションも提供されており、その多くについては、本書の後続の章で説明します。cv2.imread()OpenCV 関数を使用してグレースケール モードで読み取られたMatplotlib で画像を表示するプログラムを作成してみましょう。

import cv2
img = cv2.imread('/home/pi/book/dataset/4.2.03.tiff', 0)
import matplotlib.pyplot as plt
plt.imshow(img)
plt.title('Mandrill')
plt.axis('off')
plt.show()

知らせ

このページのアカウントから、購入したすべての Packt Publishing 書籍のサンプル コード ファイルをダウンロードできます。この本を他の場所で購入した場合は、このページにアクセスしてサインアップすると、ファイルが直接電子メールで送信されます。

前の例では、グレースケール モードで画像を読み取り、plt.imshow()Matplotlib 関数を使用して画像を表示しました。上記のプログラムの出力は次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-8qZsvS7T-1681873103282)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_04_02.jpg)]

図 2: Matplotlib を使用して BGR イメージを RGB イメージとして視覚化する

画像が不自然に見えることはわかっています。これは、画像をグレースケール モードで読み取り、デフォルトのカラーマップを使用して視覚化するためです。plt.imshow()に次の変更を加えると、出力がより快適になることがわかります出力は次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-Jagt4eYc-1681873103282)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_04_03.jpg)]

図 3: 視覚化されたグレースケール画像

すべてはグレースケール画像に関するものです。

cv2.imread()この機能はカラー画像にも使用できます。それらを青、緑、赤(BGR) ピクセルの 3 次元として読み取り、保存しますndarray

ただし、Matplotlibplt.imshow()関数はndarray、NumPy を RGB 色空間の画像として表示します。関数を使用して OpenCV のデフォルトの BGR 形式を使用してイメージを読み取りcv2.imread()plt.imshow()関数を使用してイメージを表示すると、plt.imshow()関数は青の強度値を赤の強度値として扱い、その逆も同様です。これにより、画像の色が歪んでしまいます。前のコードの対応する行に次の変更を加えて、プログラムを再度実行します。

img = cv2.imread('/home/pi/book/dataset/4.2.03.tiff', 1)
plt.imshow(img)

変更を加えてコードを実行すると、色が歪んだカラー イメージが表示されます。この問題を解決するには、関数が人間の目と脳にとって意味のある方法でレンダリングできるcv2.imread()ように、関数が BGR 色空間で読み取った画像を RGB 色空間に変換する必要があります。plt.imshow()このタスクを実行するには関数を使用しますcv2.cvtColor()。これについては、本書の後半で詳しく説明します。

OpenCV と NumPy を使用して幾何学的形状を描画する

OpenCV の描画関数を使用してさまざまな幾何学的形状を描画する方法を学びましょう。ここでもNumPyを使用します。

次のコードは、このデモに必要なすべてのライブラリをインポートします。

import cv2
import numpy as np

次のコードは、すべて 0 の RGB を作成しますndarrayすべてのピクセルが黒の画像です。

image = np.zeros((200, 200, 3), np.uint8)

np.zeros()関数を使用して、要素がすべてゼロの を作成していますndarray

単純な幾何学図形なので線を引いてみましょう。(0, 199)次のコードを使用して、座標と(199, 0)、色が赤 (BGR 内(0, 0, 255))、太さが 2 ピクセルの線を描画します。

cv2.line(image, (0, 199), (199, 0), (0, 0, 255), 2)

描画に使用されるすべての OpenCV 関数には、次のパブリック パラメータがあります。

  • img: これは幾何学的形状を描画するために必要な画像です。
  • color: [color] と(B, G, R)の間の強度値で各色を表すタプルとして渡されます0255
  • thickness: このパラメータのパラメータのデフォルト値は です1すべての幾何学的に閉じた形状 (楕円、円、長方形など) では、-1その形状はパラメーターとして指定された色で完全に塗りつぶされます。
  • lineType: 次の 3 つの値のいずれかを指定できます。

8: 8 行の連結 (これがこの引数のデフォルト値です)。

4:4本の接続線。

cv2.LINE_AA: これはアンチエイリアスを表します(通常、楕円や円などの曲線を含む幾何学的形状で使用されます)。

(20, 20)次のコード行は、対角頂点がと等しい青色の長方形を描画するのに役立ちます(60, 60)

cv2.rectangle(image, (20, 20), (60, 60), (255, 0, 0), 1)

次のコードは、中心が(80, 80)、半径が 10 ピクセル、塗りつぶし色が緑の円を描画するのに役立ちます。

cv2.circle(image, (80, 80), 10, (0, 255, 0), -1)

次のコード行は、回転せずに完全な楕円を描画するのに役立ちます。(99, 99)ピクセルを中心とする長軸と短軸の長さはそれぞれ 40 ピクセルと 20 ピクセルです。

cv2.ellipse(image, (99, 99), (40, 20), 0, 0, 360, (128, 128, 128), -1)

次のコードは、4 つの点を持つ多角形を描画します。定義は次のとおりです。

points = np.array([[100, 5], [125, 30], [175, 20], [185, 10]], np.int32)
points = points.reshape((-1, 1, 2))
cv2.polylines(image, [points], True, (255, 255, 0))

polylines()関数の呼び出しでFalse3 番目のパラメーターとして渡された値が渡された場合、すべての点が線分で接続され、閉じた形状は描画されません。

関数を使用して画像内のテキストを印刷することもできますcv2.putText()次のコードは、画像の左下隅にテキストを追加します(80, 180)。これがHERSHEY_DUPLEXフォント、サイズ テキスト 1、テキストの色 ピンクになります。

cv2.putText(image, 'Test', (80, 180), cv2.FONT_HERSHEY_DUPLEX, 1, (255, 0, 255))

cv2.putText()この関数は、次のいずれかのフォントを引数として受け取ります。

  • FONT_HERSHEY_DUPLEX
  • FONT_HERSHEY_COMPLEX
  • FONT_HERSHEY_SIMPLEX
  • FONT_HERSHEY_PLAIN
  • FONT_HERSHEY_SCRIPT_SIMPLEX
  • FONT_HERSHEY_SCRIPT_COMPLEX
  • FONT_HERSHEY_TRIPLEX
  • FONT_HERSHEY_COMPLEX_SMALL

次の使い慣れたコード スニペットを使用して、出力イメージを表示します。

cv2.imshow('Shapes', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

前のコードの出力は次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-2MFxvRgc-1681873103282)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_04_04.jpg)]

図 4: 幾何学的形状の描画

知らせ

ジオメトリのピクセルが重なっている場合、これらのピクセルには常に最新のジオメトリ関数によって割り当てられた値が割り当てられます。たとえば、上の画像では、楕円が線と円に重なっています。

演習として、すべてのジオメトリ関数に渡されるパラメーター値を変更し、コードを再度実行して、機能をよりよく理解します。

GUIを使用する

これまで、cv2.namedWindow()OpenCV 関数の呼び出しを使用して名前付きウィンドウを作成する方法を見てきました。cv2.CreateTrackbar()ここでは、関数を使用してトラッキング バーを作成する方法、トラッキング バーを名前付きウィンドウに関連付ける方法、およびこれらのトラッキング バーを使用してカラー チャネルの値を選択する方法を説明しますRGB色空間。次のコードから始めましょう。

import numpy as np
import cv2
def empty(z):
    pass
image = np.zeros((300, 512, 3), np.uint8)
cv2.namedWindow('Palette')
cv2.createTrackbar('B', 'Palette', 0, 255, empty)
cv2.createTrackbar('G', 'Palette', 0, 255, empty)
cv2.createTrackbar('R', 'Palette', 0, 255, empty)
while(True):
    cv2.imshow('Palette', image)
    if cv2.waitKey(1) == 27 :
        break
    blue = cv2.getTrackbarPos('B', 'Palette')
    green = cv2.getTrackbarPos('G', 'Palette')
    red = cv2.getTrackbarPos('R', 'Palette')
    image[:] = [blue, green, red]
cv2.destroyWindow('Palette')

前述のコードでは、最初にすべてのピクセルが黒でペイントされた画像を作成し、Panel という名前のウィンドウを作成します。cv2.createTrackbar()関数はトラッキング バーを作成します。以下は、この関数が受け入れるパラメーターのリストです。

  • name: トラックバーの名前。
  • window_name: トラッキング バーに関連付けられた出力ウィンドウの名前。
  • value:トラッキングバースライダー作成時の初期値です。
  • count: トラック バー スライダーの最大値 (スライダーの最小値は常に 0)。
  • Onchange(): この関数は、トラックバー スライダーの位置を変更するときに呼び出されます。

関数を作成し、 という名前を付けましたempty()トラックバーのスライダーを変更するときは、何も実行しません。cv2.createTrackbar()この関数への呼び出しを関数に渡すだけです。cv2.getTrackbarPos()この関数を呼び出すと、トラック バー スライダーの最新の位置が返されます。3 つのトラックバー スライダーすべての位置に応じて、パレットの色を設定します。キーボードのキーを押すとEsc、アプリが終了します。作成するアプリは次のようになります。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-Tjo4s3xP-1681873103282)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_04_05.jpg)]

図 5: BGR パレット

OpenCV は、イベントを処理するための多くの関数も提供します。次に、それについて調べていきます。

イベント処理と基本的な描画アプリケーション

OpenCV はさまざまなキーボードとマウスのイベントを認識します。以下の手順に従ってイベントリストを表示できます。コマンド プロンプトでコマンドを実行してpython3Python 3 インタープリターを対話的に開き、次のステートメントを実行します。

>>> import cv2
>>> events = [i for i in dir(cv2) if 'EVENT' in i]
>>> print(events)

次の出力が表示されます。

['EVENT_FLAG_ALTKEY', 'EVENT_FLAG_CTRLKEY', 'EVENT_FLAG_LBUTTON', 'EVENT_FLAG_MBUTTON', 'EVENT_FLAG_RBUTTON', 'EVENT_FLAG_SHIFTKEY', 'EVENT_LBUTTONDBLCLK', 'EVENT_LBUTTONDOWN', 'EVENT_LBUTTONUP', 'EVENT_MBUTTONDBLCLK', 'EVENT_MBUTTONDOWN', 'EVENT_MBUTTONUP', 'EVENT_MOUSEHWHEEL', 'EVENT_MOUSEMOVE', 'EVENT_MOUSEWHEEL', 'EVENT_RBUTTONDBLCLK', 'EVENT_RBUTTONDOWN', 'EVENT_RBUTTONUP']

これらのイベントの一部を処理するコードを記述し、シンプルで原始的なペイント アプリケーションを作成できます。次のコードを使用して、必要なライブラリをインポートしましょう。

import cv2
import numpy as np

黒い背景と名前付きウィンドウを作成します。

windowName = 'Drawing'
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow(windowName)

というカスタム関数を定義しますdraw_circle()

def draw_circle(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img, (x, y), 40, (0, 255, 0), -1)
    if event == cv2.EVENT_MBUTTONDOWN:
        cv2.circle(img, (x, y), 20, (0, 0, 255), -1)
    if event == cv2.EVENT_LBUTTONDOWN:
        cv2.circle(img, (x, y), 30, (255, 0, 0), -1)

前の定義では、マウス イベントのさまざまなプロパティを使用して円を描画しています。次に、setMouseCallback()関数を呼び出して、draw_circle()ウィンドウの名前と関数を引数として渡します。

cv2.setMouseCallback(windowName, draw_circle)

この呼び出しは、draw_circle()関数を指定されたウィンドウのマウス イベントにバインドします。Esc最後に、画像ウィンドウを表示し、キーが押されたときに終了するループを作成します。

while(True):
    cv2.imshow(windowName, img)
    if cv2.waitKey(20) == 27:
        break
cv2.destroyAllWindows()

コード全体を実行すると、次の出力が表示されます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-uC9mwDHa-1681873103283) (https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_04_06.jpg)]

図 6: 単純なペイント アプリケーション

左ボタン、中央ボタン、および下ボタンのダブルクリック イベントをプログラムすると、出力はこれらのイベントとカーソルの位置に応じて異なります。

この本では、OpenCV の描画 API を限定的に使用します。この本で最もよく使用する機能は、Web カメラに関係します。次のセクションでは、Web カメラを OpenCV および Raspberry Pi と接続して使用する方法について説明します。

USBウェブカメラの使用

カメラはイメージセンサーです。つまり、アナログカメラや映画カメラは画像をフィルムに記録します。デジタル カメラには画像を取り込むためのデジタル センサーが搭載されており、画像はさまざまな種類の記憶媒体に電子形式で保存されます。デジタル カメラのサブセットは USB Web カメラです。名前が示すように、これらの Web カメラは USB 経由でコンピュータに接続できるため、USB Web カメラと呼ばれます。このセクションでは、USB Web カメラと Raspberry Pi の接続方法と、シェル スクリプト、Python 3、OpenCV を使用して Web カメラをプログラミングする方法について詳しく学びます。

知らせ

これらの Web カメラはすべて Raspberry Pi ボードで使用できます。ただし、一部の Web カメラには問題がある可能性があります。この URL には、多くの Web カメラのリストと互換性に関する詳細が含まれています。

この本のすべてのプログラムは、RPi 4B および Logitech C310 Web カメラでテストされています。このページで製品ページをご覧いただけます。

開発ボードの USB ポートを使用して USB Web カメラを RPi に接続し、ターミナルで次のコマンドを実行します。

lsusb

此命令的输出显示连接到 Linux 计算机的所有 USB 设备的列表。 以下是我的 RPi 板上显示的输出:

pi@raspberrypi:~/book/chapter04 $ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 005: ID 046d:081b Logitech, Inc. Webcam C310
Bus 001 Device 004: ID 1c4f:0002 SiGma Micro Keyboard TRACER Gamma Ivory
Bus 001 Device 003: ID 046d:c077 Logitech, Inc. M105 Optical Mouse
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

从前面的输出中可以看到,第二个条目对应于连接到 RPi 板的 USB 网络摄像头。 我们还可以看到 USB 鼠标和 USB 键盘连接到 RPi 板。

使用网络摄像头捕获图像

现在,让我们演示如何使用连接到 RPi 的 USB 网络摄像头捕获图像。 我们可以通过在终端上运行以下命令来安装fswebcam工具:

sudo apt-get install fswebcam

安装后,我们可以运行以下命令以使用 USB 网络摄像头捕获照片:

fswebcam -r 1280x960 --no-banner ~/book/chapter04/camtest.png

此命令使用连接到 RPi 的 USB 网络摄像头捕获分辨率为1280 x 960像素的图像。 传递给命令的命令行--no-banner参数禁用时间戳记的标题。 图像以文件名作为最后一个参数保存。 如果我们重复运行此命令,则捕获的新照片将被覆盖到同一文件中。 因此,下一次运行命令时,如果我们不想覆盖先前的文件,则必须将不同的文件名作为参数传递给命令。

注意

如果您想了解有关fswebcam(或与此相关的任何 Linux 命令)的更多信息,则可以在命令提示符下运行man fswebcam命令。

缩时摄影

カメラで一定の間隔で写真を撮影し、撮影時よりも高いフレームレートで再生することをタイムラプス撮影と呼びます。たとえば、1 分に 1 枚の割合で 10 時間写真を撮影すると、600 枚の写真が作成されます。これらすべてを 1 つのビデオにつなぎ合わせ、1 秒あたり 30 枚の写真のフレーム レートで再生すると、20 秒のビデオが得られます。このビデオは、タイムラプス ビデオとも呼ばれます。RPi ボードを USB Web カメラで使用できます。RPi ボードで USB Web カメラを使用する方法を学びました。fswebcam道具の使い方なども学びました。ファイル名にタイムスタンプを含む画像をキャプチャするスクリプトを作成します。crontab次に、定期的に実行するスクリプトを追加します。Cron は、Unix 系オペレーティング システム用のジョブ スケジューラです。これはcrontab(Cron テーブル) と呼ばれるファイルによって駆動されます。これは、特定の時間または間隔で実行するスクリプトまたはプログラムを指定する Unix 構成ファイルです。

という名前のシェル スクリプトを作成しtimelapse.sh、ディスク上の選択した場所に保存しましょう。次のコードをスクリプト ファイルに追加して保存する必要があります。

#!/bin/bash
DATE=$(date +"%Y-%m-%d_%H%M")
fswebcam -r 1280x960 --no-banner Image_$DATE.png 

次のコマンドを実行して、スクリプトのモードを実行可能にします。

chmod +x timelapse.sh

スクリプトは USB Web カメラを使用して写真を撮影し、それをディスク上の場所に保存します。ファイル名には画像がキャプチャされたときにタイムスタンプが付けられるため、キャプチャされた各画像には新しいファイル名が付けられます。このスクリプトが適切に動作し、Image_<timestamp>.pngファイル名形式で画像がキャプチャされることを確認するには、このスクリプトを手動で 1 回実行する必要があります。

スクリプトに問題がないか確認した後、スクリプトを定期的に実行して、時間間隔シーケンスの画像をキャプチャする必要があります。これを行うには、それを に追加する必要がありますcrontabcrontabのエントリの構文は次のとおりです。

1 2 3 4 5 /location/command

文法内の用語の意味を確認してみましょう。

  • 1: 分の位置 (0 ~ 59 の範囲)
  • 2:時の位置(0~23の範囲)
  • 3:日付の位置(範囲は0~31)
  • 4:月の位置(範囲は0~12、1月は1)
  • 5:星期的位置(范围为 0-7,星期日为 7 或 0)
  • /location/command:要计划的脚本或命令名称

因此,crontab每分钟运行一次timelapse.sh脚本的条目如下:

* * * * * /home/pi/book/chapter04/timelapse.sh 2>&1

使用以下命令打开用户picrontab

crontab –e

这将打开crontab。 当我们第一次在 RPi 上执行此操作时,它将询问您选择哪个文本编辑器。 通过输入1选择nano选项。 将上一行作为条目添加到crontab中。 然后保存并退出。

一旦退出crontab,它将向我们显示以下消息:

crontab: installing new crontab

一旦执行此操作,就可以开始设置游戏中时光倒流。 我们可以将crontab条目中的设置更改为我们选择的设置。 要每 5 分钟运行一次脚本,请使用以下命令:

*/5 * * * * /home/pi/book/chapter04/timelapse.sh 2>&1

要每 2 小时运行一次脚本,请使用以下命令:

* */2 * * * /home/pi/book/chapter04/timelapse.sh 2>&1

一旦捕获了所有用于延时拍摄的图像,我们就必须将它们编码为每秒 24、25、29 或 30 帧(FPS)的帧频的视频。 这些均为标准帧速率。 我更喜欢使用 30 FPS 对视频进行编码。 Raspberry Pi 是用于视频编辑的慢速计算机。 建议您将图像复制到速度更快的计算机上以对视频进行编码。 对于 Linux 计算机,我更喜欢使用命令行mencoder工具。 我们也可以使用其他工具或视频编辑工具来完成此任务。 以下是在 Raspberry Pi 或任何其他 Linux 计算机上使用mencoder创建延时视频的步骤:

  1. 在命令提示符上使用以下命令安装 MEncoder:

     sudo apt-get install mencoder -y
    
  2. 发出以下命令,导航到输出目录:

     cd /home/pi/book/chapter04
    
  3. 使用以下命令创建在间隔拍摄序列中要使用的图像的列表:

     ls Image_*.png > timelapse.txt
    
  4. 最后,我们可以使用以下命令来创建漂亮的延时视频:

    mencoder -nosound -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=8000000 -vf scale=1280:960 -o timelapse.avi -mf type=jpeg:fps=30 mf://@timelapse.txt
    

此在我们正在运行命令的当前目录(也称为当前工作目录)的当前目录中创建带有timelapse.avi文件名的视频。 。 视频的帧频为 30 FPS。 很快,我们将学习如何播放此视频文件。

使用网络摄像头的录像

我们可以使用连接到 RPi 的 USB 网络摄像头,通过命令行ffmpeg工具录制实时视频。 我们可以使用以下命令安装ffmpeg工具:

sudo apt-get install ffmpeg

我们可以使用以下命令来录制视频:

ffmpeg -f video4linux2 -r 25 -s 544x288 -i /dev/video0 test.avi

我们可以通过按键盘上的Ctrl + C终止录制视频的操作。

我们可以使用命令行omxplayer工具播放视频。 它预装了 Raspbian 的最新版本,因此我们不必单独安装它。 要播放具有timelapse.avi文件名的文件,请使用命令提示符导航到视频文件的位置,然后运行以下命令:

omxplayer timelapse.avi

我们甚至可以双击 Raspbian GUI 中的视频文件,以使用 VLC 媒体播放器进行播放。

使用 Python 和 OpenCV 和网络摄像头捕获图像

让我们学习如何使用 Python 3 和 OpenCV 通过连接到 RPi 的网络摄像头捕获图像:

import cv2
import matplotlib.pyplot as plt
cap = cv2.VideoCapture(0)
if cap.isOpened():
    ret, frame = cap.read()
else:
    ret = False
print(ret)
print(type(frame))
cv2.imshow('Frame from Webcam', frame)
cv2.waitKey(0)
cap.release()
cv2.destroyAllWindows()

在先前的代码片段中, cv2.VideoCapture()函数创建一个对象,以使用连接到 RPi 的网络摄像头捕获视频。 它的参数可以是视频设备的索引或视频文件。 在这种情况下,我们正在传递视频设备的索引,即0。 如果我们有更多的摄像机连接到 RPi 板上,则可以根据选择的摄像机来传递适当的设备索引。 如果仅连接一台摄像机,则只需传递0即可。

通过运行以下命令,我们可以找出摄像机的数量以及与这些摄像机关联的设备索引:

ls -l /dev/video*

cap.read()この関数は、ブール値と、retキャプチャされたイメージを含むNumPyndarrayフレームを返します。画像をキャプチャする操作が成功した場合、retのブール値は になりますTrue。それ以外の場合は、ブール値 になりますFalse上記のコードは、/dev/video0識別された USB カメラを使用して画像をキャプチャし、それを画面に表示し、最終的にtest.pngファイル名としてディスクに保存します。cap.release()関数はビデオ キャプチャ デバイスを解放します。

Python と OpenCV を使用した Web カメラによるライブ ビデオ ストリーミング

前のコードをいくつか変更して使用すると、USB Web カメラからのライブ ビデオ ストリームを表示できます。

import cv2
windowName = "Live Video Feed"
cv2.namedWindow(windowName)
cap = cv2.VideoCapture(0)
if cap.isOpened():
    ret, frame = cap.read()
else:
    ret = False
while ret:
    ret, frame = cap.read()
    cv2.imshow(windowName, frame)
    if cv2.waitKey(1) == 27:
        break
cv2.destroyAllWindows()
cap.release()

Esc前のコードでは、キーボードのキーを押すまで、Web カメラでキャプチャされたライブ ビデオが表示されます。前のコード例は、RPi ボードに接続された USB Web カメラによってキャプチャされたライブ ビデオの処理を使用するすべてのコード例のテンプレートです。

ウェブカメラの解像度

cap.get()を使用して Web カメラのプロパティを読み取ることができます。3幅を得るためにパスし、4高さを得るためにパスする必要があります。set プロパティを使用することもできますcap.set()次のコードはこれを示しています。

import cv2
windowName = "Live Video Feed"
cv2.namedWindow(windowName)
cap = cv2.VideoCapture(0)
print('Width : ' + str(cap.get(3)))
print('Height : ' + str(cap.get(4)))
cap.set(3, 5000)
cap.set(4, 5000)
print('Width : ' + str(cap.get(3)))
print('Height : ' + str(cap.get(4)))
if cap.isOpened():
    ret, frame = cap.read()
else:
    ret = False
while ret:
    ret, frame = cap.read()
    cv2.imshow(windowName, frame)
    if cv2.waitKey(1) == 27:
        break
cv2.destroyAllWindows()
cap.release()

前のコードでは、高さと幅の両方を に設定しました5000Web カメラはこの解像度をサポートしていないため、高さと幅の両方が Web カメラでサポートされている最大解像度に設定されます。前述のコードを実行し、コマンド プロンプトに出力される出力を確認します。

ウェブカメラ FPS

使用している Web カメラの FPS を取得することも、実際の FPS を自分で計算することもできます。Web カメラの属性として取得される FPS と計算された FPS は異なる場合があります。それをチェックしよう。必要なライブラリをすべてインポートします。

import time
import cv2

次に、ビデオ キャプチャ用のオブジェクトを開始します。

cap = cv2.VideoCapture(0)

cap.get()以下を使用してカメラの解像度を取得できます。

fps = cap.get(cv2.CAP_PROP_FPS)
print("FPS with CAP_PROP_FPS : {0}".format(fps))

次に、120 フレームを連続してキャプチャします。手術前後の時間を以下のように記録します。

num_frames = 120
print("Capturing {0} frames".format(num_frames))
start = time.time()
for i in range(0, num_frames):
    ret, frame = cap.read()
end = time.time()

次に、最後にフレームのキャプチャにかかった実際の時間を計算し、次の式を使用して FPS を計算できます。

コードは以下のように表示されます。

seconds = end - start
print("Time taken : {0} seconds".format(seconds))
fps = num_frames / seconds
print("Actual FPS calculated : {0}".format(fps))
cap.release()

プログラム全体を実行すると、出力は次のようになります。

FPS with CAP_PROP_FPS : 30.0
Capturing 120 frames
Time taken : 9.86509919166565 seconds
Actual FPS calculated : 12.164094619685105

ハードウェアの制限のため、通常はプロパティから FPS を取得することはありません。

ウェブカメラのビデオを保存する

OpenCVcv2.VideoWriter()関数を使用して、ライブ USB Web カメラ ストリームをディスク上のビデオ ファイルに保存します。次のコードはこれを示しています。

import cv2
windowName = "Live Video Feed"
cv2.namedWindow(windowName)
cap = cv2.VideoCapture(0)
filename = 'output.avi'
codec = cv2.VideoWriter_fourcc('W', 'M', 'V', '2')
framerate = 30
resolution = (640, 480)
Output = cv2.VideoWriter(filename, codec,
                         framerate, resolution)
if cap.isOpened():
    ret, frame = cap.read()
else:
    ret = False
while ret:
    ret, frame = cap.read()
    Output.write(frame)
    cv2.imshow(windowName, frame)
    if cv2.waitKey(1) == 27:
        break
cv2.destroyAllWindows()
cap.release()

前のコードでは、cv2.VideoWriter()関数呼び出しはパラメーターを受け入れます。そのパラメーターは次のとおりです。

  • filename: ディスクに書き込まれるビデオ ファイルの名前です。
  • fourcc: 4 文字のコードを表します。このために関数を使用しますcv2.VideoWriter_fourcc()この関数は引数として 4 文字のコードを受け取ります。サポートされている 4 文字のコード形式には、、、、、WMV2およびあります4 文字コードについて詳しくは、このページをご覧ください。MJPGH264WMV1DIVXXVID
  • framerate: キャプチャするビデオの FPS を指します。
  • resolution: これは、ビデオがキャプチャされてディスクに保存されるときのピクセル解像度です。

上記のコードは、Escキーボードのキーが押されるまでビデオを記録し、cv2.VideoWriter()関数の引数で指定されたファイル名を使用してディスクに保存します。

OpenCVを使用してビデオを再生する

OpenCVを使って簡単に動画を再生することができます。VideoCapture()ウェブカメラのインデックス (この場合) の代わりに、ビデオ ファイルの名前を関数に渡すだけです0再生の FPS を決定するには、waitKey()関数の呼び出しに適切なパラメーターを渡す必要があります。ビデオを 25 FPS で再生したいと仮定すると、1000/25 = 40渡すパラメータを計算する式を使用できます。waitKey()待機するミリ秒数がわかっているので、それをパラメータとして渡します。そして、1 秒は 1,000 ミリ秒であるため、この公式が生まれます。30 FPS の場合、これは 33.3 になります。次のコードを見てみましょう。

import cv2
windowName = "OpenCV Video Player"
cv2.namedWindow(windowName)
filename = 'output.avi'
cap = cv2.VideoCapture(filename)
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret:
        cv2.imshow(windowName, frame)
        if cv2.waitKey(33) == 27:
            break
    else:
        break
cv2.destroyAllWindows()
cap.release()

前のプログラムは 30 FPS のフレーム レートでビデオ ファイルを再生し、Esc最後のフレームの後、またはキーボードのキーを押すと終了します。このプログラムを使用して、関数呼び出しのパラメーターの値を変更することでcv2.waitKey()出力フレーム レートを変更してみるとよいでしょう。

次のセクションでは、Pi カメラ モジュールについて詳しく見ていきます。

Piカメラモジュール

Web カメラは USB ポートを使用してコンピュータに接続します。そのため、USB ポートを備えたあらゆるコンピューターで使用できます。Pi カメラ モジュール ( Pi カメラ ボードとも呼ばれる) は、RPi ボード専用に作られたセンサーです。Raspberry Pi Foundation およびその他の多くのサードパーティ メーカーがこれらを製造しています。基本的に、これらは専用のイメージ センサーを備えた PCB です (そのため、Pi カメラ ボードと呼ばれます)。

Pi カメラ ボードには USB ポートがありません。カメラ シリアル インターフェイス( CSI ) インターフェイス ボードを介して Raspberry Pi に接続します。CSI を使用した専用接続により、Pi カメラ ボードは USB ウェブカメラよりもはるかに優れたパフォーマンスを発揮します。RPi に接続された Pi カメラ モジュールで Python 3 を使用して、プログラムでビデオと静止画像をキャプチャできます。Pi カメラ ボードは、Raspberry Pi (およびシングルボード カメラ接続をサポートする少数のシングルボード コンピュータ) 以外のコンピュータでは使用できません。

カメラ モジュールには、カメラ モジュールと NoIR モジュールの 2 種類があります。このカメラ モジュールは、日中や明るいシーンに最適です。NoIR モジュールは本質的に、赤外線( IR ) フィルターのないカメラ モジュールです。日中や明るいシーンでは効果はあまり良くありません。ただし、赤外線と併用すると、光が少ない場所や暗い場面で非常に役立ちます。

両方のモジュールの最新バージョンは、このページ製品ページで見つけることができます。これらのカメラ ボード/モジュールは、V1 と V2 という数世代にわたって存在しています。V1 は 5 メガピクセルでしたが、現在は生産されていません。V2 は最新で、8 メガピクセルのセンサーを搭載しています。両者の違いについては、このページで学ぶことができます。

すべてのカメラには、カメラ シリアル インターフェイス( CSI ) ポートを介してRPi ボードに接続する取り外し可能なリボンが付属しています。カメラ モジュールとリボンの写真は次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-oF5Ru85J-1681873103283)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_04_07.jpg)]

図 7: Pi カメラ ボードと CSI インターフェイスの機能領域

青い端をRPiボードのCSIポートに接続し、もう一方の端をカメラボードに接続する必要があります。

RPi Zero および RPi Zero W には、より小さな CSI ポートが装備されています。独立した機能エリアがあります。このリボンの写真は次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-f8qTWovj-1681873103283)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_04_08.jpg)]

図 8: Mini CSI の機能領域

これは、RPi Zero ボードに接続された Pi NoIR ボードの写真です。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-JgvdgEHJ-1681873103283)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_04_09.jpg)]

図 9: RPi がゼロの Pi NoIR

Pi Camera V1 はすでに生産終了していることはすでに述べました。これらの低価格の V1 モジュールの多くはオンラインで見つかります (5 ドルから 7 ドル)。さらに、RPi CSI ポートと互換性のある同様のボードを製造している他のメーカーもあります。オンラインでも購入できます。

raspistillおよびツールを使用してraspivid画像とビデオをキャプチャする

RPi のカメラ モジュールを使用して静止写真や動画をキャプチャするには、コマンド ラインraspistillraspividツールを使用する必要があります。画像をキャプチャするには、次のコマンドを実行します。

raspistill -o test.png

このコマンドは、test.pngファイル名を使用してイメージをキャプチャし、現在のディレクトリに保存します。

RPi カメラ モジュールを使用して 20 秒のビデオをキャプチャするには、コマンド プロンプトで次のコマンドを実行します。

raspivid -o vid.h264 -t 20000

fswebcamandツールとは異なりffmpegraspistillandraspividツールはコマンド プロンプトに何も書き込みません。したがって、現在のディレクトリに出力があるかどうかを確認する必要があります。さらに、raspistillおよびraspividツールを実行した後、次のコマンドを実行して、これらのコマンドが正常に実行されたかどうかを確認できます。

echo $?

多くのコンピュータおよびオペレーティング システムは、H.264 ビデオを直接再生できません。これを行うには、それらを一般的で広くサポートされているMP4形式にラップする必要がありますこのためには、というコマンドラインツールが必要ですMP4Boxコマンド プロンプトで次のコマンドを実行してインストールできます。

sudo apt install -y gpac

次に、H.264 ビデオを録画します。

raspivid -t 30000 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o pivideo.h264

それをMP4形式に圧縮し、次のように元のファイルを (必要に応じて) 削除します。

MP4Box -add pivideo.h264 pivideo.mp4
rm pivideo.h264

ツールと同様にfswebcamraspistillツールも時間間隔シーケンスをキャプチャするために使用できます。先ほど準備したシェル スクリプトで、ツールを呼び出す行を、写真のタイムラプス シーケンスを記録するためのtimelapse.sh適切なコマンドにraspistill置き換えます。fswebcam次に、RPi または Linux コンピューター上のその他のツールを使用して、mencoder美しいタイムラプス ビデオを作成します。

Python 3 での picamera の使用

picameraRPi カメラ モジュールのプログラミング インターフェイスを提供する Python パッケージです。最新バージョンの Raspbian がインストールされていますpicameraまだインストールされていない場合は、次のコマンドを実行してインストールできます。

pip3 install picamera
pip3 install "picamera[array]"

次のプログラムは、picamera画像をキャプチャするモジュールの基本的な使用法を簡単に示します。

from time import sleep
from picamera import PiCamera
camera = PiCamera()
camera.resolution = (1024, 768)
camera.start_preview()
sleep(2)
camera.capture('test.png')

最初の 2 行でtimeとライブラリをインポートしました。picameraこの関数を呼び出すと、start_preview()キャプチャするシーンのプレビューが開始されます。この関数は、写真をキャプチャしてパラメーターで指定されたファイルに保存するsleep(5)まで 5 秒待機します。capture()

picameraモジュールはタイムラプス撮影のための機能を提供しますcapture_continuous()次のプログラムでそれを使用する方法を示してみましょう。

camera = PiCamera()
camera.start_preview()
sleep(2)
for filename in camera.capture_continuous('img{counter:03d}.png'):
        print('Captured %s' % filename)
        sleep(1)

前のコードでは、capture_continuous()関数は Pi カメラ ボードを RPi に接続することによってタイムラプス写真を記録します。crontabこうすることで、スクリプトをプログラムでより適切に制御できるため、スクリプトを継続的に呼び出すツールに依存する必要がなくなります。

start_recording()次のように、wait_recording()およびstop_recording()関数を使用してビデオを録画できます。

import picamera
camera = picamera.PiCamera()
camera.resolution = (320, 240)
camera.start_recording('my_video.h264')
camera.wait_recording(5)
camera.stop_recording()

以下に示すように、画像にテキストを追加できます。

from time import sleep
from picamera import PiCamera
camera = PiCamera()
camera.resolution = (1024, 768)
camera.start_preview()
camera.annotate_text = 'Hello World!'
sleep(2)
camera.capture('test.png')

次のように、画像を 3 次元の NumPy 配列に保存できます。

import time, picamera
import numpy as np
with picamera.PiCamera() as camera:
        camera.resolution = (320, 240)
        camera.framerate = 24
        time.sleep(2)
        output = np.empty((240, 320, 3), dtype=np.uint8)
        camera.capture(output, 'rgb')
        print(type(output))

キャプチャした画像をOpenCV 画像形式 ( BGR ) と互換性のある NumPy 配列に保存することもできます。

import time, picamera
import numpy as np
with picamera.PiCamera() as camera:
 camera.resolution = (320, 240)
 camera.framerate = 24
 time.sleep(2)
 image = np.empty((240 * 320 * 3, ), dtype=np.uint8)
 camera.capture(image, 'bgr')
 image = image.reshape((240, 320, 3))
 print(type(image))

これにより、イメージが OpenCV の推奨BGR形式で保存されます。cv2.imshow()関数を使用してこの画像を表示できます。

RPi カメラ モジュールと Python 3 を使用してビデオを録画する

RPi に接続された USB ウェブカメラと Python 3 と OpenCV の組み合わせを使用してビデオを録画する方法を学習しました。同じコードが RPi カメラ モジュールでも機能することに気付きました。コードを RPi カメラ モジュールで動作させ、コードを使用してビデオを記録するには、RPi カメラ モジュールを RPi に接続し、USB ウェブカメラを切断するだけです。ぜひ試してみてください。

要約する

この章では、画像とビデオを処理する方法を学びました。また、USB ウェブカメラと RPi カメラボードを使用して画像をキャプチャする方法も学びました。また、GUI の基礎と OpenCV が提供するイベント処理関数についても学びました。私たちは、Shell および Python 3 プログラミングに関して豊富な実践経験を積んできました。この本では、ここで学んだ画像とビデオの取得および処理テクニックを使用します。

次の章では、画像処理の基礎と、NumPy と OpenCV.s を使用したプログラムの作成方法を学びます。

5. 画像処理の基礎

前の章では、画像処理やコンピューター ビジョン アプリケーション用に画像やビデオをキャプチャするさまざまな方法について学び、デモンストレーションしました。コマンド プロンプトと Python 3 プログラミングを広範囲に活用して、画像を読み取り、USB Web カメラや Raspberry Pi カメラ モジュールと接続する方法を学びました。

この章では、NumPy、OpenCV、およびMatplotlibを使用して画像に対して基本的な算術演算および論理演算を実行する方法を見ていきますさまざまなカラー チャネルと画像のプロパティについても詳しく見ていきます。

以下は、この章で説明するトピックのリストです。

  • 画像プロパティの取得
  • 画像の基本操作
  • 画像の算術演算
  • 画像のブレンドとトランジション
  • 画像に定数を乗算する
  • ネガイメージの作成
  • 画像に対するビット単位の論理演算

この章には、Python 3 を使用したプログラミングに関する実践的な演習が多数含まれています。この章でイメージ操作を説明する際には、前の章で学んだディスクからのイメージの読み取りや視覚化などの多くの概念を使用します。

スキル要件

この章のコード ファイルはGitHubにあります

このページの「動作中のコード」を確認するには、以下のビデオをご覧ください。

画像プロパティの取得

NumPy を使用すると、バイト データ型、画像の寸法、形状、サイズなどの多くのプロパティを取得して使用できます。コマンド プロンプトでコマンドを実行して、python3Python 3 インタープリターを開きます。次に、次のステートメントを順番に実行します。

>>> import cv2
>>> img = cv2.imread('/home/pi/book/dataset/4.1.01.tiff', 0)
>>> print(type(img))

これらのステートメントの出力は次のとおりです。

<class 'numpy.ndarray'>

前の出力は、OpenCVimread()関数がイメージを読み取り、NumPyndarray形式で保存したことを確認します。次のステートメントは、読み取ったイメージのサイズを出力します。

>>> print(img.ndim)
2

画像はグレースケール モードで読み取られるため、2D 画像になります。グレースケール強度で構成されるチャネルが 1 つだけあります。それでは、その形状を見てみましょう。

>>> print(img.shape)
(256, 256)

前のステートメントは、高さと幅をピクセル単位で出力します。画像のサイズを見てみましょう。

>>> print(img.size)
65536

画像の高さと幅も乗算すると、前の数値が得られます。ndarrayNumPyのデータ型を見てみましょう。

>>> print(img.dtype)
uint8

これは、ピクセルのグレー強度値を格納するために使用される 8 ビットの符号なし整数です。強度はから0まで255変化します。これは、8 ビット符号なしデータ型の制限です。各ピクセルは数バイトのメモリを消費します。次のように、合計で消費するバイト数を調べる方法を見てみましょう。

>>> print(img.nbytes)
65536

次に、カラー画像でも同じ練習を繰り返してみましょう。これを行うには、同じ画像をカラー モードで読み取ってみましょう。

>>> img = cv2.imread('/home/pi/book/dataset/4.1.01.tiff', 1)
>>> print(type(img))

これの出力は次のとおりです。

<class 'numpy.ndarray'>

次元数を確認してみましょう。

>>> print(img.ndim)
3

画像をカラー モードで読み取りました。これは 3D NumPy ですndarray2 つの次元のうち 1 つは高さと幅を表し、もう 1 つはカラー チャネルを表します。形状を確認してみましょう。

>>> print(img.shape)
(256, 256, 3)

最初の 2 つの値は、幅と高さをピクセル単位で表します。最後の値はチャネル数を表します。これらのチャネルは、ピクセルの青、緑、赤の強度値を表します。画像のサイズを見てみましょう。

>>> print(img.size)
196608

256前の出力 ( 、256、 )の 3 つの数値すべてを乗算すると3、 が得られます19,6608ndarrayのデータ型は同じ(uint8)となります。確認しましょう:

>>> print(img.dtype)
uint8

画像がメイン メモリ内で何バイトを占めるかを見てみましょう。

>>> print(img.nbytes)
196608

次のセクションでは、画像に対する基本的な操作を学習します。

画像の基本操作

カラー画像のチャネルの分割と結合、画像への境界線の追加などの基本的な操作を実行してみましょう。このデモンストレーションはインタラクティブ モードで続行します。次のように OpenCV をインポートしてカラー画像を読み込みましょう。

>>> import cv2
>>> img = cv2.imread('/home/pi/book/dataset/4.1.01.tiff', 1)

どの画像でも、原点 ((0, 0)ピクセル) は左上隅のピクセルです。次のステートメントを実行すると、すべてのチャネルの強度値を取得できます。

>>> print(img[10, 10])
[34 38 44]

これらはそれぞれ、ピクセル ( )10, 10の青、緑、赤チャネルの強度値です。単一チャネルのピクセルのみにアクセスしたい場合は、次のステートメントを実行します。

>>> print(img[10, 10, 0])
34

前の出力は34青チャンネルの強度です。同様に、緑と赤のチャネルには、それぞれ と を介してアクセスできimg[10, 10, 0]ますimg[10, 10, 0]

画像をチャンネルに分割する

画像をコンポーネント チャネルに分割する簡単なプログラムを作成してみましょう。これを行うにはいくつかの方法があります。OpenCV はsplit()これを行うための関数を提供します。この例を見てみましょう:

>>> import cv2
>>> img = cv2.imread('/home/pi/book/dataset/4.1.01.tiff', 1)
>>> b, g, r = cv2.split(img)

前のリストの最後のステートメントは、カラー イメージをコンポーネント チャネルに分割します。次のように、 NumPyndarrayインデックスを使用してチャネルをより速く分離することもできます。

>>> b = img[:, :, 0]
>>> g = img[:, :, 1]
>>> r = img[:, :, 2]

split()function は、以前の NumPy インデックス作成メソッドよりも (計算的に) 多少高価です。次のようにチャネルをマージすることもできます。

>>> img1 = cv2.merge((b, g, r))

前のコードは、すべてのコンポーネント チャネルをマージして、元のイメージを形成します。Python 3 スクリプト ファイルを作成し、これまでのコードをすべて追加し、cv2.imshow()関数を使用してイメージを視覚化することもできます。

次に、画像に枠線を追加する方法を学びます。

画像に枠線を追加する

copyMakeBorder()関数を使用して画像に境界線を追加できます。次のパラメータを受け入れます。

  • src:画像

  • topbottomleftright: ピクセル単位で表される境界線の幅

  • borderType:枠線の種類。次のタイプのいずれかになります。

    a)cv2.BORDER_REFLECT

    b)cv2.BORDER_REFLECT_101またはcv2.BORDER_DEFAULT

    c)cv2.BORDER_REPLICATE

    d)cv2.BORDER_WRAP

    e) cv2.BORDER_CONSTANT: 一定色の境界線を追加します。枠線の色の値は以下のパラメータです。

  • value:枠線タイプが のcv2.BORDER_CONSTANT場合の

画像の境界線の例をいくつか見てみましょう。次のプログラムを考えてみましょう。

import cv2
img = cv2.imread('/home/pi/book/dataset/4.1.01.tiff', 1)
b1 = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_WRAP)
b2 = cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_CONSTANT, value=[255, 0, 0])
cv2.imshow('Wrap', b1)
cv2.imshow('Constant', b2)
cv2.waitKey(0)
cv2.destroyAllWindows()

前のコードの出力は次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-XtFVmlcO-1681873103284)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_05_01.jpg)]

図 5.1 – 境界のデモンストレーション

他の境界線オプションを試してみることもできます。次のコードは、コピーされたスタイルの境界線を作成します。

cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_REPLICATE)

次のコードは、別のコピー スタイルの境界線を作成します。

cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_REFLECT)
cv2.copyMakeBorder(img, 10, 10, 10, 10, cv2.BORDER_REFLECT_101)

このようにして、画像のさまざまな種類の境界線を作成します。次のセクションでは、画像に対する算術演算の実行について見ていきます。

画像の算術演算

画像が NumPy にほかならないことはわかっておりndarray、 で行うのと同じように画像に対して算術演算を実行できますndarray数値演算または算術演算を行列に適用する方法を知っていれば、これらの演算のオペランドがイメージである場合に同じ演算を問題なく実行できます。画像に対して算術演算を実行するには、画像のサイズとチャネル数が同じである必要があり、これらの演算は個々のピクセルに対して実行されます。足し算や引き算などの算術演算がたくさんあります。まずは加算演算です。次のようにOpenCV のNumPy 追加または関数を使用して 2 つのイメージを追加できます。add()

import cv2
img1 = cv2.imread('/home/pi/book/dataset/4.2.03.tiff', 1)
img2 = cv2.imread('/home/pi/book/dataset/4.2.05.tiff', 1)
cv2.imshow('NumPy Addition', img1 + img2 )
cv2.imshow('OpenCV Addition', cv2.add(img1, img2))
cv2.waitKey(0)
cv2.destroyAllWindows()

上記のコードの出力は次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-9pEaE9MU-1681873103284)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_05_02.jpg)]

図 5.2 – OpenCV と NumPy を使用した追加

出力に表示される 2 つのイメージの違いがはっきりとわかります。その理由は、OpenCV のadd()関数が飽和演算であるのに対し、NumPy の加算演算子はモジュラー演算であるためです。これが何を意味するか詳しく見てみましょう。Python 3 を対話的に開き、次のステートメントを実行します。

>>> import numpy as np
>>> import cv2
>>> a = np.array([240], np.uint8)
>>> b = np.array([20], np.uint8)
>>> a + b
array([4], dtype=uint8)

uint8保存できる最大値は であることがわかっています255それ255を超える値はすべて除算され256、剰余がuint8データ型に格納されます。

>>> cv2.add(a, b)
array([[255]], dtype=uint8)

前のコードでわかるように、 の場合、の値をデータ型に設定するcv2.add()だけです。255255 uint8

同様に、NumPy 減算と計算減算も使用できますcv2.subtract()以下に例を示します。

import cv2
img1 = cv2.imread('/home/pi/book/dataset/4.2.03.tiff', 1)
img2 = cv2.imread('/home/pi/book/dataset/4.2.05.tiff', 1)
cv2.imshow('NumPy Subtract', img1 - img2)
cv2.imshow('OpenCV Subtract', cv2.subtract(img1, img2))
cv2.waitKey(0)
cv2.destroyAllWindows()

上記のコードの結果は次のようになります。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-jNVXJY6V-1681873103284)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_05_03.jpg)]

図 5.3 – NumPy と OpenCV による減算

次のように、NumPy を使用した減算と対話モードで OpenCV を使用した減算の違いを理解する演習を試してみましょう。

>>> import cv2
>>> import numpy as np
>>> a = np.array([240], np.uint8)
>>> b = np.array([20], np.uint8)
>>> b - a
array([36], dtype=uint8)

uint8保存できる最小の数値は であることがわかっています0数値が負の場合、NumPy はuint8データ型を次のように追加します256

>>> cv2.subtract(b, a)
array([[0]], dtype=uint8)

示されているように、データ型cv2.subtract()の場合、負の値は に丸められるだけですuint80

知らせ:

減算演算は可換ではないことがわかっています。これは、a – bほとんどの場合等しくないことを意味しますb – aしたがって、両方の画像のサイズとタイプが同じである場合、 とcv2.subtract(img1, img2)cv2.subtract(img2, img1)異なる結果を生成します。ただし、加算演算は可換です。cv2.add(img1, img2)したがってcv2.add(img2, img1)常に同じ結果が生成されます。

画像のブレンドとトランジション

cv2.addWeighted()この関数は、引数として渡した 2 つの画像の加重合計を計算します。これにより、それらが融合します。この混合の概念を示すコードを次に示します。

import cv2
img1 = cv2.imread('/home/pi/book/dataset/4.2.03.tiff', 1)
img2 = cv2.imread('/home/pi/book/dataset/4.2.05.tiff', 1)
cv2.imshow('Blended Image',
           cv2.addWeighted(img1, 0.5, img2, 0.5, 0))
cv2.waitKey(0)
cv2.destroyAllWindows()

前のコードでは、次の 5 つのパラメーターを OpenCVcv2.addWeighted()関数に渡しました。

  • img1: 最初の写真
  • alpha: 最初の画像の係数 (前の例の場合0.5)
  • img2:2枚目の写真
  • beta: 2 番目の画像の係数 (前の例の場合0.5)
  • gamma: スカラー値 (前の例の場合0)

OpenCV は、次の式を使用して出力イメージを計算します。

输出图像 = (alpha * img1) + (beta * img2) + gamma

この式を使用して出力イメージの各ピクセルを計算すると、前のコードの出力が次のようになります。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-C5VDNJtN-1681873103285)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_05_04.jpg)]

図 5.4 – 画像の融合

同じ OpenCV 機能を使用して、トランジション効果 (映画やビデオ編集ソフトウェアで見られる) を作成できます。次のコード例は、ある画像から別の画像への非常にスムーズな移行を作成します。

import cv2
import time
import numpy as np
img1 = cv2.imread('/home/pi/book/dataset/4.2.03.tiff', 1)
img2 = cv2.imread('/home/pi/book/dataset/4.2.05.tiff', 1)
for i in np.linspace(0, 1, 100):
    alpha = i
    beta = 1-alpha
    print('ALPHA =' + str(alpha) + ' BETA =' + str(beta))
    cv2.imshow('Image Transition',
    cv2.addWeighted(img1, alpha, img2, beta, 0))
    time.sleep(0.05)
    if cv2.waitKey(1) == 27 :
        break
cv2.destroyAllWindows()

前のコードの出力により、トランジション効果が作成されます。

次のような追跡バーを備えた素敵なアプリを作成することもできます。

import cv2
import time
import numpy as np
def emptyFunction():
    pass
img1 = cv2.imread('/home/pi/book/dataset/4.2.03.tiff', 1)
img2 = cv2.imread('/home/pi/book/dataset/4.2.05.tiff', 1)
output = cv2.addWeighted(img1, 0.5, img2, 0.5, 0)
windowName = "Transition Demo"
cv2.namedWindow(windowName)
cv2.createTrackbar('Alpha', windowName, 0,
                   1000, emptyFunction)
while(True):
    cv2.imshow(windowName, output)
    if cv2.waitKey(1) == 27:
        break
    alpha = cv2.getTrackbarPos('Alpha', windowName) / 1000
    beta = 1 - alpha
    output = cv2.addWeighted(img1, alpha, img2, beta, 0)
    print(alpha, beta)
cv2.destroyAllWindows()

前のコードの出力により、優れた移行アプリケーションが作成されます。次のように、プルアップ構成で 2 つのボタンを Raspberry Pi の GPIO に接続することもできます。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-WZyinCfq-1681873103285)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_05_05.jpg)]

図 5.5 – 押しボタンを備えた回路

次のコードを記述して、ボタンを画像変換機能と統合できます。

import time
import RPi.GPIO as GPIO
import cv2
alpha = 0
img1 = cv2.imread('/home/pi/book/dataset/4.2.03.tiff', 1)
img2 = cv2.imread('/home/pi/book/dataset/4.2.05.tiff', 1)
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
button1 = 7
button2 = 11
GPIO.setup(button1, GPIO.IN, GPIO.PUD_UP)
GPIO.setup(button2, GPIO.IN, GPIO.PUD_UP)
while True:
    button1_state = GPIO.input(button1)
    if button1_state == GPIO.LOW and alpha < 1:
        alpha = alpha + 0.2
    button2_state = GPIO.input(button2)
    if button2_state == GPIO.LOW:
        if (alpha > 0):
            alpha = alpha - 0.2
    if (alpha < 0):
        alpha = 0
    beta = 1 - alpha
    output = cv2.addWeighted(img1, alpha, img2, beta, 0)
    cv2.imshow('Transition App', output)
    if cv2.waitKey(1) == 27:
        break
    time.sleep(0.5)
    print(alpha)
cv2.destroyAllWindows()

ボタンが押されると、前のコードはalpha変数の値と画像のブレンド率を変更します。前のプログラムを実行し、ボタンを押して動作を確認します。この本では、前述の回路とプログラムを多くのプログラムのテンプレートとして使用します。

次のセクションでは、画像を相互に乗算し、定数を乗算する方法を見ていきます。

画像に定数を乗算します

通常の行列や NumPy と同様にndarray、画像に定数を乗算したり、画像同士を乗算したりすることができます。次のように画像に定数を乗算できます。

import cv2
img1 = cv2.imread('/home/pi/book/dataset/4.2.03.tiff', 1)
img2 = cv2.imread('/home/pi/book/dataset/4.2.05.tiff', 1)
cv2.imshow('Image1', img1 * 2)
cv2.waitKey(0)
cv2.destroyAllWindows()

前のコードでは、画像を表すndarray各要素2に が乗算されていました。前のプログラムを実行し、出力を確認します。次のように画像を相互に乗算することもできます。

cv2.imshow('Image1', img1 * 2)

結果はノイズのように見える場合があります。

ネガイメージの作成

純粋な数学の観点から言えば、画像の色を反転すると、画像のネガが作成されます。この反転演算は、ピクセルの色を255ピクセルから。カラー画像の場合は、すべてのプレーンの色を反転します。グレースケール イメージの場合、次のように、それを差し引くこと255で。

import cv2
img = cv2.imread('/home/pi/book/dataset/4.2.07.tiff', 0)
negative = abs(255 - img)
cv2.imshow('Grayscale', img)
cv2.imshow('Negative', negative)
cv2.waitKey(0)
cv2.destroyAllWindows()

出力は次のとおりです。

[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムが存在する可能性があります。画像を保存して直接アップロードすることをお勧めします (img-xroPDpOj-1681873103286)(https://gitcode.net/apachecn/apachecn-cv) -zh/-/raw /master/docs/raspi-cv-prog/img/B16208_05_06.jpg)]

図 5.6 – 画像のネガ

カラー画像のネガを見つけてみましょう。前のプログラムでカラー モードで画像を読み取るだけで済みます。

知らせ:

ネガのネガは元のグレースケール画像になります。カラー画像とグレースケール画像のネガのネガを再度計算することで、一度自分で計算できます。

画像に対してビット単位の論理演算を実行する

OpenCV ライブラリには、画像に対するビット単位の論理演算を計算するための関数が多数あります。ビット単位の論理和、 OR 排他的OR ( XOR )、NOT (逆) 演算を計算できますこれらの関数がどのように動作するかを示す最良の方法は、バイナリ (白黒) イメージで関数を使用することです。

import cv2
import numpy as np
import matplotlib.pyplot as plt
a = [0, 255, 0]
img1 = np.array([a, a, a], dtype=np.uint8)
img2 = np.transpose(img1)
not_out = cv2.bitwise_not(img1 )
and_out = cv2.bitwise_and(img1, img2)
or_out = cv2.bitwise_or(img1, img2)
xor_out = cv2.bitwise_xor(img1, img2)
titles = ['Image 1', 'Image 2', 'Image 1 NOT', 'AND', 'OR', 'XOR']
images = [img1, img2, not_out, and_out, or_out, xor_out]
for i in range(6):
        plt.subplot(2, 3, i+1)
        plt.imshow(images[i], cmap='gray')
        plt.title(titles[i])
        plt.axis('off')
plt.show()

ビットごとの論理NOTANDORXOR演算の機能をそれぞれわかりやすく示すために、独自のカスタム バイナリ イメージを作成しました。Matplotlibライブラリ関数を使用して、plt.subplot()複数の画像を同時に視覚化します。

在前面的示例中,我们创建了一个两行三列的网格,以显示原始输入图像和使用 OpenCV 函数的按位逻辑运算的计算输出。 每个图像显示在网格的一部分中。 第一个位置在左上角,第二个位置与左上角相邻,依此类推。 我们可以更改行并将其设置为plt.subplot(3, 2, i + 1),以创建一个三行两列的网格。 本书稍后还将使用这种技术。 我们将使用它在单个输出窗口中并排显示图像。

我们也可以不循环使用plt.subplot()函数。 对于每个图像,我们必须在下面的语句集中编写。 我正在为一个图像编写代码块。 为其他图像写相同的内容:

plt.subplot(2, 3, 1)
plt.imshow(img1, cmap='gray')
plt.title('Image 1')
plt.axis('off')

最后,我们使用plt.show()函数的调用在屏幕上显示所有内容。 我们使用这种技术来显示两个或三个图像。 如果我们有更多的图像,则可以使用循环技术在同一输出窗口中显示多个图像。 以下是我们的输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7VZiWEPF-1681873103286)(https://gitcode.net/apachecn/apachecn-cv-zh/-/raw/master/docs/raspi-cv-prog/img/B16208_05_07.jpg)]

图 5.7 –图像上的逻辑操作

您可能想要为灰度和彩色图像上的按位逻辑操作实现代码。

注意:

通过使用 NumPy 的逻辑运算,我们也可以达到相同的结果。

总结

在本章中,我们首先介绍使用 OpenCV 和 NumPy 进行图像处理。 我们了解了一些重要概念,例如图像通道,算术和逻辑运算以及图像的负片。 在此过程中,我们还学会了在 Python 3 和 NumPy 库中使用更多功能。 我们今天学习的按位逻辑运算在下一章中编写用于按颜色进行对象跟踪功能的程序时将非常有用。

在下一章中,我们将研究色彩空间,变换和阈值图像。

Guess you like

Origin blog.csdn.net/wizardforcel/article/details/130239267