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

随着人工智能的大火,计算机视觉(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 0

	if (!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 frame
			pDlg->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 restarts
	video.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: BGRA
			unsigned 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/

 

 

 

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows系统上使用libusb获取USB摄像头视频需要进行以下步骤: 1. 安装libusb驱动:首先需要下载并安装libusb驱动程序,可以从libusb官方网站上找到适合自己Windows系统版本的驱动程序,并按照安装指南进行安装。 2. 连接USB摄像头:将USB摄像头连接到计算机的USB接口上,并等待系统自动安装摄像头驱动程序。确保摄像头能够正常运行。 3. 建立libusb连接:使用libusb库中提供的函数,建立与USB摄像头的连接。首先需要初始化libusb库,并检测系统中的USB设备,找到对应的摄像头设备。 4. 打开摄像头设备:使用libusb提供的函数,打开USB摄像头设备。这将返回一个表示设备的句柄,用于后续操作。 5. 设置摄像头参数:使用libusb函数设置摄像头的工作参数,如分辨率、帧率等。 6. 开始视频流读取:通过调用libusb函数,开始从摄像头视频流中读取数据。可以使用循环不断读取视频帧数据,并进行处理或显示。 7. 结束视频流读取:当不再需要读取视频流数据时,调用相应的libusb函数结束视频流读取。 8. 关闭摄像头设备:通过调用libusb函数,关闭USB摄像头设备。 9. 断开libusb连接:使用libusb提供的函数,断开与USB摄像头的连接。 10. 释放libusb资源:在程序结束之前,调用libusb函数释放初始化时分配的资源,确保内存的正确释放。 通过以上步骤,我们可以使用libusbWindows系统上获取USB摄像头的视频数据,并进行处理、显示等操作。关于具体的函数调用和参数设置,可以参考libusb的官方文档或相关的示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值