[OpenCV] 實作拍照程式

先確認電腦有攝影機

務必確認你的電腦有內建攝影機或是外接攝影機

使用前也請確認沒有其他程式或軟體正在使用你的攝影機


打開電腦的攝影機

在 OpenCV 中想要打開攝影機只需要1 行程式就可以達成,如下:

1
2
/* 數字 0 代表的是你的攝影機編號 */
VideoCapture capture = VideoCapture(0);

如果你的電腦有兩部攝影機,則其編號分別為 0、1

建議多做個錯誤判斷,這樣編譯程式的時候就可以立即知道哪裡出錯

1
2
3
4
5
/* 假使攝影機開啟失敗則印出錯誤訊息 */
if(!capture.isOpened()){
printf("Error open camera\n");
return -1;
}

最後即可取得影像

1
2
3
Mat frame;
/* 把攝影機獲得的影像放進 frame 中 */
capture >> frame;


完整拍照程式碼

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
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

/** 印出錯誤訊息 **/
void PANIC(char *msg);
#define PANIC(msg){perror(msg); exit(-1);}

int main(void){
/* 開啟攝影機 */
VideoCapture capture = VideoCapture(0);
Mat frame;
int i = 1;

/* 確認攝影機是否開啟 */
if(!capture.isOpened())
PANIC("Error open camera");

cout << "Press p to take a picture" << endl;
while(1){
char key = waitKey(100);

/* 將攝影機所取得的影像放進 frame */
capture >> frame;

/* 檢查影像是否正確放入 frame 中 */
if(frame.empty())
PANIC("Error capture frame");

String filename = format("picture%d.jpg", i);

/** 按下 p 鍵時則將 frame 存檔(拍照) **/
switch(key){
case 'p':
i++;
/* 將 frame 寫出成檔案 */
imwrite(filename, frame);
imshow("photo", frame);
waitKey(500);
destroyWindow("photo");
break;
default:
break;
}
imshow("frame", frame);
}
}

編譯並執行程式後,你就可以按下 p 鍵來拍照囉