关于使用DirectShow 同时控制两个乃至多个USB相机
class CLeftSampleGrabberCB : public ISampleGrabberCB{
public:
int lWidth;
int lHeight;
public:
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) {
//timer.End();
if (!pBuffer)return E_POINTER;
if(leftEvent){
CSingleLock singleLock(&Mutex);
singleLock.Lock() ;
writeFile(leftCycle,leftLocation ,0 ,pBuffer, lBufferSize);
leftEvent = false ;
if ()
{
}
singleLock.Unlock() ;
}
return 0;
}
public:
int writeFile(int cycle ,double location,int dir ,BYTE * pBuffer, long lBufferSize){
FILE * fp = NULL;
CString str ;
str.Format("C:\\BScanData\\ImageData\\data.ckJpg");
fp = fopen(str, "ab+");
if (fp == NULL)
{
AfxMessageBox("打开文件失败");
return -1;
}
int dataSize = lBufferSize ;
//数据写入文件
fwrite(&cycle, sizeof(int), 1, fp);
fwrite(&lWidth, sizeof(int), 1, fp);
fwrite(&lHeight, sizeof(int), 1, fp);
fwrite(&dataSize, sizeof(int), 1, fp);
fwrite(&dir, sizeof(int), 1, fp);
fwrite(&location, sizeof(double), 1, fp);
fwrite(pBuffer, 1, lBufferSize, fp);
//释放内存空间
fclose(fp);
return 0 ;
}
};
上述为从单个相机的视频流中取出一帧图像 , 参考Palycap 例子 , 在得到相机的控制指针后 ,加入 ,
hr = m_pGrabber->SetCallback(&mLeftCB, 1);
hr = m_pGrabber->SetBufferSamples(FALSE);
hr = m_pGrabber->SetOneShot(FALSE);
其中mleftcb 为上面的类定义的对象 , ,一开始我是在一个相机的情况下 ,进行的 ,测试 ,
在我直接将使用上述的类定义俩对象时,同时控制两个相机 进行抓图 ,这
if (m_RailType == LeftRail)
{
mLeftCB.lWidth = vih->bmiHeader.biWidth;
mLeftCB.lHeight = vih->bmiHeader.biHeight;
hr = m_pGrabber->SetCallback(&mLeftCB, 1);
}else{
mRightCB.lWidth = vih->bmiHeader.biWidth;
mRightCB.lHeight = vih->bmiHeader.biHeight;
hr = m_pGrabber->SetCallback(&mRightCB, 1);
}
hr = m_pGrabber->SetBufferSamples(FALSE);
hr = m_pGrabber->SetOneShot(FALSE);
因为定义的对象的类是一样的 ,而且我们需要的我在这里是相当于将两个相机 的BufferCB回调函数 ,都使用了这一个, 那么当两个相机都有数据的时候是什么情况呢 …
结果是出现了两个相机的得到的图像混乱,数据丢失等情况 ,我检查了其他很多代码 ,感觉都是没问题 ,
最后 灵光一闪 ,我重新继承了ISampleGrabberCB类 ,又写了一个 和上面一模一样的类 ,就是类名不一样而已 ,这样就分别对两个相机 抓图的回调函数 分开了 .然后数据就正常了 ,
之后我是想过在一个类在重载一个BufferCB回调来着 .但是想了一下好像不行 ,他是一个虚函数 ,我多次重载还是分辨不出来
.算了 就这样
所以如果需要很多个相机 ,就要重写很多个*
ISampleGrabberCB
*类
我想不到别的办法 ,.如果有哪位有好的思路的 ,欢迎qq联系我 1975131393
如果没有思路的也可以参考我这个方法,也就是多复制几次而已
哈哈哈哈哈