###### tags: `Raspberry Pi` `Raspbian` `C++` `OpenCV` `IoT` # **在Raspbian上利用OpenCV內建函式及Camera做人臉偵測** ## 硬體 ### 1. Raspberry Pi 3 ### 2. Raspberry Pi Camera Module V2 ![](https://i.imgur.com/ypVNgcf.jpg) --- ## **安裝Camera Module V2** **1. 拉開PI上的白色卡榫** ![](https://i.imgur.com/QNEQinI.jpg) **2. 把Camera Module V2放進去** ![](https://i.imgur.com/yRrOMJk.jpg) **3. 把白色卡榫壓回去就完成了** ![](https://i.imgur.com/xpqrzTg.jpg) **4. 進入Raspbian打開Terminal** + 更新 ``` sudo apt-get update sudo apt-get dist-upgrade -y reboot ``` + 打開Camera `sudo raspi-config` 選擇Enable Camera將Camera打開 ![](https://i.imgur.com/60XBrAi.jpg) + 使用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; } ``` --- ## 結果 ![](https://i.imgur.com/glvkKrH.png) ![](https://i.imgur.com/SZuovpP.png) --- ## 參考文章 對於detectMultiScale函式想了解可看: http://blog.sina.com.cn/s/blog_74b409aa0102vqrg.html