【貂蝉がプログラミングを学ぶ】OpenMV Camリアルタイム撮影用MicroPythonマニュアル

ここに画像の説明を挿入します
MicroPython は、組み込みシステムで Python 3 プログラミング言語を実行するために設計されたインタープリターの軽量バージョンです。通常の Python と比較して、MicroPython インタープリターは小さく (わずか約 100 KB)、バイナリの実行可能ファイルにコンパイルされて実行されるため、実行効率が高くなります。軽量のガベージ コレクション メカニズムを使用し、リソースに制約のあるマイクロコントローラーに対応するために Python 標準ライブラリの大部分を削除します。

MicroPython の主な機能は次のとおりです。
1. 構文と関数は標準の Python と互換性があるため、学習と使用が簡単です。Python のほとんどのコア構文をサポートします。
2. ハードウェアに直接アクセスして制御し、Arduino のように GPIO、I2C、SPI などを制御します。
3.ファイルシステム、ネットワーク、グラフィカルインターフェースおよびその他の機能を提供する強力なモジュールシステム。
4. クロスコンパイルをサポートし、インタプリタよりも 10 ~ 100 倍高速な効率的なネイティブ コードを生成します。
5. コード量が少なくメモリ使用量も少ないため、メモリの少ない MCU や開発ボードでの実行に適しています。
6. オープンソースライセンス、無料で使用できます。シェルの対話型環境は、開発とテストに便利です。
7. 内蔵 I/O ドライバーは、ESP8266、ESP32、STM32、micro:bit、コントロール ボード、PyBoard などの多数のマイクロコントローラー プラットフォームをサポートします。活発なコミュニティがあります。

MicroPython アプリケーション シナリオには次のものが含まれます。
1. 組み込み製品のプロトタイプとユーザー インタラクションを迅速に構築します。
2. 小さなプログラム可能なハードウェア プロジェクトをいくつか作成します。
3. 教育ツールとして、初心者が Python や IoT プログラミングを学ぶのに役立ちます。
4. スマート デバイスのファームウェアを構築して、高度な制御とクラウド接続を実現します。
5. モノのインターネット、組み込みインテリジェンス、ロボットなどのさまざまなマイクロコントローラー アプリケーション

MicroPython を使用する際の注意事項:
1. メモリとフラッシュのスペースには限りがあります。
2. 説明や実行効率はC言語に劣ります。
3. ライブラリ機能の一部が標準版と異なります。
4. プラットフォームに合わせて構文を最適化し、標準の Python との相違点を修正します。
5. メモリ リソースを合理的に使用し、大きなメモリ ブロックを頻繁に割り当てることを避けます。
6. ネイティブ コードを使用して、速度が重要な部分のパフォーマンスを向上させます。
7. 抽象化を適切に使用して、基礎となるハードウェア操作をカプセル化します。

一般に、MicroPython は Python をマイクロコントローラーの分野に導入します。これは、プログラミングの敷居を下げるだけでなく、優れたハードウェア制御機能も提供する重要な革新です。さまざまなタイプのモノのインターネットやインテリジェント ハードウェアの開発に非常に適しています。
ここに画像の説明を挿入します
OpenMV Cam は、現実世界でマシン ビジョンを使用するアプリケーションを簡単に実装できる小型、低電力のマイクロコントローラー ボードです。C/C++ の代わりに、高レベルの Python スクリプト (MicroPython OS によって提供される) を使用して OpenMV Cam をプログラミングできます。OpenMV Cam の技術パラメータには次の側面が含まれます。

1. プロセッサ: OpenMV Cam H7 Plus は、480 MHz で動作する STM32H743II ARM Cortex M7 プロセッサを使用し、32 MB SDRAM + 1 MB SRAM および 32 MB 外部フラッシュ メモリ + 2 MB 内部フラッシュ メモリを搭載します。OpenMV Cam M4 V2 は、256KB RAM と 1 MB フラッシュ メモリを備え、180 MHz で動作する STM32F427VG ARM Cortex M4 プロセッサを使用します。
2. イメージ センサー: OpenMV Cam H7 Plus と OpenMV Cam M4 V2 はどちらも OV7725 イメージ センサーを使用しており、320x240 より高い解像度で 75 FPS で 320x240 8 ビット グレースケール画像または 320x240 16 ビット RGB565 画像をキャプチャできます。 320x240 で 150 FPS。
3. I/O インターフェイス: OpenMV Cam H7 Plus と OpenMV Cam M4 V2 はどちらも次の I/O インターフェイスを備えています:
(1) フルスピード USB (12Mbs) インターフェイス、コンピューターに接続。OpenMV Cam が接続されると、仮想 COM ポートと「USB フラッシュ ドライブ」がコンピュータ上に表示されます。
(2) μSD カード スロットは 100Mbs の読み取り/書き込みが可能で、OpenMV Cam でビデオを録画し、μSD カードからマシン ビジョン素材を抽出できます。
(3) SPI バスは最大 54Mbs の速度で動作するため、画像ストリーム データを LCD 拡張ボード、WiFi 拡張ボード、またはその他のコントローラに簡単に送信できます。
(4) 他のコントローラーまたはセンサーとの接続用の I2C バス (最大 1Mb/s)、CAN バス (最大 1Mb/s)、および非同期シリアル バス (TX/RX、最大 7.5Mb/s)。
(5) 12 ビット ADC および 12 ビット DAC。
(6) すべての I/O ピンに割り込みと PWM があります (ボード上には 9 または 10 の I/O ピンがあります)。
4. LED: OpenMV Cam H7 Plus と OpenMV Cam M4 V2 の両方に、1 つの RGB LED (3 色) と 2 つの明るい 850nm IR LED (赤外線) が装備されています。
5. レンズ: OpenMV Cam H7 Plus と OpenMV Cam M4 V2 には、標準の M12 レンズ インターフェイスとデフォルトの 2.8 mm レンズが装備されています。OpenMV Cam でよりプロフェッショナルなレンズを使用したい場合は、簡単に購入して自分で取り付けることができます。

ここに画像の説明を挿入します
MicroPython の OpenMV Cam は、MicroPython コードを記述することでリアルタイムに画像やビデオをキャプチャできるリアルタイム撮影機能をサポートしています。

主な特徴:

高速なリアルタイム パフォーマンス: OpenMV Cam は高いリアルタイム パフォーマンスを備えており、画像やビデオをリアルタイムでキャプチャできます。安定したフレームレートで画像を取得・処理できる高性能画像プロセッサーとセンサーを搭載し、リアルタイム撮影が可能です。

複数の解像度と形式: OpenMV Cam は、複数の解像度と画像形式でのリアルタイム撮影をサポートしています。アプリケーションのニーズに応じて適切な解像度とフォーマットを選択し、さまざまなシナリオでの撮影要件を満たすことができます。

柔軟な画像処理: OpenMV Cam には、フィルタリング、エッジ検出、色認識、その他の機能を含む、豊富な画像処理機能とアルゴリズムが組み込まれています。これにより、リアルタイム撮影が単なる画像キャプチャを超えて、リアルタイムの画像処理と分析が可能になります。

開発の簡素化: MicroPython プログラミング言語は習得が簡単で、初心者や教育分野に適しています。OpenMV Cam は、使いやすいプログラミング インターフェイスとサンプル コードを提供し、リアルタイム撮影機能の開発とデバッグをより簡単かつ便利にします。

アプリケーションシナリオ:

視覚的な監視と追跡: OpenMV Cam のリアルタイム撮影機能は、視覚的な監視と追跡システムに適用できます。たとえば、ドローンの視覚ナビゲーションに使用でき、周囲環境の画像をリアルタイムでキャプチャし、リアルタイムの分析と処理を実行して、正確な位置決めと障害物回避を実現できます。

教育および科学研究: リアルタイム撮影機能は教育および科学研究プロジェクトに使用できます。学生や研究者は、OpenMV Cam を使用して、リアルタイムの画像取得と処理に関する実験や研究を行い、コンピューター ビジョン、画像処理、その他の関連分野の知識を探索できます。

ビデオ監視: OpenMV Cam は、屋内セキュリティ システムや産業生産ライン監視などのリアルタイム ビデオ監視システムで使用できます。リアルタイムの撮影と分析により、異常な状況を時間内に発見し、対応する措置を講じることができます。

