過去に作成した簡易監視カメラの記録を残します。(自分用)
今は使えない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;
}