📄 capturewnd.cpp
字号:
#include "StdAfx.h"
#include "capturewnd.h"
#include <math.h>
#include <TIME.H>
#include "HSI.h"
//定义一个枚举类型
enum CAPTURESET{VideoFormat,VideoDisplay,VidoeSource,VideoCompression};
LRESULT CALLBACK CCaptureWnd::CallBackOnFrameForAlign(HWND h_Wnd,VIDEOHDR *lpVHDR)
{
BITMAPINFO *lpBmp;
DWORD VideoFormatSize;
DWORD nWidth;
DWORD nHeight;
WORD bitsCount;
LPBYTE lpImage;
DWORD x;
DWORD y;
DWORD nXpos;
DWORD nYpos;
//------------------------------------
VideoFormatSize=capGetVideoFormatSize(h_Wnd);
lpBmp=(BITMAPINFO *)new unsigned char[VideoFormatSize];
capGetVideoFormat(h_Wnd,lpBmp,VideoFormatSize);
nWidth=(lpBmp->bmiHeader).biWidth;
nHeight=lpBmp->bmiHeader.biHeight;
bitsCount=lpBmp->bmiHeader.biBitCount;
if(bitsCount!=24||lpBmp->bmiHeader.biCompression!=BI_RGB)
{
capSetCallbackOnFrame(h_Wnd,NULL);
AfxMessageBox("视频格式设定不正确!!\n\n 请设为RGB 24");
return FALSE;
}
//------------------------------------
lpImage=lpVHDR->lpData;
DWORD XandY=(DWORD)capGetUserData(h_Wnd);
nXpos=LOWORD(XandY);
nYpos=HIWORD(XandY);
nYpos=nHeight-1-nYpos;
//定位到实际像素点存放每一行像素点临时计算结果
for( x=0;x<nWidth;x++)
{
if((x%10)<5)
{
lpImage[3*nWidth*nYpos+3*x]=0;//B
lpImage[3*nWidth*nYpos+3*x+1]=0;//G
lpImage[3*nWidth*nYpos+3*x+2]=255;//R
}
}
for( y=0;y<nHeight;y++)
{
if((y%10)<5)
{
lpImage[3*nWidth*y+3*nXpos]=0;//B
lpImage[3*nWidth*y+3*nXpos+1]=0;//G
lpImage[3*nWidth*y+3*nXpos+2]=255;//R
}
}
return TRUE;
}
LRESULT CALLBACK CCaptureWnd::CallBackOnFrameForRoute(HWND h_Wnd,VIDEOHDR *lpVHDR)
{
BITMAPINFO *lpBmp;
DWORD VideoFormatSize;
DWORD nWidth;
DWORD nHeight;
WORD bitsCount;
LPBYTE lpImage;
//------------------------------------
VideoFormatSize=capGetVideoFormatSize(h_Wnd);
lpBmp=(BITMAPINFO *)new unsigned char[VideoFormatSize];
capGetVideoFormat(h_Wnd,lpBmp,VideoFormatSize);
nWidth=(lpBmp->bmiHeader).biWidth;
nHeight=lpBmp->bmiHeader.biHeight;
bitsCount=lpBmp->bmiHeader.biBitCount;
if(bitsCount!=24||lpBmp->bmiHeader.biCompression!=BI_RGB)
{
capSetCallbackOnFrame(h_Wnd,NULL);
AfxMessageBox("视频格式设定不正确!!\n\n 请设为RGB 24");
return FALSE;
}
//------------------------------------
lpImage=lpVHDR->lpData;
DWORD time=lpVHDR->dwTimeCaptured;
// AfxGetApp()->m_pMainWnd->PostMessage(WM_MEASUREDATA,time, 0) ;
return TRUE;
}
CCaptureWnd::CCaptureWnd(void)
{
m_hCapWnd=NULL;
//szPath="VFW.avi";
}
CCaptureWnd::~CCaptureWnd(void)
{
capDriverDisconnect (m_hCapWnd);
}
BOOL CCaptureWnd::bofVFW(void)
{
BOOL m_bVFW=FALSE;
char achDeviceVersion[80]; //设备版木信息
char achDeviceAndVersion[160];//设备名及版木信息
int nIndex;
int DriverCount=0;//支持的设备驱动程序个数
for(nIndex=0; nIndex<10; nIndex++)
{
if (capGetDriverDescription (nIndex ,(LPSTR )achDeviceAndVersion,
sizeof(achDeviceAndVersion),(LPSTR )achDeviceVersion, sizeof(achDeviceVersion)))
{
strcat(achDeviceAndVersion,",");
strcat(achDeviceAndVersion, achDeviceVersion) ;
DriverCount++;
}
else
break;
}
if(DriverCount>0)m_bVFW=TRUE;
return m_bVFW;
}
BOOL CCaptureWnd::CreateCaptureWindow(HWND hWnd/*parent window*/)
{
if(hWnd==NULL||m_hCapWnd!=NULL)
return FALSE;
if(bofVFW()==FALSE)
{
AfxMessageBox("摄像头不支持VFW方式!\n请采用支持VFW方式的摄像头!");
return FALSE;
}
int nIndex=0;
CAPDRIVERCAPS m_CapDrvCap; // CAPDRIVERCAPS结构,定义驱动器性能
RECT rc;
GetWindowRect(hWnd, &rc) ;
m_hCapWnd=capCreateCaptureWindow(NULL ,
WS_CHILD|WS_VISIBLE,0,0,
(rc.right -rc.left),(rc.bottom-rc.top ),
hWnd,//parent window
1//child window id
);
ASSERT (m_hCapWnd);
////////////////////////////////////////
for(nIndex=0;nIndex<10;nIndex++)
{
if (capDriverConnect (m_hCapWnd,nIndex))//连接第0号驱动器
{
capDriverGetCaps (m_hCapWnd, &m_CapDrvCap,sizeof (CAPDRIVERCAPS));//得到驱动器的性能
if (m_CapDrvCap.fCaptureInitialized ) //如果初始化成功
{
capPreviewRate (m_hCapWnd,15); //设置预示帧频
if(m_CapDrvCap.fHasOverlay)
capOverlay(m_hCapWnd, TRUE);//设置叠加方式
else
capPreview (m_hCapWnd, TRUE); //设置预示方式
return TRUE;
}
}
}
AfxMessageBox("视频捕捉卡初始化失败或与视频捕捉卡连接失败!");
return FALSE;
}
int CCaptureWnd::CaptureSetup(int SETUP)
{
if(m_hCapWnd==NULL)
return -1;
CAPDRIVERCAPS CapDrvCaps;
//CAPDRIVERCAPS结构,定义了捕获驱动器的能力
int result=-1;
capDriverGetCaps(m_hCapWnd,&CapDrvCaps,sizeof(CAPDRIVERCAPS));//获取视频设备能力
switch(SETUP)
{
case VideoDisplay: //如果支持视频显示格式选择,则弹出视频显示格式选择对话框
if (CapDrvCaps.fHasDlgVideoDisplay )
{
capDlgVideoDisplay(m_hCapWnd);
result=SETUP;
}
break;
case VideoFormat: //如果支持视频格式选择,则弹出视频格式选择对话框
if (CapDrvCaps.fHasDlgVideoFormat )
{
capDlgVideoFormat(m_hCapWnd);
result=SETUP;
}
break;
case VidoeSource: //如果支持视频源选择,则弹出视频源选择对话框
if (CapDrvCaps.fHasDlgVideoSource )
{
capDlgVideoSource(m_hCapWnd);
result=SETUP;
}
break;
case VideoCompression: //弹出视频压缩选择对话框
{
capDlgVideoCompression(m_hCapWnd);
result=SETUP;
}
break;
default:
break;
}
return result;
}
void CCaptureWnd::SaveAVI(void)
{
capFileGetCaptureFile (m_hCapWnd, szPath,sizeof(szPath));
CFileDialog dlgFile (FALSE /*bOpenFileDialog*/,
"NULL" /*AVI1pszDefEzt*/,
szPath/*1pszFileName*/,
OFN_HIDEREADONLY /* flags */,
"(VFW) *.avi |*.avi||",
NULL /* hwndParent */);
if (dlgFile.DoModal()==IDOK)
{
memcpy(szPath,dlgFile.m_ofn.lpstrFile,80);
capFileSetCaptureFile(m_hCapWnd, (LPSTR)szPath);
capCaptureSequence(m_hCapWnd);
}
return;
}
HGLOBAL CCaptureWnd::GrabFrame(BOOL bStop)
{
HGLOBAL hGbl;
if(bStop)
{
capGrabFrame(m_hCapWnd);//截获当前图象
}
else
capGrabFrameNoStop(m_hCapWnd);
if(capEditCopy (m_hCapWnd)==FALSE)
{
AfxMessageBox("图象拷贝到剪贴板不成功!");
}
// capEditCopy (m_hCapWnd); //将图象拷贝到剪贴板
// 打开剪贴板
if (OpenClipboard(NULL))
{
// 读取剪贴板中的图像
hGbl = (HGLOBAL)::GetClipboardData(CF_DIB);
// 关闭剪贴板
CloseClipboard();
}
return hGbl;
}
void CCaptureWnd::Preview(BOOL bPreview)
{
capPreview (m_hCapWnd, bPreview);//预览模式显示视频
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -