OpenCV入門系列(6):讀取攝像頭,實時顯示


在今天以前,我一直認為攝像頭是一個神秘的東西。怎么才能在自己的程序中讀取攝像頭的畫面,想想都無從下手。

然而今天終於知道, 這在OpenCV中是一件多么簡單的事情。僅僅調用一個函數,就能從攝像頭中讀取一幀幀的畫面,想顯示還是保存,隨意。顯示的話,就是實時的視頻圖像;保存的話,就是視頻文件了。

准備工作

准備工作極為簡單,找一個普通的攝像頭,插到USB口中。然后點開QQ視頻,確保它能正確工作。

讀取攝像頭

核心代碼

CvCapture* capture = cvCreateCameraCapture(0);
IplImage* frame = cvQueryFrame(capture);

第一行創建了一個來自攝像頭的capture,注意其參數為0,表示隨機取一個攝像頭。當我們電腦上只有一個攝像頭時,就填它。如果有多個,還需要指定設備id。

第二行是從該capture中讀取下一幀畫面。不斷的調用第二句,就能不斷得到新的畫面。

示例效果

image

完整代碼

#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;
}
代碼相當簡單,但實現了讀取攝像頭並顯示在一個屏幕窗口的功能。

對畫面進行處理

從代碼中可以看到,我們是以圖片方式讀取攝像頭數據,這樣就可以在顯示到窗口前,對圖片進行操作。想到我們在前面介紹過對圖片進行尋邊的操作,可以試試把它們結合在一起,得到不一樣的效果。

首先看最終效果:

image

從視頻窗口看到的效果變成了這樣,是不是挺恐怖?

完整代碼

代碼也相當簡單,即在每幀圖片顯示在窗口前,先對它進行一個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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM