windows下攝像頭的使用


windows下提供了調用攝像頭的相關api函數,函數定義包含在vfw.h頭文件中。

http://msdn.microsoft.com/zh-cn/dd757677 這個地址提供了完整的教程。

下面貼出一個簡單的例子

頭文件:

#ifndef pvcamerasnapshoter_h
#define pvcamerasnapshoter_h

#include <QtGui/QWidget>
#include <QtGui/QPixmap>
#include <QtCore/QByteArray>
#include <Windows.h>
#include <Vfw.h>
#pragma comment(lib,"Vfw32.lib")

class pvCameraSnapshoter : public QWidget
{
    Q_OBJECT

public:
    pvCameraSnapshoter(QWidget *parent = 0);

    ~pvCameraSnapshoter(void);
    
    bool OpenCamera();            //初始化攝像頭 void CloseCamera();

    QPixmap GetCameraSnapshot();   //保持一幀圖片數據
private: HWND cameraScreenHwnd; }; #endif //pvcamerasnapshoter_h

實現文件:

#include <tchar.h>
#include <QtGui/QBitmap>
#include <QtCore/QByteArray>

#include "pvCameraSnapshoter.h"
#include "../common/pvcmuserpath.h"

LRESULT PASCAL SnapshotFrameCbProc(HWND hWnd, LPVIDEOHDR lpVHdr);        //回調函數用於處理接收到的圖像數據

pvCameraSnapshoter::pvCameraSnapshoter(QWidget *parent) : QWidget(parent) { } pvCameraSnapshoter::~pvCameraSnapshoter(void) { } bool pvCameraSnapshoter::OpenCamera() { LPTSTR lpszName = new TCHAR[100]; LPTSTR lpszVer = new TCHAR[100]; capGetDriverDescription(0,lpszName,100,lpszVer,100); cameraScreenHwnd = capCreateCaptureWindow(lpszName, WS_CHILD | WS_VISIBLE, 0, 0, width(), height(), winId(), 0); //創建一個用來顯示攝像頭視頻的窗口 if(cameraScreenHwnd == INVALID_HANDLE_VALUE) { return false; } if(capDriverConnect(cameraScreenHwnd,0)) //與鏈接攝像頭 { capPreview(cameraScreenHwnd,true); //設置娛樂模式,這樣與攝像頭關聯的窗口就可以自動顯示視頻數據了 capPreviewRate(cameraScreenHwnd,60); //每秒60幀 BITMAPINFO bitmapinfo; memset(&bitmapinfo,0,sizeof(BITMAPINFO)); bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bitmapinfo.bmiHeader.biWidth = 320; bitmapinfo.bmiHeader.biHeight = 240; bitmapinfo.bmiHeader.biPlanes = 1; bitmapinfo.bmiHeader.biBitCount = 32; bitmapinfo.bmiHeader.biCompression = BI_RGB; capSetVideoFormat(cameraScreenHwnd, &bitmapinfo, sizeof(bitmapinfo)); //設置攝像頭的視頻格式,不過這個函數好像不起作用 capSetUserData(cameraScreenHwnd,this); //添加用戶數據,在回調函數中可能會用到 capSetCallbackOnFrame(cameraScreenHwnd,SnapshotFrameCbProc); //設置回調函數,攝像頭的視頻數據每一幀都會經過這個函數 return true; } return false; } void pvCameraSnapshoter::CloseCamera() { capDriverDisconnect(cameraScreenHwnd); } QPixmap pvCameraSnapshoter::GetCameraSnapshot() { QPixmap cameraSnapshot; if(cameraScreenHwnd == INVALID_HANDLE_VALUE) { return cameraSnapshot; } if(capGrabFrameNoStop(cameraScreenHwnd)) //抓取一幀圖像數據,與capGrabFrame相比,它不會停止預覽模式和重疊 { pvcmUserPath userpath; QString strSnapshotFile = userpath.GetUserSubPath("camerasnapshot").filePath("snapshot.bmp"); const wchar_t* wSnapshotpath = reinterpret_cast<const wchar_t*>(strSnapshotFile.utf16()); if(!capFileSaveDIB(cameraScreenHwnd,wSnapshotpath)) //保持攝像頭快照 { qDebug("save camerasnapshot fail"); return cameraSnapshot; } cameraSnapshot.load(strSnapshotFile); } return cameraSnapshot; } LRESULT PASCAL SnapshotFrameCbProc(HWND hWnd, LPVIDEOHDR lpVHdr) {   //這里處理視頻數據return (LRESULT) TRUE ; } #include "moc_pvcamerasnapshoter.cpp"

 


免責聲明!

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



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