随着人工智能的大火,计算机视觉(computer vision)技术也热了起来,在很多所谓的人工智能领域大放光彩,尤其是模式识别,图像分类,而这也少不了对USB摄像头的图像的获取操作,然而我在起初寻找usb摄像头图像的获取方法时竟费了一番周折,通常的做法实在是不方便。

一种常见的方法是用DirectShow, 这里有相关链接https://github.com/5455945/VideoCapture

另一种是用opencv、openGL实现的,网上也有很多相关的代码示例。

但是上面这两种都需要额外安装库,有没有能直接引用lib或者dll就能工作的“绿色”方式,当然是有的:videoinput:

http://www.muonics.net/school/spring05/videoInput/

https://github.com/ofTheo/videoInput

不过github上的demo还是有点麻烦,其实我们想用的一般很简单,就是获取图片,并没有更多的要求,这里我给出一个demo,就是获取usb摄像头的图像字节信息并绘制在对话框上。

主要代码如下:

unsigned char *Scrbuffer;
int V_W = 640;
int V_H = 480;
bool m_bExit;unsigned char *Buffer = new unsigned char[V_W*V_H * 3];Scrbuffer = Buffer;videoInput video; int deviceID = 0;//the index of camera, if there is only one camera, deviceID is 0if (!video.setupDevice(deviceID, V_W, V_H)){CString strMsg("无法打开摄像头!");AfxMessageBox(strMsg);}while (true){if (video.isFrameNew(deviceID)){video.getPixels(deviceID, Buffer, false, true);//get pixels of a framepDlg->VdoFrameData(0, Buffer, V_W*V_H * 3, param);}}//you must stop device here before thread exit, otherwise it will cause some system problems//and the thread will not release the camera resources //which makes any other thread can't open the camera even untill the system restartsvideo.stopDevice(deviceID); delete[]Buffer;

为了实际可用,demo里另开了个线程完成上述功能,完善了线程同步,如退出通知,公共变量互斥,并完成了图像绘制。

图像绘制代码:

CPaintDC dc(this);CDC m_dcMem;CBitmap m_bmpMem;CBitmap * m_pOldBmp;CRect m_rtClient;GetClientRect(&m_rtClient);m_dcMem.CreateCompatibleDC(&dc);Gdiplus::Graphics m_pGraph(m_dcMem.m_hDC);m_bmpMem.CreateCompatibleBitmap(&dc, m_rtClient.Width(), m_rtClient.Height());m_pOldBmp = m_dcMem.SelectObject(&m_bmpMem);m_pGraph.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality);//抗锯齿   EnterCriticalSection(&m_csBuffer);DrawPixels(m_dcMem,Scrbuffer, V_W, V_H);LeaveCriticalSection(&m_csBuffer);dc.BitBlt(0, 0, m_rtClient.Width(), m_rtClient.Height(), &m_dcMem, 0, 0, SRCCOPY);//将内存DC上的图象拷贝到前台m_pGraph.ReleaseHDC(dc.GetSafeHdc());m_dcMem.SelectObject(m_pOldBmp);m_bmpMem.DeleteObject();m_dcMem.DeleteDC();int CUSBCameraDemoDlg::DrawPixels(CDC& m_dcMem,unsigned char* pPixels,int nWidth,int nHeight , bool bMirror=false){CDC memDC;memDC.CreateCompatibleDC(&m_dcMem);CRect m_rtClient;GetClientRect(&m_rtClient);CBitmap bmpMem;bmpMem.CreateCompatibleBitmap(&m_dcMem, nWidth,nHeight);  BITMAP bmp;bmpMem.GetBitmap(&bmp);int pixelBits = bmp.bmBitsPixel;int pixelBytes = pixelBits / 8;DWORD dwSize = bmp.bmHeight * bmp.bmWidthBytes;unsigned char* pBits = new unsigned char[dwSize];int i, j;for (i = 0; i < bmp.bmHeight; i++){for (j = 0; j < bmp.bmWidth; j++){//24bits format: BGR//32bits format: BGRAunsigned char * pPixelStart = pBits + i*bmp.bmWidthBytes + j* pixelBytes;unsigned char * pSrcStart = pPixels + i* bmp.bmWidth*3 + (bMirror?(bmp.bmWidth - j):j)*3;pPixelStart[0] = pSrcStart[0];pPixelStart[1] = pSrcStart[1];pPixelStart[2] = pSrcStart[2];pPixelStart[3] = 0;}}bmpMem.SetBitmapBits(dwSize,pBits);CBitmap* pOldBmp = memDC.SelectObject(&bmpMem);m_dcMem.StretchBlt(0, 0, m_rtClient.Width(), m_rtClient.Height(), &memDC,0,0,nWidth ,nHeight,SRCCOPY);memDC.SelectObject(pOldBmp);delete[] pBits;bmpMem.DeleteObject();memDC.DeleteDC();//DrawImage("Capture1.jpg", m_rtClient);//m_dcMem.SetBkColor(RGB(0, 255, 255));return 0;
}

demo示意图:

demo下载:

