在Raspbian上利用OpenCV內建函式及Camera做人臉偵測

在Raspbian上利用OpenCV內建函式及Camera做人臉偵測

硬體

1. Raspberry Pi 3

2. Raspberry Pi Camera Module V2


安裝Camera Module V2

1. 拉開PI上的白色卡榫

2. 把Camera Module V2放進去

3. 把白色卡榫壓回去就完成了

4. 進入Raspbian打開Terminal

  • 更新

    1
    2
    3
    sudo apt-get update
    sudo apt-get dist-upgrade -y
    reboot
  • 打開Camera
    sudo raspi-config
    選擇Enable Camera將Camera打開

  • 使用Camera像webcam一樣
    sudo modprobe bcm2835-v4l2

  • 測試Camera是否正常
    預覽1秒(-t)
    raspistill -t 1000
    存成image.jpg(-o)-預設5秒後拍照
    raspistill -o image.jpg
    將格式編碼為png(-e)
    raspistill -o image.png -e png -w 640 -h 480


程式部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <string>

#include <opencv2/core/core_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

int main(){

Mat frame;
Mat grayFrame;
//選定視訊裝置,0為預設攝影機
VideoCapture capture(0);
//OPENCV人臉訓練資料
string cascadeName = "haarcascade_frontalface_default.xml";
CascadeClassifier face_cascade;
//確認有讀取檔案
if (!face_cascade.load(cascadeName)) {
cout << "Error loading cascade file" << endl;
}
//確認有找到攝影機
if(!capture.isOpened()){
cout<<"capture no loading"<<endl;
return -1;
}

while (true) {
//擷取視訊
capture.read(frame);
//確認有擷取到
if (frame.empty())
break;
//轉換成灰階
grayFrame = Mat(frame.size(), CV_8U);
cvtColor(frame, grayFrame, CV_BGR2GRAY);
//臉部偵測,會回傳得到的矩形區域
vector<Rect> face;
face_cascade.detectMultiScale(grayFrame, face, 1.1, 3, 0 | CV_HAAR_SCALE_IMAGE, cv::Size(10, 10));
//畫出臉部區域
for (size_t i = 0; i < face.size(); i++) {
cv::Point pt1(face[i].x + face[i].width, face[i].y + face[i].height);
cv::Point pt2(face[i].x, face[i].y);
rectangle(frame, pt1, pt2, Scalar(0, 0, 255), 2, 8, 0);
}
//顯示圖片
imshow("window", frame);
//waitKey(33)可以模擬每秒30個frame的效果
if (waitKey(33) >= 0){
break;
}
}
//釋放記憶體空間
capture.release();
return 0;
}

結果


參考文章

對於detectMultiScale函式想了解可看:
http://blog.sina.com.cn/s/blog_74b409aa0102vqrg.html

0%