摄像头抓取图片


接上篇文章: http://blog.csdn.net/luckyboy101/article/details/7843661

发现笔记本自带的摄像头不带color space filter, 视频color space是rgb32的,因此加不加color space filter也就不重要了

那么如何抓取图片呢,其实这个功能在transform filter已经很简单了(如果只是单纯的抓取图片,用inplace transform filter就够了),这里贴和上篇文章不同的部分,相同部分就不贴了。

HRESULT CAppTransform::Transform(IMediaSample *pIn, IMediaSample *pOut)
{
	HRESULT hr = Copy(pIn, pOut);
	if (FAILED(hr)) {
		return hr;
	}

	return Transform(pOut);


} // Transform
HRESULT CAppTransform::Transform(IMediaSample *pSample)
{
	// Override to do something inside the application
	// Such as grabbing a poster frame...
	// ...
	BYTE *pData;                // Pointer to the actual image buffer
	long lDataLen;              // Holds length of any given sample
	int iPixel;                 // Used to loop through the image pixels
	tagRGBQUAD *prgb;            // Holds a pointer to the current pixel

	AM_MEDIA_TYPE* pType = &m_pInput->CurrentMediaType();
	VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pType->pbFormat;
	ASSERT(pvi);

	CheckPointer(pSample,E_POINTER);
	pSample->GetPointer(&pData);
	lDataLen = pSample->GetSize();

	// Get the image properties from the BITMAPINFOHEADER

	cxImage    = pvi->bmiHeader.biWidth;
	cyImage    = pvi->bmiHeader.biHeight;
	int numPixels  = cxImage * cyImage;
	if(ISSHOT)
	{
		long lSourceSize = pSample->GetActualDataLength();
		BYTE *pSourceBuffer;
		pSample->GetPointer(&pSourceBuffer);
		if(pBuffer!=NULL)
			free(pBuffer);
		pBuffer=(BYTE *)malloc(lSourceSize*sizeof(BYTE));
		CopyMemory((PVOID) pBuffer,(PVOID) pSourceBuffer,lSourceSize);
		SnapshotToFile("hello");
		ISSHOT=FALSE;
	}

    return S_OK;
}
应用程序通过控制ISSHOT来赚钱图片,ISSHOT=TRUE,在Transform里就把当前帧给pBuffer.
BOOL CAppTransform::SnapshotToFile(const char * inFile)
{


	IplImage* pSrc;
	pSrc=cvCreateImage(cvSize(cxImage,cyImage),IPL_DEPTH_8U,3);
	tagRGBQUAD *prgb;
	prgb = (tagRGBQUAD*) pBuffer;
	for(int y=0;y<cyImage;y++)
	{
		for(int x=0;x<cxImage;x++)
		{
			((uchar*)(pSrc->imageData+y*pSrc->widthStep))[x*pSrc->nChannels]=prgb->rgbBlue;
			((uchar*)(pSrc->imageData+y*pSrc->widthStep))[x*pSrc->nChannels+1]=prgb->rgbGreen;
			((uchar*)(pSrc->imageData+y*pSrc->widthStep))[x*pSrc->nChannels+2]=prgb->rgbRed;
			prgb++;
		}
	}
	cvSaveImage("D:\\test.bmp",pSrc);

	return TRUE;
}
把pBuffer里面的数据存成图片,我们采用opencv的iplimage来保存,因为支持保存成各种图片格式。


Qt是一个跨平台的C++应用程序开发框架,它提供了一套丰富的组件库用于图形用户界面设计。要在Qt中获取摄像头图片,你需要使用QCamera和QCameraViewfinder这两个核心模块。 以下是简单的步骤: 1. 首先,在你的项目中添加对Qt多媒体(QtMultimedia)的支持,这通常通过`QT += multimedia`配置选项完成。 2. 创建一个QCamera对象,这是负责管理摄像头设备的实例: ```cpp QCamera *camera = new QCamera(); ``` 3. 初始化相机并打开设备: ```cpp connect(camera, &QCamera::stateChanged, this, [this](QCamera::State state) { if (state == QCamera::ReadyState) { qDebug() << "Camera is ready."; // 此时可以设置相机视图 } }); camera->start(); ``` 4. 使用QCameraViewFinder创建一个显示视频流的窗口或部件,并将其绑定到相机上: ```cpp QCameraViewfinder *viewfinder = new QCameraViewfinder(this); viewfinder->setCamera(camera); // 将viewfinder添加到UI布局中 ``` 5. 调整相机预览,如果需要的话,比如设置分辨率、帧率等: ```cpp QVideoEncoder encoder; encoder.setCodec("H264"); encoder.setFramerate(30); // 设置帧率 camera->setVideoEncoder(&encoder); ``` 6. 现在你可以定期从QCameraViewFinder中获取实时的图像数据了。可以编写一个定时器,每隔一段时间从相机视图中抓取一张图片: ```cpp QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, [=]() { QImage image = viewfinder->grabFrame(); // 对图像进行处理... }); timer->start(1000 / 30); // 每秒获取一帧 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值