如何把VIDEOHDR中的数据显示出来

boya 2002-04-18 12:40:46
请给出全过程,谢谢
...全文
197 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldj123 2002-04-30
  • 打赏
  • 举报
回复
天天在网上,有空就探讨探讨,呵呵!
oldj123 2002-04-30
  • 打赏
  • 举报
回复
1、你是用VIDEO FOR WINDOWS得到的VIDEOHDR指针吗??

BOOL CVideoCapView::FrameCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)
{
////////////////////////////////////////////////////////////////////////
// hWnd: Application main window handle
// lpVHdr: long pointer to VideoHdr struct containing captured
// frame information
//typedef struct {
//LPBYTE lpData; 指向缓冲区的指针
//DWORD dwBufferLength; 缓冲区的长度
//DWORD dwBytesUsed; 缓冲区中使用的字节数
//DWORD dwTimeCaptured; 捕捉时间(毫秒) 与数据流中第一桢的捕捉时间有关
//DWORD dwUser; 32位的特定客户区数据
//DWORD dwFlags; 1、VHDR_DONE 由设备驱动器提供,表明设备驱动器已经完成缓冲,并将缓冲区数据返回给客户区
// 2、VHDR_PREPARED 表明缓冲区是否准备好以便使用
// 3、VHDR_INQUEUE 表明缓冲区已在设备的缓冲区队列中
// 4、VHDR_KEYFRAME 关键桢
//DWORD dwReserved[4]; 保留字,常用做缓冲队列
//} VIDEOHDR;
//////////////////////////////////////////////////////////////////////

if (!ghWndCap)
return FALSE; //若捕捉窗口未被建立返回FALSE
CVideoCapDoc * pDoc=GetDocument();
LPSTR pDIB; //指向DIB数据的指针
pDoc->datasize=lpVHdr->dwBufferLength;//在CVideoCapDoc类中定义的变量,表明缓冲区长度
pDoc->hImgData=(HDIB)::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT,pDoc->datasize); //分配一端长度与缓冲区长度相等的内存用于存放DIB数据

if (pDoc->hImgData == 0)
{
AfxMessageBox("memory allocate error", MB_ICONINFORMATION | MB_OK,0);
return FALSE;
}

pDIB=(LPSTR)::GlobalLock((HGLOBAL) pDoc->hImgData); //锁定内存(用pDIB指针指向刚刚分配的内存区域)
memcpy((char *)pDIB,(char *)lpVHdr->lpData,pDoc->datasize); //将缓冲区中的数据拷贝到pDIB指向的内存区域
pDoc->bi=(LPBITMAPINFOHEADER)pDIB; //DIB文件头信息指针
pDoc->ImgHeight=pDoc->bi->biHeight; //DIB图像高度
pDoc->ImgWidth=pDoc->bi->biWidth; //DIB图像高度
pDoc->LineBytes=WIDTHBYTES(pDoc->ImgWidth*pDoc->bi->biBitCount);//DIB图像每行的字节数

pDoc->docsize.cx=(int)30*pDoc->LineBytes;
pDoc->docsize.cy=(int)16*pDoc->ImgHeight;

pDoc->UpdateAllViews(NULL,0,NULL); //更新所有视
::GlobalUnlock(pDoc->hImgData); //解锁



// wsprintf(gachBuffer, TEXT("Preview frame# %ld "), gdwFrameNum++) ;

// ::SetWindowText(ghWndFrame, (LPTSTR)gachBuffer) ;
return (LRESULT) TRUE ;
}
我在文档类里定义了DIB信息,
BITMAPFILEHEADER bf;
LPBITMAPINFOHEADER bi;
CBitmap bm;
CSize docsize;
CString filename;
HBITMAP hBitmap;
HDIB hImgData;
DWORD NumColors;
DWORD LineBytes;
DWORD ImgWidth;
DWORD ImgHeight;
DWORD palettesize;
DWORD datasize;
然后在视类的ONDRAW函数中处理显示DIB的东西,我想你这个应该是会的!!
2、你应该是使用VFW编程,应该知道回调函数的用法吧??
3、另外,我想问你一个问题,你用什么采集卡?什么摄像头??有没有出现过在建立视频窗与设备相连时发现设备正在被其他视频使用而无法使用该设备的问题,你能给点建议吗?期待着你的答复,如果你想进一步探讨,请和我联系。
Email:old-j@163.net,qq:17096205

4,446

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