注意すべき点:

ストレージ: ライブ キャプチャ機能では、キャプチャした画像やビデオを保存するために大量のストレージ スペースが必要になる場合があります。OpenMV Cam をライブ撮影に使用する場合は、データを保存するのに十分なストレージ容量を確保するか、外部ストレージ デバイスを使用して拡張する必要があります。

電源: リアルタイム撮影機能では、特に長時間または連続撮影する場合、電源に対する要件が高くなります。OpenMV Camをリアルタイム撮影に使用する場合、バッテリー不足や停電による問題を避けるために、安定した電源供給を確保する必要があります。

処理パフォーマンス: 画像をリアルタイムでキャプチャして処理するには、特定のコンピューティング リソースが必要になる場合があります。リアルタイム撮影を実行する場合、OpenMV Cam の処理パフォーマンスを評価して、必要なリアルタイム処理要件を満たしていることを確認する必要があります。

以上をまとめると、MicroPython の OpenMV Cam のリアルタイム撮影機能は、高速なリアルタイム性能、柔軟な画像処理、開発の簡素化という特徴を持っています。視覚的な監視と追跡、教育と科学研究、ビデオ監視などのシナリオに適しています。使用する場合は、ストレージ容量、電源、処理パフォーマンスなどの要素に注意し、特定のニーズやシナリオに応じてパラメーターを構成および最適化する必要があります。

事例 1: 簡単なリアルタイム撮影プログラム

import sensor, image, time  
  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待摄像头稳定  
  
while(True):  
    img = sensor.snapshot() # 拍摄照片  
    print(img) # 打印照片

重要なポイントの解釈:
カメラを初期化し、ピクセル形式とフレーム サイズを設定します。無限ループでは、snapshot() 関数を使用してリアルタイムで写真を撮影し、その写真を印刷します。

ケース 2: リアルタイムで撮影し、画像を液晶画面に表示する

import sensor, image, time, lcd  
  
lcd.init() # 初始化LCD屏幕  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待摄像头稳定  
  
while(True):  
    img = sensor.snapshot() # 拍摄照片  
    lcd.display(img) # 在LCD屏幕上显示图像

重要なポイントの解釈:
まず、LCD 画面とカメラを初期化し、ピクセル形式とフレーム サイズを設定します。無限ループでは、snapshot() 関数を使用してリアルタイムで写真が撮影され、display() 関数を使用して画像が LCD 画面に表示されます。

ケース 3: リアルタイムで顔を撮影して検出する

import sensor, image, time, facedetect  
  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待摄像头稳定  
face_cascade = facedetect.Cascade('haarcascade_frontalface_default.xml') # 加载人脸检测器  
  
while(True):  
    img = sensor.snapshot() # 拍摄照片  
    faces = face_cascade.find(img) # 检测人脸  
    if len(faces) > 0: # 如果检测到了人脸  
        for face in faces: # 在每个检测到的人脸周围绘制矩形框  
            img.draw_rectangle(face.rect(), color = (255, 0, 0), thickness = 2)  
    print(img) # 打印标记了人脸的照片

重要なポイントの解釈:
まずカメラを初期化し、ピクセル形式とフレーム サイズを設定します。顔検出器をロードします。ここでは、OpenCV が提供する Haar カスケード分類器が使用されます。無限ループでは、snapshot() 関数を使用してリアルタイムで写真を撮影し、find() 関数を使用して顔を検出します。顔が検出された場合は、検出された各顔の周囲に長方形のボックスを描画し、draw_rectangle() 関数を使用して長方形のボックスを描画します。最後に顔タグを付けた写真を印刷します。

ケース 4: カメラ映像のリアルタイム表示

import sensor, image, time

sensor.reset() # 初始化传感器
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为QVGA
sensor.skip_frames(time = 2000) # 等待2秒,让红外接收器稳定

while(True):
    img = sensor.snapshot() # 获取一帧图像
    lcd.display(img) # 在LCD上显示图像
    time.sleep_ms(30) # 每隔30毫秒更新一次LCD

