メインコンテンツに移動

GR-KAEDE 特設:カメラで動体検知をしてみよう!

概要

GR-KAEDE用のカメラモジュールを接続し、カメラの画像や動体検知のサンプルをご紹介します。WindowsとMacで利用可能です。なお、初めてお使いの方は「はじめてのKAEDE」を参照してください。


準備

ハードウェア

GR-KAEDE、カメラ搭載用シールド、カメラモジュールを以下のように接続します。他に、USBケーブル(Micro B)を準備してください。

ソフトウェア

DisplayAppをダウンロードして解凍してください。PCでカメラの画像を確認するためのアプリケーションです。

画像
GR-KAEDEカメラモジュール(オプション)
画像
usb-cable

カメラの画像をPCで表示する

以下のプログラムをGR-KAEDEに書き込んでください


#include <Arduino.h>
#include "Image.h"
 
Image image;
void setup(){
  Serial.begin(57600);
  image.begin();
 
}
void loop(){
  uint8_t headder_data[12] = {
    0xFF,0xFF,0xAA,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  };
 
  image.captureStart();
  while(!image.isCaptureFinished());
  image.createJpg();
  uint8_t* adr = image.getCreatedJpg();
  int32_t size = image.getCreatedJpgSize();
  headder_data[8] = (uint8_t)((int32_t)size >> 0);
  headder_data[9] = (uint8_t)((int32_t)size >> 8);
  headder_data[10] = (uint8_t)((int32_t)size >> 16);
  headder_data[11] = (uint8_t)((int32_t)size >> 24);
 
  for (int i = 0; i < sizeof(headder_data); i++){
    Serial.write(headder_data[i]);
  }
  for (int i = 0; i < size; i++){
    Serial.write(*adr);
    adr++;
  }
 
}

DisplayAppを起動すると、シリアルポートが表示されます。Windowsの場合はCOMxx、Macの場合は/dev/xxxがポート名として表示されますので、それをクリックしてください。カメラの画像がDisplayAppに表示されます。F1キーを押すと画像の転送レートが表示されます。

画像

動体検出サンプル

以下のプログラムをGR-KAEDEに書き込んでください。


#include <Arduino.h>
#include "Image.h"
 
Image image[3];
void setup(){
  Serial.begin(57600);
  image[0].begin();
 
}
void loop(){
  uint8_t headder_data[12] = {
    0xFF,0xFF,0xAA,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  };
  static int cnt = 0;
 
  while(cnt < 2){ //necessary at least two image in the past.
    image[cnt].captureStart();
    while(!image[cnt].isCaptureFinished());
    image[cnt].createGrayImage();
    cnt++;
  }
 
  image[cnt%3].captureStart();
  while(!image[cnt%3].isCaptureFinished());
  image[cnt%3].createGrayImage();
  // Moving detection
  if( 0 == image[cnt%3].movingDetection(image[(cnt-2)%3].getCreatedGrayImage(), image[(cnt-1)%3].getCreatedGrayImage())){
    //do nothing
  }
  image[cnt%3].createJpg();
  uint8_t* adr = image[cnt%3].getCreatedJpg();
  int32_t size = image[cnt%3].getCreatedJpgSize();
  headder_data[8] = (uint8_t)((int32_t)size >> 0);
  headder_data[9] = (uint8_t)((int32_t)size >> 8);
  headder_data[10] = (uint8_t)((int32_t)size >> 16);
  headder_data[11] = (uint8_t)((int32_t)size >> 24);
 
  for (int i = 0; i < sizeof(headder_data); i++){
    Serial.write(headder_data[i]);
  }
  for (int i = 0; i < size; i++){
    Serial.write(*adr);
    adr++;
  }
  cnt++;
 
}

DisplayAppで画像を表示してみましょう。今度は、動きのあった部分が赤くマーキングされていることが分かります。

本サンプルはGR-KAEDEのImageライブラリのmovingDetectionを使用して、動体検知を行っています。getMovingNumberで動体の数、getMovingAreaで動体の位置を確認することができますので、試してみてください。

画像