0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

過去に作ったラズパイとOpenCVを使った簡易監視カメラの記録を残します。

Posted at

過去に作成した簡易監視カメラの記録を残します。(自分用)
今は使えないLineNotifyを後で変更します。

#include <iostream>
#include <stdio.h>
#include <time.h> //時間に関すライブラリ
#include <opencv4/opencv2/opencv.hpp> //opencvのいろんなライブラリをincludeしてくれる
#include <stdlib.h> //シェルスクリプト実行に必要
#include <wiringPi.h> //GPIOの使用

#define RED_BTN_PIN 0
#define GREEN_BTN_PIN 2
#define RED_LED_PIN 7
#define BLUE_LED_PIN 1

//名前空間の省略
using namespace std;
using namespace cv;

int main (int argc, char **argv){

  wiringPiSetup();
  pinMode (RED_LED_PIN, OUTPUT);
  pinMode (RED_BTN_PIN, INPUT);
  pinMode (GREEN_BTN_PIN, INPUT);


  Mat frame;
  VideoCapture cap(0); //映像オブジェクト作成、カメラ起動

  //カメラの起動確認
  if(!cap.isOpened()){
    cerr << "ERROR! カメラが見つからない\n";
    return 0;
  }
  
  VideoWriter writer; //書き込み用オブジェクト作成

  int fourcc = VideoWriter::fourcc('m','p','4','v'); //フォーマット指定
  double fps = cap.get(CAP_PROP_FPS); //映像フレームレート取得
  int width = cap.get(CAP_PROP_FRAME_WIDTH);
  int hight = cap.get(CAP_PROP_FRAME_HEIGHT);

  CascadeClassifier cascade;
  cascade.load("/home/pi/opencv/data/haarcascades/haarcascade_frontalface_alt_tree.xml"); //正面顔情報のカスケードファイル読み込み
  vector<Rect> faces; //輪郭情報の格納場所

  int nowhour = 0;
  int nowmin = 0;


  while(1){
    time_t t = time(NULL); //時刻情報の取得
    struct tm *local = localtime(&t); //時刻情報を現地に変換
    int year = local->tm_year + 1900;
    int mon = local->tm_mon + 1;
    int day = local->tm_mday;
    int hour = local->tm_hour;
    int min = local->tm_min;

    //1時間毎に録画ファイルの切り替え
    if(nowhour != hour){
      if(writer.isOpened()){
        writer.release();
        digitalWrite(RED_LED_PIN, LOW); //赤ランプ消灯
      }
      char videoname[100];
      sprintf(videoname, "video/%d,%d,%d_%d:%d.mp4", year, mon, day, hour, min);
      writer.open(videoname, fourcc, fps, Size(width, hight), 1);
      digitalWrite(RED_LED_PIN, HIGH); //赤ランプ点灯
      nowhour = hour;
    }

    cap >> frame;//映像を1フレーム取得
    if(frame.empty()){
      cerr << "映像取得エラー\n";
      break;
    }

    //画像からfacesの情報をもとに顔を検知
    cascade.detectMultiScale(frame, faces, 1.1, 3, 0, Size(20 ,20));
    for(int i = 0; i < faces.size(); i++) {

      //検知した顔を赤線で囲む
      rectangle(frame, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), Scalar(0, 0, 255), 3);
    }

    //顔を認識したか判別
    if(faces.size()){
      digitalWrite(BLUE_LED_PIN, HIGH); //青ランプ点灯
      //LINE送ったら1分未満LINE送信停止
      if(nowmin != min){
        imwrite("linephoto/image.jpg", frame); //検知した写真を保存
        system("bash line.sh"); //保存した写真をLINEに送信
        nowmin = min;
      } 
    }else{
      digitalWrite(BLUE_LED_PIN, LOW); //青ランプ消灯
    }
    
    //imshow("Live", frame); //ディスプレイ表示
    writer << frame; //書き込み

    //緑ボタンを押したらラインに写真を送る
    if(digitalRead(GREEN_BTN_PIN) == true){
      imwrite("linephoto/image.jpg", frame); //検知した写真を保存
      system("bash line.sh"); //保存した写真をLINEに送信
    }

    //赤ボタンを押したらループから抜ける
    if(digitalRead(RED_BTN_PIN) == true){
      break;
    }
  }

  //書き込みファイルを閉じる
  writer.release();
  digitalWrite(RED_LED_PIN, LOW);

  system("bash poweroff.sh");

  return 0;
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?