【VC++开源代码栏目提醒】:网学会员为广大网友收集整理了,VC++编写摄像头录制系统(源代码) - 课程设计,希望对大家有所帮助!
VC编写基于摄像头录制系统首先编写该程序之前,必须要用到微软公司给我们提供的音视频函数库 vfw。
VFWVideo for Windows是 Microsoft 推出的关于数字视频的一个软件开发包,VFW的核心是 AVI 文件标准。
AVIAudio Video Interleave文件中的音、视频数据帧交错存放。
围绕 AVI 文件,VFW 推出了一整套完整的视频采集、压缩、解
压缩、回放和编辑的应用程序接口API。
由于 AVI 文件格式推出较早且在数字视频技术中有广泛的应用,所以 VFW 仍然有很大的实用价值,而且进一步发展的趋势。
只是需要将 VFW32.lib 在
VC开发环境中调用 VFW 和使用其它开发包没有什么不同,文件加入工程中,但在开放视频捕捉与压缩管理程序时需要其它
软件硬件设置。
VFW 为 AVI文件提供了丰富的处理函数和宏定义,AVI 文件的特点在于它是典型的数据流文件,它由视频流、音频流、文本流组成。
所以对 AVI 文件的处理主要是处理文件流。
废话不多说了:本程序主要由底层的
vc ApI 函数实现:今后该程序会转换成基于 MFC的源
代码开发。
首先用新建 Win32程序,建立一个空项目: 编写一个摄像头录制系统应用程序,
代码如下: 在新建的一个头文件和.cpp 文件取名为 VCaper.h, 把 VCaper.cpp。
vfw.lib 文件库导入到程序中。
头文件写入一些宏定义资源: define SELCAPDRVDLG 100define SELCAPDRVDLG_LSTBOX 101define SELCAPDRVDLG_BUTTON 103define EXIT 104define HELP 105define MINIMIZE 106define MOVE 107define CONNECT 113define BUTTONSIZE 15define PHOTO 114define RECORDVIDEO 115define COPY 116define SOURCE 117define FORMAT 118define DISPLAY 119 VCaper.cpp 文件实现
代码如下: includeltwindows.hgt //windows 编程
代码include ltvfw.hgt// 视频库include ltstringgtinclude ltcommdlg.hgt// common dialogsinclude quotVCaper.hquot// resource headerinclude ltstdio.hgt//字符串函数//include quotoldeb.hquot//字符串函数 LRESULT WINAPI MainWndProc HWND UINT WPARAM LPARAM // 选择捕捉
程序驱动程序LRESULT WINAPI SelCapDrvProc HWND UINT WPARAM LPARAM // 列举捕捉驱动int EnumCapDrv// 在主窗口创建按钮VOID APIENTRY HandlePopupMenuHWND POINT// 右键弹出菜单句柄DWORD WINAPI videoThreadProcLPVOID lParam// 视频程序线程/ 全程变量 / HANDLE ghInstance// 应用程序实例HWND hwndMain // 主要窗口句柄HWND hwndVideo// 视频捕捉窗口句柄HWND hwndSelCapDrvDlg// 选择捕捉驱动对话句柄HWND hwndSelCapDrvDlg_LBox// 选择捕捉驱动对话列举框句柄HWND hwndExit// 退出按钮HWND hwndMin// 最小化按钮HWND hwndHelp // 帮助按钮HWND hwndRecord// 录像按钮HWND hwndPhoto// 快照按钮HWND hwndSource//视频源选项HWND hwndFormat//视频格式御览HWND hwndConnect//数据块连接HANDLE hVideoThread// 停止录取视频线程HRGN hRegion1// 窗口修正区域CAPDRIVERCAPS CapDrvCaps// 驱动性能bool isRecordFileOpen false// 录像开始标记bool isPhotoFileOpen false//照相开始标记char recordFile260// 保持录像标记char photoFile260// 保持照相标记bool isPicFileOpen false// flag set if snapshot file is openchar pictureFile260// file to hold snapshotbool isRecording false// 判断是否录像bool threadEnd false// 判断视频线程是否终止/ Function: int PASCAL WinMainHINSTANCE HINSTANCE LPSTR int 用途: 应用程序初始化 注释: 注册窗口类 创建显示主要窗口 进入消息循环 /int PASCAL WinMain HINSTANCE hInstance//HINSTANCE:实例的句柄Handle to aninstance HINSTANCE hPrevInstance LPSTR lpszCmdLine int nCmdShow WNDCLASS wc//WNDCLASS 结构包含了 RegisterClass 函数
注册窗口类时的窗口类属性 MSG msg//如果不是前实例 if hPrevInstance wc.lpszClassName quotGenericAppClassquot wc.lpfnWndProc MainWndProc//函数名代表首地址指定一个回调函数 wc.style CS_OWNDC CS_VREDRAW CS_HREDRAW wc.hInstance hInstance wc.hIcon LoadIcon NULL IDI_APPLICATION wc.hCursor LoadCursor NULL IDC_ARROW wc.hbrBackground CreateSolidBrush RGB200 200100 wc.lpszMenuName quotGenericAppMenuquot wc.cbClsExtra 0 wc.cbWndExtra 0 RegisterClass ampwc //注册窗口类 ghInstance hInstance hwndMain CreateWindow quotGenericAppClassquot//该函数创建一个重叠式窗口、弹出式窗口或子窗口。
quot小型视频监控
系统quot WS_OVERLAPPED //WS_OVERLAPPEDWINDOWWS_HSCROLLWS_VSCROLLWS_VISIBLE 80 60 1100 670 NULL //quot家庭视频监控系统quot NULL hInstance NULL ShowWindow hwndMain nCmdShow //显示窗口 //将主要的窗户设定为区域 SetWindowRgnhwndMainhRegion11//注释掉此句的话则显示矩形窗口但是也同时显示一个圆角矩形 while GetMessage ampmsg NULL 0 0 TranslateMessage ampmsg //该函数将虚拟键消息转换为字符消息。
字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数 GetMessage 或 PeekMessage 时被读出 DispatchMessage ampmsg //该函数调度一个消息给窗口程序。
通常调度从GetMessage 取得的消息。
消息被调度到的窗口程序即是 MainProc函数 return msg.wParam/ Function: LRESULT CALLBACK MainWndProcHWND UINT WPARAM LPARAM 目的:应用程序的信息 注释: 下面的消息将被处理 WM_PAINT WM_CREATE WM_DESTROY /LRESULT CALLBACK MainWndProc HWND hwndMain UINT msg WPARAM wParam LPARAM lParam //这就表示此函数是一个回调函数。
在 MFC 中,得到 Message 消息以后系统会进行回调, //当然,我们需要编写一个回调函数来响应。
为了区别于其它函数,在回调函数前加上 LRESULT CALLBACK HDC hDC GetDChwndMain//该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄, //以后可以在 GDI 函数中使用该句柄来在设备上下文环境中绘图 RECT rc // 客户区域client area POINT pt // 鼠标点击位置location of mouse click switch msg case WM_LBUTTONDBLCLK://微软 WINDOWS 窗口消息.表示左键双击事件该消息可由 Win32底层函数 PeekMessage 和 GetMessage 取得 SetFocushwndMain//此功能设置键盘焦点到指定的窗口。
随后的所有键盘输入是针对此窗口。
窗口,如果有的话,以前的键盘焦点失去它。
break case WM_RBUTTONDOWN: //右键按下 // Get the bounding rectangle of the client area. GetClientRecthwndMain LPRECT amprc //该函数获取窗口客户区的坐标。
// Get the client coordinates for the mouse click. pt.x LOWORDlParam //This macro retrieves the low-order word from thespecified 32-bit value. pt.y HIWORDlParam //This macro retrieves the high-order
word from thespecified 32-bit value // If the mouse click took place inside the client area execute theapplication-defined function that displays the shortcut menu. if PtInRectLPRECT amprc pt //判断点是否在矩形中 HandlePopupMenuhwndMain pt break/ WM_PAINT: / case WM_PAINT://当视窗显示区域的一部分显示内容或者全部变为「无效」, //以致于必须「更新画面」时,将由这个讯息通知程式 //给该区域一个边框Give the region a red border FrameRgnhDChRegion1CreateSolidBrushRGB255255022//TheFrameRgn function draws a border around the specified region by using the specifiedbrush BringWindowToTophwndSelCapDrvDlg// 将对话框置于前端bring our dialog tothe foreground return DefWindowProc hwndMain msg wParam lParam //该函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理。
//该函数确保每一个消息得到处理。
调用 DefWindowProc 函数时使用窗口过程接收的相同参数/ WM_COMMAND: / case WM_COMMAND://消息被发送当用户从菜单中选择一项当一个控制消息发出给它的父窗口 //或是一个加速按键被释放一个窗口通过 WindowProc 接收消息 CAPSTATUS CapStatus switch wParam case SOURCE: ifCapDrvCaps.fHasDlgVideoSource capDlgVideoSourcehwndVideo break case FORMAT: ifCapDrvCaps.fHasDlgVideoFormat capDlgVideoFormathwndMain capGetStatushwndVideo ampCapStatus sizeofCAPSTATUS //来得到当前捕获窗口的状态 SetWindowPoshwndVideo NULL 0 0 CapStatus.uiImageWidth CapStatus.uiImageHeight SWP_NOZORDER SWP_NOMOVE break// case DISPLAY:// if CapDrvCaps.fHasDlgVideoDisplay// capDlgVideoDisplayhwndVideo// break case EXIT: SendMessagehwndMain WM_SYSCOMMAND SC_CLOSE 0 break case MINIMIZE: SendMessagehwndMain WM_SYSCOMMAND SC_MINIMIZE 0 break case HELP: SendMessagehwndMain WM_SYSCOMMAND SC_CONTEXTHELP0 break case PHOTO: //capFileSaveDIBhwndPhotoquottest.bmpquot // ifHIWORDwParam BN_CLICKED ampamp HWND lParam hwndPhoto if isPhotoFileOpen //MessageBoxhwndMain quotOKquotquotFile warningquot MB_YESNO MB_ICONWARNING OPENFILENAME ofnp// open file name structure // initialize OPENFILENAME ZeroMemoryampofnp sizeofOPENFILENAME ofnp.lStructSize sizeofOPENFILENAME ofnp.hwndOwner hwndMain ofnp.lpstrFile photoFile ofnp.nMaxFile sizeofphotoFile ofnp.lpstrFilter quot.bmpquot ofnp.nFilterIndex 1 ofnp.lpstrFileTitle NULL ofnp.nMaxFileTitle 0 ofnp.lpstrInitialDir NULL ofnp.Flags OFN_PATHMUSTEXIST OFN_FILEMUSTEXIST ifGetSaveFileNameampofnp TRUE strcpyphotoFile ofnp.lpstrFile strcatphotoFile quot.bmpquot capDriverConnect hwndPhoto 0 //与驱动程式连结 capOverlayhwndPhototrue //使用 hardware overlay 使 video input directlyintoframebuffer,使不用 CPU capPreviewhwndPhototrue //抓取影像出现在视窗/ capPreviewScalehwndPhototrue //使影像延伸到所设定的视窗大小 capPreviewRatehwndPhoto 1000/30 //每秒影像变化张数 capPreviewhwndPhototrue capGrabFrameNoStophwndPhoto capEditCopyhwndPhoto capFileSaveDIBhwndPhotophotoFile break ///////////////////////////////////////////////////////////////////////////////// //此处加快照
代码 怎么无法实现///////////////////////////////////////////////////////////////////////////////// /case CONNECT: MessageBoxhwndMain quotOKquotquotFile warningquot MB_YESNO MB_ICONWARNING / case RECORDVIDEO://录制视频 ifHIWORDwParam BN_CLICKED ampamp HWND lParam hwndRecord OPENFILENAME ofn if isRecordFileOpen // initialize OPENFILENAME ZeroMemoryampofn sizeofOPENFILENAME ofn.lStructSize sizeofOPENFILENAME ofn.hwndOwner hwndMain ofn.lpstrFile recordFile ofn.nMaxFile sizeofrecordFile ofn.lpstrFilter quot.aviquot ofn.nFilterIndex 1 ofn.lpstrFileTitle NULL ofn.nMaxFileTitle 0 ofn.lpstrInitialDir NULL ofn.Flags OFN_PATHMUSTEXIST OFN_FILEMUSTEXIST // 显示保存对话框Display the Save dialog box. ifGetSaveFileNameampofn TRUE strcpyrecordFile ofn.lpstrFile strcatrecordFile quot.aviquot isRecordFileOpen true // 创建视频采集线程create the video capture thread DWORD id SECURITY_ATTRIBUTES sa sa.nLength sizeofSECURITY_ATTRIBUTES sa.lpSecurityDescriptor NULL sa.bInheritHandle TRUE hVideoThread CreateThreadampsa ULONG0 videoThreadProc LPVOIDULONG0 ULONG0 ampid ifhVideoThread NULL//如果建立线程失败则弹出对话框提示 MessageBoxNULL quotCreation of Record Thread failedquot quotThreadquot MB_OK MB_ICONEXCLAMATION break //CAPINFOCHUNK chic if isRecordFileOpen // 已经有一个选择 ifisRecording// 已经在录制 threadEnd true // 结束捕获并保存它 capFileSaveAshwndVideo recordFile // 将录制按钮的文本设为quot录制视频quot SetWindowTexthwndRecord quot录像quot isRecording false break ifisRecording // 没有在录制但是已经选择了一个文件 int a 0 MessageBoxhwndMain quotDo you want to write over the open filequot quotFile warningquot MB_YESNO MB_ICONWARNING if a IDYES isRecordFileOpen false SendMessagehwndMain WM_COMMAND MAKEWPARAMRECORDVIDEOBN_CLICKED LPARAM hwndRecord if a IDYES capCaptureSequencehwndVideo isRecording true break break break/ WM_CREATE: / case WM_CREATE: // 创建主区域make the main region //创建一个圆角矩形,该矩形由 X1,Y1-X2,Y2确定,并由 X3,Y3确定的椭圆描述圆角弧度返回值 Long,执行成功则为区域句柄,失败则为0 RECT helpRect minRect exitRect HRGN helpRgn minRgn exitRgn hRegion1 CreateRoundRectRgn100100.