在今天以前,我一直認為攝像頭是一個神秘的東西。怎么才能在自己的程序中讀取攝像頭的畫面,想想都無從下手。
然而今天終於知道, 這在OpenCV中是一件多么簡單的事情。僅僅調用一個函數,就能從攝像頭中讀取一幀幀的畫面,想顯示還是保存,隨意。顯示的話,就是實時的視頻圖像;保存的話,就是視頻文件了。
准備工作
准備工作極為簡單,找一個普通的攝像頭,插到USB口中。然后點開QQ視頻,確保它能正確工作。
讀取攝像頭
核心代碼
CvCapture* capture = cvCreateCameraCapture(0); IplImage* frame = cvQueryFrame(capture);
第一行創建了一個來自攝像頭的capture,注意其參數為0,表示隨機取一個攝像頭。當我們電腦上只有一個攝像頭時,就填它。如果有多個,還需要指定設備id。
第二行是從該capture中讀取下一幀畫面。不斷的調用第二句,就能不斷得到新的畫面。
示例效果
完整代碼
#include "cv.h" #include "highgui.h" int main(int argc, char** argv) { cvNamedWindow("win"); CvCapture* capture = cvCreateCameraCapture(0); IplImage* frame; while(1) { frame = cvQueryFrame(capture); if(!frame) break; cvShowImage("win", frame); char c = cvWaitKey(50); if(c==27) break; } cvReleaseCapture(&capture); cvDestroyWindow("win"); return 0; }代碼相當簡單,但實現了讀取攝像頭並顯示在一個屏幕窗口的功能。
對畫面進行處理
從代碼中可以看到,我們是以圖片方式讀取攝像頭數據,這樣就可以在顯示到窗口前,對圖片進行操作。想到我們在前面介紹過對圖片進行尋邊的操作,可以試試把它們結合在一起,得到不一樣的效果。
首先看最終效果:
從視頻窗口看到的效果變成了這樣,是不是挺恐怖?
完整代碼
代碼也相當簡單,即在每幀圖片顯示在窗口前,先對它進行一個cvCanny的操作即可。
完整代碼如下:
#include "cv.h" #include "highgui.h" int main(int argc, char** argv) { cvNamedWindow("win"); CvCapture* capture = cvCreateCameraCapture(0); IplImage* frame = cvQueryFrame(capture); while(1) { frame = cvQueryFrame(capture); if(!frame) break; IplImage* out = cvCreateImage(cvGetSize(frame), frame->depth, 1); cvCanny(frame, out, 10, 100, 3); cvShowImage("win", out); cvReleaseImage(&out); char c = cvWaitKey(50); if(c==27) break; } cvReleaseCapture(&capture); cvDestroyWindow("win"); return 0; }