如何设置摄像头捕获图像的宽高,或实时改变捕获图像流数据的宽高要求效率高
{
HRESULT hr;
hr = InitCaptureGraphBuilder();
if (FAILED(hr))
{
AfxMessageBox("Failed to get video interfaces!");
return hr;
}
// Bind Device Filter. We know the device because the id was passed in
if(!BindFilter(iDeviceID, &m_pBF))return S_FALSE;
hr = m_pGB->AddFilter(m_pBF, L"Capture Filter");
// hr = m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
// m_pBF, NULL, NULL);
// create a sample grabber
hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber );
if( !m_pGrabber )
{
AfxMessageBox("Fail to create SampleGrabber, maybe qedit.dll is not registered?");
return hr;
}
CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber );
//设置视频格式
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = MEDIATYPE_Video;
mt.subtype = MEDIASUBTYPE_RGB24;
hr = m_pGrabber->SetMediaType(&mt);
if( FAILED( hr ))
{
AfxMessageBox("Fail to set media type!");
return hr;
}
hr = m_pGB->AddFilter( pGrabBase, L"Grabber" );
if( FAILED( hr ) )
{
AfxMessageBox("Fail to put sample grabber in graph");
return hr;
}
// try to render preview/capture pin
hr = m_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);
if( FAILED( hr ) )
hr = m_pCapture->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,m_pBF,pGrabBase,NULL);
if( FAILED( hr ) )
{
AfxMessageBox("Can't build the graph");
return hr;
}
hr = m_pGrabber->GetConnectedMediaType(&mt);
if ( FAILED( hr) )
{
AfxMessageBox("Failt to read the connected media type");
return hr;
}
VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;
mCB.lWidth = vih->bmiHeader.biWidth;
mCB.lHeight = vih->bmiHeader.biHeight;
FreeMediaType(mt);
hr = m_pGrabber->SetBufferSamples( FALSE );
hr = m_pGrabber->SetOneShot( FALSE );
hr = m_pGrabber->SetCallback( &mCB, 1 );
//设置视频捕捉窗口
m_hWnd = hWnd ;
SetupVideoWindow();
hr = m_pMC->Run();//开始视频捕捉
if(FAILED(hr)){AfxMessageBox("Couldn't run the graph!");return hr;}
return S_OK;
}
或在流里如何改变
class CSampleGrabberCB : public ISampleGrabberCB
{
public:
long lWidth;
long lHeight;
TCHAR m_szFileName[MAX_PATH];// 位图文件名称
CSampleGrabberCB()
{
strcpy(m_szFileName, "c:\\donaldo.bmp");
}
STDMETHODIMP_(ULONG) AddRef() { return 2; }
STDMETHODIMP_(ULONG) Release() { return 1; }
STDMETHODIMP QueryInterface(REFIID riid, void ** ppv)
{
if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown )
{
*ppv = (void *) static_cast<ISampleGrabberCB*> ( this );
return NOERROR;
}
return E_NOINTERFACE;
}
STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample )
{
return 0;
}
STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )
{
if( !bOneShot)
return 0;
if(!pBuffer)return E_POINTER;
SaveBitmap(pBuffer, lBufferSize);//如何快速改变流的宽高因为要用于实际时数据传输
bOneShot = FALSE;
return 0;
}
//创建位图文件
BOOL SaveBitmap(BYTE * pBuffer, long lBufferSize )
{
HANDLE hf = CreateFile(
m_szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, NULL, NULL );
if( hf == INVALID_HANDLE_VALUE )
return 0;
// 写文件头
BITMAPFILEHEADER bfh;
memset( &bfh, 0, sizeof( bfh ) );
bfh.bfType = 'MB';
bfh.bfSize = sizeof( bfh ) + lBufferSize + sizeof( BITMAPINFOHEADER );
bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER );
DWORD dwWritten = 0;
WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL );
// 写位图格式
BITMAPINFOHEADER bih;
memset( &bih, 0, sizeof( bih ) );
bih.biSize = sizeof( bih );
bih.biWidth = lWidth;
bih.biHeight = lHeight;
bih.biPlanes = 1;
bih.biBitCount = 24;
WriteFile( hf, &bih, sizeof( bih ), &dwWritten, NULL );
// 写位图数据
WriteFile( hf, pBuffer, lBufferSize, &dwWritten, NULL );
CloseHandle( hf );
return 0;
}
};
相关推荐
c#调用海康sdk查看摄像头 实时图像
其中,查看实时图像主要涉及到设备的连接、图像流的获取和解码显示。1. **设备连接**:在C#中,使用SDK提供的API建立与摄像头的连接。这通常涉及到设置设备的IP地址、端口号、用户名和密码等信息。
基于OpenCV与C++实现工业级多二维码识别系统
二维码识别是计算机视觉领域的一项基础且关键的技术,其核心原理是通过图像处理算法定位和解码二维码中的信息模块。在工业自动化、物流管理和移动应用等场景中,单码识别技术已无法满足同时处理多个、姿态各异、光照不均的二维码的复杂需求。因此,构建一个高效、鲁棒的多二维码识别系统具有重要的技术价值。本文聚焦于利用OpenCV的WeChatQRCode模块,结合C++的高性能优势,详细阐述了从图像预处理、核心识别、后处理(如非极大值抑制NMS)到模块化封装的全流程实战方案。该方案特别适用于对实时性和部署便捷性有严苛要求的嵌
FPGA硬件在环(HIL)验证:真实芯片闭环测试实战指南
硬件在环(HIL)是一种将真实物理硬件嵌入控制闭环的系统级验证方法,其核心在于用实际FPGA芯片替代仿真模型,暴露IO驱动能力、时序偏差、电源噪声等仿真无法复现的物理层问题。它基于确定性实时架构,依赖FPGA并行硬件实现微秒级响应,支撑电机控制、电池管理系统、车载传感器等高可靠场景的功能安全认证(如ASIL-B、SIL2)。随着‘stm32h743和fpga实现fmc通信’‘fpga biss-c’‘电池 hil 测试’等工程需求激增,HIL已从可选验证手段升级为量产准入门槛。本文聚焦FPGA作为实时节点的
C# RealSense获取图像流Demo
无论是处理彩色图像还是深度数据,这个过程都相对直观且高效。在实际项目中,你可以根据需求进一步扩展,例如,实现实时的图像处理、运动检测或3D重建等功能。
vc++Capture摄像头图像捕获与录制程序
在本程序中,DirectShow可能是用来获取摄像头输入,并处理图像流的核心组件。开发者通过创建DirectShow过滤器图形(Filter Graph),可以实现视频数据的捕获、处理和输出。3.


多媒体/流媒体开发