https://download.csdn.net/download/atp1992/10518895

原博客:

http://www.straka.cn/blog/capture-image-through-usb-camera/

一种windows下简单的USB摄像头图像获取方式相关推荐

  1. 20200213ubuntu20.04下的笔记本USB摄像头的相关资料

    20200213ubuntu20.04下的笔记本USB摄像头的相关资料 rootroot@rootroot-HP-Laptop-14s-dp0xxx:~$  rootroot@rootroot-HP- ...

  2. windows下python读取网络摄像头

    windows下python读取网络摄像头 这几天天天搭建环境,都快疯了,到处找包,到处安装,到处出错,读不出来网络摄像头,不过经过不懈努力终于把环境配好了,真不容易,在上一篇VSCode+pytho ...

  3. Linux系统下自动搜索USB摄像头地址及设备信息

    Linux系统下自动搜索USB摄像头地址及设备信息 在进行到多个USB摄像头开发时,会涉及到获取摄像头地址及设备信息问题. 一般USB摄像头的设备信息是固定的,我们基于设备信息,就可以在软件开发时进行 ...

  4. 在linux下玩转usb摄像头

    硬件平台:PC机一台 .usb摄像头 操作系统:Linux3.0.8 交叉编译环境:arm-none-Linux-gnueabi-gcc  4.5.1 调试步骤: 一.linux 内核解压 1.1使用 ...

  5. Windows下简单好用的php平台:XAMPP Wamp5和AppServ

    2019独角兽企业重金招聘Python工程师标准>>> 说到开源,php无疑是最具有活力的.最优秀的.最受关注的.最有发展前景的开源web程序,例如CMS中的Joomla.Drupa ...

  6. linux 添加usb摄像头,在linux下玩转usb摄像头

    版权声明:本文为博主原创文章,未经博主允许不得转载. 硬件平台:PC机一台 .usb摄像头 操作系统:Linux3.0.8 交叉编译环境:arm-none-Linux-gnueabi-gcc 4.5. ...

  7. Windows 下创建目录链接 映射文件的方式不想改变路径直接使用映射路径的方式

    Windows 下创建目录链接 发表于 2019-10-27 | 分类于 后端 | 没有评论 在 Windows 下如果通过右键菜单->创建快捷方式生成的文件或文件夹,其实是生成了一个后辍为.l ...

  8. Windows下简单使用BPG图像压缩工具进行图像压缩和解压缩(附官方编解码工具代码下载地址)

    BPG是一种新型的图片格式.其设计初衷在于当图片质量或文件size成为瓶颈时,取代JPEG.其主要特点如下: 高压缩比.BPG在quality类似的情形下,比JPEG要小得多.相同大小的图片,使用BM ...

  9. Windows 下定制黑苹果 USB 驱动教程

    本教程教大家如何使用 USBToolBox 定制黑苹果USB驱动,使用非常方便,定制 USB 不再像 Hackintool 那么麻烦(软件本身支持macOS,但建议在WIN下操作). NO.1 安装准 ...

最新文章

  1. c#获取对象的唯一标识_在 Java 中利用 redis 实现分布式全局唯一标识服务
  2. 解决XP系统下HTTP 错误 403.9 - 禁止访问:连接的用户过多的问题
  3. java 锁的底层原理
  4. 浏览器本地存储的使用
  5. 2010年亚运会前广州将大力推广清洁能源公交
  6. Sql Server之旅——第九站 看看DML操作对索引的影响
  7. 被骂十几年,躺赚上千亿!这个“土匪”行业,还能浪多久?
  8. spring +mybatis 事务不会滚
  9. 程序员不会测试引起版本事故小结
  10. yaahp层次分析法(文末含破解版软件)
  11. 使用OpenGL绘制shp文件
  12. 联想计算机型号,联想笔记本所有型号介绍(经典五款推荐)
  13. 分时操作系统与分布式操作系统
  14. 案例|双循环下的国货自信:波司登抵御寒冬的新战袍
  15. Java压缩文件/文件夹
  16. 本科大学计算机专业排名2015,2015年美国大学本科计算机专业排名
  17. 从 DP 到 DDP 到 apex
  18. 任天堂超级玛丽(SuperMario)改编的超级企鹅(java)搞笑版,绝对给力
  19. 读书百客:《拟孙权答曹操书》赏析
  20. gitlab+jenkins 利用webhook自动构建代码

热门文章

  1. 计算机组成原理画出CPU与主存及3-8译码器之间信号线的连接问题
  2. 安装apache遇到You don’t have permission to access this resource. 原因与解决方法
  3. warframe怒焚者结合目标_warframe哪些地图有结合目标 | 手游网游页游攻略大全
  4. 百度交易中台之钱包系统架构浅析
  5. 使用英特尔® 图形性能分析器分析实际游戏性能
  6. 用论文写作平台Overleaf写中文论文
  7. Neat Download Manager(ndm下载器)
  8. 小程序笔记(四)发表评论或者普通发帖
  9. 如何使用 Podman 签署和分发容器镜像
  10. Android指纹解锁