###### tags: `Raspberry Pi` `Raspbian` `C++` `OpenCV` `IoT`
# **在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**
+ 更新
```
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`
---
## 程式部分
```
#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