做视频二次开发最常遇到的问题有两个,一个是算法分析的问题,就是图像处理的问题,另一个就是视频流的问题,就是串口和数据解码的问题。通常来说,科研领域大多在研究前者,而民间的发烧友大多在弄后者,因为科研机构大多不需要考虑硬件开销,他们的目标就是把结果弄出来,而民间的发烧友大多对算法兴趣不大,喜欢搞硬件。
HRESULT WINAPI VCAEnableCapSourceStream(int nCards, BOOL bCapStream, VideoFieldType enVideoFieldType, PrcCapSourceStream pCapStream)
ProCapSourceStream是回调函数,需要注册一个回调函数:
typedef void (CALLBACK *PrcCapSourceStream)( long lnCardID, long pBuf, long lnWidth, long lnHeight, long lnBiCount );
不过我没有用这个方法,理由后面会详细说,不过这个回调函数本身貌似也有问题,long格式的buffer需要先成功转换会byte的,这个涉及到复杂的数据存储问题,主要是long数据占用4个字节,而byte只占用1个字节。
VCARegVidCapCallBack( dwCard, VCAPrcVidCapCallBack )
回调函数是这个:
void CALLBACK VCAPrcVidCapCallBack(DWORD dwCard, BYTE *pbuff,DWORD dwSize)
获得的是YUV的数据,然后把YUV转化为RGB就可以了,参考内容里面有一个相关项目的代码.
GLOBALHANDLE m_hdl;
VCACopyToClipBoard(0);//参数是板卡ID号
OpenClipboard();
m_hdl=GetClipboardData(CF_DIB);
LPBITMAPINFO lpBI=(LPBITMAPINFO)GlobalLock(m_hdl);
void* pDIBBits=(void*)(lpBI+1);
GlobalUnlock(m_hdl);
CloseClipboard();
//lpBI是从剪贴板获得的数据LPBITMAPINFO lpBI
byte* p=new byte[lpBI->bmiHeader.biWidth*lpBI->bmiHeader.biHeight*3+1];
IplImage* m_Image=cvCreateImageHeader(cvSize(lpBI->bmiHeader.biWidth,lpBI->bmiHeader.biHeight),IPL_DEPTH_8U,3);
memcpy(p,pDIBBits,lpBI->bmiHeader.biWidth*lpBI->bmiHeader.biHeight*3);
cvSetData(m_Image,p,lpBI->bmiHeader.biWidth*3);
cvFlip(m_Image,m_Image,0);
void CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) //回调函数
{
//处理代码
}
//Timer的使用代码,放到程序的任意位置,如果和回调函数不在同一个文件,则使用extern外部调用回调函数
UINT_PTR iTimerID=SetTimer(0, 1000, TimerProc); //间隔1000ms触犯一次,TimerProc是回调函数
KillTimer(NULL, iTimerID);