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"

windows下摄像头的使用,布布扣,bubuko.com

时间: 2024-10-06 13:00:25

windows下摄像头的使用的相关文章

windows下搭建nginx-rtmp服务器

windows下搭建nginx-rtmp服务器 windows下搭建nginx-rtmp服务器 准备工作 安装MinGW 安装Mercurial 安装strawberryperl 安装nasm 下载nginx相关的源码包 编译nginx nginx-rtmp环境搭建 效果测试 最后说明 最近因为接触直播相关的技术工作,使用的也是基于高并发和高性能的nginx,首先需要做的当然是搭建一个nginx服务器. 对于linux上nginx服务器的搭建此处就不再赘述,按照操作指引来的话一般都能顺理成章搭建

Windows下尝试PHP7提示丢失VCRUNTIME140.DLL的问题解决

前天PHP7.0.0正式版发布了,有一些比较好的改进,官方也说速度比php5.6快了两倍,性能上有了很大提升,并且也发布了从php5.x向php7迁移的问题,所以今后php网站迁移后能够大幅度的提升网站性能,所以为了尝鲜我也去php官网下载了7.0的版本,通过命令行进行独立的测试,下载zip包后解压出来,下载后进入目录,将php.ini-development改为php.ini其余的参数暂时不用修改,然后在当前目录下新建test.php,输入简单的代码: 1 <?php 2 echo "H

Windows下VC编译OpenDDS

OpenDDS是一个OMG组织DDS标准的C++开源实现,OpenDDS同时也提供Java支持.OpenDDS依赖ACE抽象层来提供不同平台的兼容性,同时也依赖于TAO(例如TAO的IDL编译器).当前OpenDDS有ociweb ObjectComputing维护,官方网站http://www.opendds.org/.目前OpenDDS支持的平台有Windows,Linux family,Android,VxWorks等,可用的编译器包括VC,gcc,QNX gcc等. 1. OpenDDS

Windows下的磁盘管理(二)

续Windows下的磁盘管理(一) 六.跨区卷 跨区卷是由几个位于不同磁盘的未分配空间所组成的一个逻辑卷.即用户可以将几个磁盘内的未分配空间,合并成一个跨区卷,分配一个共同的驱动器,这样可能更有效地利用空间.     用户可以选择2-32个磁盘:     每个磁盘的容量可以不相同:     不可以包括系统卷与活动卷:     系统存储数据时,是先将数据存储在其成员中的第一个磁盘内,待其空间用完后,才会用到第二个磁盘,依次类推:     跨区卷不能提高磁盘的访问效率:     跨区卷不具有容错功能

Python学习笔记(三)windows下安装theano

早就听说theano很难安装,这一次算是初步尝试,不知道会不会有其它问题. 0 参考材料 (1)win 8.1 64bit 深度学习theano 安装设置 (2)Windows下安装theano成功,但一import就报decode错是什么原因? (3)Wndows8.1 64bit环境下搭建深度学习平台之Theano安装配置 (4)deep learning学习环境Theano安装(win8+win7) 1 简单记录过程 (1)安装anaconda:Download Anaconda now!

windows下scrapy框架学习笔记—&#39;scrapy&#39; 不是内部或外部命令

最近几天在深入的学习scrapy框架,但是装完各种需要的基础包之后却发现scrapy命令在别的路径下都用不了,我一开始是把python安装在F:\Python路径下的,安装了scrapy后它默认都会安装在这个路径下,scrapy在路径F:\Python\Scripts路径下,我的scrapy命令只能在此路径下用,因此创建什么工程也都只能在此文件下. 想了一下它的工作原理:它在F:\Python\Scripts路径下,就会在Scripts文件下存在一个scrapy批处理文件,那么在DOS下想要命令

(转)Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat

刚在机器上windows环境下装上pip方便以后安装包的时候使用,谁知道第一次使用pip安装asyncio的时候就报错. 在Windows7x64下使用pip安装包的时候提示报错:Microsoft Visual C++ 9.0 is required  (Unable to find vcvarsall.bat) 环境:windows7 x64 ,python2.7 ,VS2012 原因:windows下使用pip安装包的时候需要机器装有vs2008,VS2012还不行,如果不想装VS2008

Windows下使用Word2vec继续词向量训练

word2vec是Google在2013年提出的一款开源工具,其是一个Deep Learning(深度学习)模型(实际上该模型层次较浅,严格上还不能算是深层模型,如果word2vec上层再套一层与具体应用相关的输出层,如Softmax,便更像是一个深层模型),它将词表征成实数值向量,采用CBOW(Continuous Bag-Of-Words Model,连续词袋模型)和Skip-Gram(Continuous Skip-GramModel)两种模型.具体原理,网上有很多. 本文是在window

VNCViewer Windows下远程连接Linux桌面

最近项目需求,需要将写的工程部署到centos6.5服务器上,但是出现了各种错误,就想着在linux下再调试代码.但是之前都是通过ssh链接远程服务器的,在ssh中肯定不能打开eclipse等集成开发工具,因此我们要在远程服务器上安装桌面及vncserver,然后在windows中用vncViewer连接. 一:服务器端(Centos6.5) 1:安装桌面: # yum groupinstall "GNOME Desktop Environment"(CentOS 5.x安装GNOME