重要なポイントの解釈: まず、センサー、画像、および時間モジュールをインポートします。次にセンサーを初期化し、ピクセルフォーマットとフレームサイズを設定します。次に、赤外線受信機が安定するまで 2 秒待ちます。while ループでは、1 フレームの画像が継続的に取得されて LCD に表示され、LCD は 30 ミリ秒ごとに更新されます。

ケース 5: リアルタイムで写真を撮り、SD カードに保存する

import sensor, image, time, os

sensor.reset() # 初始化传感器
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为QVGA
sensor.skip_frames(time = 2000) # 等待2秒,让红外接收器稳定

while(True):
    img = sensor.snapshot() # 获取一帧图像
    img.save("photo_{}.bmp".format(int(time.time()))) # 将图像保存为BMP格式
    time.sleep_ms(30) # 每隔30毫秒更新一次LCD
    os.system("ls /sd/") # 查看SD卡中的文件列表

重要なポイントの解釈: まず、センサー、画像、時間、および OS モジュールをインポートします。次にセンサーを初期化し、ピクセルフォーマットとフレームサイズを設定します。次に、赤外線受信機が安定するまで 2 秒待ちます。while ループでは、LCD を 30 ミリ秒ごとに更新し、SD カード内のファイル リストを表示しながら、画像のフレームを継続的に取得して BMP 形式の写真として保存します。

ケース 6: カメラ映像のリアルタイム表示とビデオの録画

import sensor, image, time, cv2

sensor.reset() # 初始化传感器
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为QVGA
sensor.skip_frames(time = 2000) # 等待2秒,让红外接收器稳定

fourcc = cv2.VideoWriter_fourcc(*'XVID') # 定义视频编码格式
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) # 创建视频写入对象

while(True):
    img = sensor.snapshot() # 获取一帧图像
    img.save("photo_{}.bmp".format(int(time.time()))) # 将图像保存为BMP格式
    time.sleep_ms(30) # 每隔30毫秒更新一次LCD
    ret, frame = cap.read() # 从摄像头读取一帧图像
    out.write(frame) # 将图像写入视频文件
    cv2.imshow('frame', frame) # 在窗口中显示图像
    if cv2.waitKey(1) & 0xFF == ord('q'): # 如果按下q键则退出程序
        break
out.release() # 释放视频写入对象
cv2.destroyAllWindows() # 关闭所有窗口

重要なポイントの解釈: まず、センサー、画像、時間、および cv2 モジュールをインポートします。次にセンサーを初期化し、ピクセルフォーマットとフレームサイズを設定します。次に、赤外線受信機が安定するまで 2 秒待ちます。while ループでは、LCD を 30 ミリ秒ごとに更新し、カメラから画像のフレームを読み取ってビデオ ファイルに書き込みながら、画像のフレームを継続的に取得して BMP 形式の写真として保存します。最後に、ウィンドウに画像が表示され、q キーを押すとプログラムが終了します。

ケース 7: カメラ画像のリアルタイム表示:

import sensor
import image
import lcd

lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)

while True:
    img = sensor.snapshot()
    lcd.display(img)

キーポイントの解釈:
このプログラムは、OpenMV Cam のセンサー モジュールと LCD モジュールを使用して、カメラ画像をリアルタイムで表示します。
lcd.init() を使用して LCD ディスプレイを初期化します。
sensor.reset() を使用してカメラセンサーをリセットします。
sensor.set_pixformat(sensor.RGB565) を使用して、画像のピクセル形式を RGB565 に設定します。
sensor.set_framesize(sensor.QVGA) を使用して、画像フレーム サイズを QVGA (320x240) に設定します。
sensor.run(1) を使用してカメラ画像のストリーミングを開始します。
無限ループで、プログラムに次の処理を継続させます
。sensor.snapshot() を使用してカメラ画像をキャプチャし、それを変数 img に保存します。
LCD ディスプレイに画像を表示するには、lcd.display(img) を使用します。

ケース 8: 画像内の顔をリアルタイムで検出して表示する:

import sensor
import image
import lcd
import time
import uos
from fpioa_manager import *

lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)

# 加载人脸检测模型
model_path = "/sd/models/face_detection/face_detection.kmodel"
fm.register(board_info.PIN9, fm.fpioa.GPIOHS0)
time.sleep(1)
lcd.clear()

try:
    face_detect = KPUClassify(model_path)
except Exception as e:
    print(e)

while True:
    img = sensor.snapshot()
    # 进行人脸检测
    faces = face_detect.detect(img)
    for face in faces:
        # 在图像上绘制人脸框
        img.draw_rectangle(face.rect(), color=(255, 0, 0))
    lcd.display(img)

キーポイントの解釈:
このプログラムは、OpenMV Cam のセンサー モジュール、LCD モジュール、KPU モジュールを使用して、画像内の顔をリアルタイムで検出して表示します。
lcd.init() を使用して LCD ディスプレイを初期化します。
sensor.reset() を使用してカメラセンサーをリセットします。
sensor.set_pixformat(sensor.RGB565) を使用して、画像のピクセル形式を RGB565 に設定します。
sensor.set_framesize(sensor.QVGA) を使用して、画像フレーム サイズを QVGA (320x240) に設定します。
sensor.run(1) を使用してカメラ画像のストリーミングを開始します。
Try-Except ブロックで、顔検出モデルを読み込みます (SD カード上のパスは /sd/models/face_detection/face_detection.kmodel です)。
無限ループで、プログラムに次の処理を継続させます
。sensor.snapshot() を使用してカメラ画像をキャプチャし、それを変数 img に保存します。
顔検出モデル face_detect を使用して画像上の顔を検出し、検出された顔を変数faceに保存します。
検出された顔ごとに、img.draw_rectangle(face.rect(), color=(255, 0, 0)) を使用して画像上に顔ボックスを赤色で描画します。
lcd.display(img) を使用して、顔枠付きの画像を LCD ディスプレイに表示します。

ケース 9: 画像フレーム レートのリアルタイム計算:

import sensor
import image
import time

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)

frame_count = 0
start_time = time.time()

while True:
    img = sensor.snapshot()
    frame_count += 1
    if frame_count % 100 == 0:
        current_time = time.time()
        elapsed_time = current_time - start_time
        fps = frame_count / elapsed_time
        print("FPS:", fps)

重要なポイントの解釈:
このプログラムは、OpenMV Cam のセンサー モジュールを使用して、画像のフレーム レートをリアルタイムで計算します。
sensor.reset() を使用してカメラセンサーをリセットします。
sensor.set_pixformat(sensor.RGB565) を使用して、画像のピクセル形式を RGB565 に設定します。
sensor.set_framesize(sensor.QVGA) を使用して、画像フレーム サイズを QVGA (320x240) に設定します。
sensor.run(1) を使用してカメラ画像のストリーミングを開始します。
フレーム数frame_countを0に初期化し、番組開始時刻start_timeを記録する。
無限ループで、プログラムに次の処理を継続させます
。sensor.snapshot() を使用してカメラ画像をキャプチャし、それを変数 img に保存します。

100 フレームがキャプチャされるたびに、次の操作を実行します。
現在の時刻 current_time を取得します。
現在の時刻からプログラムの開始時刻を引いた経過時間 elapsed_time を計算します。
フレーム レート fps を、フレーム数を経過時間で割ったものとして計算します。
print()を使用してフレームレートを出力します。

これらのサンプル コードは、MicroPython と OpenMV Cam を使用したライブ キャプチャの基本フレームワークを提供します。画像処理アルゴリズムの追加、他のセンサーやモジュールとの対話など、ニーズに応じてこれらのコードを変更および拡張できます。

上記の事例はアイデアを拡張するためのものであり、誤りや適用不可能な点が含まれる可能性があることに注意してください。ハードウェア プラットフォーム、使用シナリオ、MicroPython のバージョンが異なると、使用方法も異なる場合があります。実際のプログラミングでは、ハードウェア構成や特定のニーズに応じて調整し、実際のテストを複数回実施する必要があります。ハードウェアが正しく接続されていることを確認し、使用されるセンサーとデバイスの仕様と特性を理解することが重要です。

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/weixin_41659040/article/details/133578636