-
win32 摄像头捕获系统vfw
- //win32 摄像头捕获系统vfw
- // VideoRecord.h
- /// 用于定义一些资源ID
- #include "resource.h"
-
- //#define EXIT 104
- #define HELP 105
- #define MINIMIZE 106
- //#define DISPLAY 107
- #define BUTTONSIZE 15
- #define PHOTO 108
- #define RECORDVIDEO 109
- // #define RESOURCE 110
- // #define FORMAT 111
- #define CONNECT 112
-
- #include <Windows.h>
- #include <STRING>
- #include <vfw.h>
- #include "VideoRecord.h"
-
- #pragma comment(lib, "vfw32.lib")
-
- LRESULT WINAPI MainWndProc( HWND, UINT, WPARAM, LPARAM );
- LRESULT WINAPI SelCapDrcProc( HWND, UINT, WPARAM, LPARAM );
- int EnumCapDrv();
- VOID APIENTRY HandlePopupMenu(HWND, POINT);
- WORD WINAPI VideoThreadProc( LPVOID lParam);
-
-
-
- HANDLE ghInstance;
- HWND hwndMain;
- HWND hwndVideo;
- HWND hwndSelCapDrvDlg;
- HWND hwndSelCapDrvLBox;
- HWND hwndExit;
- HWND hwndMin;
- HWND hwndHelp;
- HWND hwndPhoto;
- HWND hwndRecord;
- HWND hwndBtnExit;
- HWND hwndSource;
- HWND hwndFormat;
- HWND hwndConnect;
- HANDLE hVideoTread;
- HRGN hRoundRgn;
- CAPDRIVERCAPS capDrvCaps;
- bool bRecordFileOpen = false;
- bool bPhotoFileOpen = false;
- bool bRecording = false;
- bool bThreadEnd = false;
- char recordFile[260];
- char photoFile[260];
- char gachBuffer[260];
-
-
-
-
-
-
-
- LRESULT CALLBACK ErrorCallbackProc(HWND hWnd,int nErrID,LPSTR lpErrorText)
- {
- if(!hwndMain)
- return FALSE;
- if(nErrID==0)
- return TRUE;
- wsprintf(gachBuffer,"Error# %d",nErrID);
- MessageBox(hWnd, lpErrorText, gachBuffer,MB_OK | MB_ICONEXCLAMATION);
- return (LRESULT) TRUE;
- }
-
-
- int PASCAL WinMain( IN HINSTANCE hInstance,
- IN HINSTANCE hPrevInstance,
- IN LPSTR lpCmdLine,
- IN int nShowCmd )
- {
- WNDCLASS wndClass;
- MSG msg;
- char className[] = "VideoClass";
-
- if (!hPrevInstance)
- {
- wndClass.lpszClassName = className;
- wndClass.lpfnWndProc = MainWndProc;
- wndClass.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
- wndClass.hInstance = hInstance;
- wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
- wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- wndClass.hbrBackground = CreateSolidBrush( RGB(200,200,100) );
- wndClass.lpszMenuName = NULL;
- wndClass.cbClsExtra = 0;
- wndClass.cbWndExtra = 0;
- RegisterClass( &wndClass );
- }
- ghInstance = hInstance;
-
- hwndMain = CreateWindow(className,
- "视频监控系统",
- WS_POPUP|WS_OVERLAPPED,
- GetSystemMetrics(SM_CXFULLSCREEN)/2 - 600/2,
- GetSystemMetrics(SM_CYFULLSCREEN)/2-600/2,
- 600, 600,
- NULL,
- NULL,
- hInstance,
- NULL);
-
- ShowWindow(hwndMain, nShowCmd);
-
-
- SetWindowRgn(hwndMain, hRoundRgn, 1);
-
- while( GetMessage(&msg, NULL, 0, 0))
- {
- TranslateMessage(&msg);
-
- DispatchMessage(&msg);
-
- }
- return msg.wParam;
- }
-
- LRESULT CALLBACK MainWndProc( HWND hMain, UINT msg, WPARAM wParam, LPARAM lParam )
- {
- HDC hdc = GetDC(hMain);
- RECT rc;
- POINT pt;
- HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
- switch(msg)
- {
- case WM_LBUTTONDBLCLK:
- SetFocus(hMain);
- break;
- case WM_RBUTTONDOWN:
- GetClientRect(hMain, (LPRECT)&rc);
- pt.y = HIWORD(lParam);
- pt.x = LOWORD(lParam);
- if ( PtInRect(&rc, pt) )
- {
- HandlePopupMenu(hMain, pt);
- }
- break;
- case WM_PAINT:
- RECT helpRect, minRect, exitRect;
- HRGN helpRgn, minRgn, exitRgn;
- FrameRgn(hdc, hRoundRgn, CreateSolidBrush(RGB(0,0,0)), 2, 2);
- BringWindowToTop(hwndSelCapDrvDlg);
- return DefWindowProc(hMain, msg, wParam, lParam);
- case WM_CREATE:
-
- capSetCallbackOnError(hwndVideo, (FARPROC)ErrorCallbackProc);
-
- hRoundRgn = CreateRoundRectRgn(100, 70, 500, 460, 20, 20);
-
- hwndVideo = capCreateCaptureWindow((LPSTR)"My Capture Window",
- WS_CHILD|WS_VISIBLE,
- 140, 100, 320, 280,
- (HWND)hMain,
- (int)1);
- hwndExit = CreateWindow("button",
- "x",
- WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_CENTER|BS_VCENTER,
- 470, 75, BUTTONSIZE, BUTTONSIZE,
- hMain,
- (HMENU)EXIT,
- (HINSTANCE)ghInstance,
- (LPVOID)NULL );
- hwndMin = CreateWindow("button",
- "-",
- WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_CENTER|BS_VCENTER,
- 450, 75, BUTTONSIZE, BUTTONSIZE,
- hMain,
- (HMENU)MINIMIZE,
- (HINSTANCE)ghInstance,
- (LPVOID)NULL );
- hwndHelp = CreateWindow("button",
- "?",
- WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON,
- 430, 75, BUTTONSIZE, BUTTONSIZE,
- hMain,
- (HMENU)HELP,
- (HINSTANCE)ghInstance,
- (LPVOID)NULL );
- hwndPhoto = CreateWindow("button",
- "照 相",
- WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
- 150, 410, 50, 20,
- hMain,
- (HMENU)PHOTO,
- (HINSTANCE)ghInstance,
- (LPVOID)NULL );
- SendMessage(hwndPhoto, WM_SETFONT, (WPARAM)hFont, 1);
- hwndRecord = CreateWindow("button",
- "录 像",
- WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_VCENTER|BS_CENTER,
- 220, 410, 50, 20,
- hMain,
- (HMENU)RECORDVIDEO,
- (HINSTANCE)ghInstance,
- (LPVOID)NULL );
- SendMessage(hwndRecord, WM_SETFONT, (WPARAM)hFont, 1);
- hwndBtnExit = CreateWindow("button",
- "退 出",
- WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_VCENTER|BS_CENTER,
- 400, 410, 50, 20,
- hMain,
- (HMENU)EXIT,
- (HINSTANCE)ghInstance,
- (LPVOID)NULL );
- SendMessage(hwndBtnExit, WM_SETFONT, (WPARAM)hFont, 1);
-
- GetClientRect(hwndHelp, &helpRect);
- GetClientRect(hwndMin, &minRect);
- GetClientRect(hwndExit, &exitRect);
-
- helpRgn = CreateEllipticRgnIndirect(&helpRect);
- minRgn = CreateEllipticRgnIndirect(&minRect);
- exitRgn = CreateEllipticRgnIndirect(&exitRect);
-
- SetWindowRgn(hwndExit,exitRgn,1);
- SetWindowRgn(hwndMin,minRgn,1);
- SetWindowRgn(hwndHelp,helpRgn,1);
-
-
- hwndSelCapDrvDlg = CreateDialog((HINSTANCE)ghInstance,
- MAKEINTRESOURCE(DLG_SELCAPDRIVER),
- 0, (DLGPROC)SelCapDrcProc);
- hwndSelCapDrvLBox = GetDlgItem(hwndSelCapDrvDlg, LISTBOX_SELCAPDRIVER);
-
- EnumCapDrv();
- break;
- case WM_COMMAND:
- CAPSTATUS capStatus;
- switch(wParam)
- {
- case EXIT:
- SendMessage(hMain, WM_SYSCOMMAND, SC_CLOSE, 0);
- break;
- case MINIMIZE:
- SendMessage(hMain, WM_SYSCOMMAND, SC_MINIMIZE, 0);
- break;
- case HELP:
- SendMessage(hMain, WM_SYSCOMMAND, SC_CONTEXTHELP, 0);
- break;
- case RESOURCE:
- if (capDrvCaps.fHasDlgVideoSource)
- {
- capDlgVideoSource(hwndVideo);
- }
- break;
- case FORMAT:
- if (capDrvCaps.fHasDlgVideoFormat)
- {
- capDlgVideoFormat(hwndVideo);
- }
- break;
- case CONNECT:
- break;
- case DISPLAY:
- if (capDrvCaps.fHasDlgVideoDisplay)
- {
- capDlgVideoDisplay(hMain);
- capGetStatus(hwndVideo, &capStatus, sizeof(CAPSTATUS));
- SetWindowPos(hwndVideo, NULL, 0, 0, capStatus.uiImageWidth, capStatus.uiImageHeight, SWP_NOZORDER|SWP_NOMOVE);
- }
- break;
- case PHOTO:
- if ( capFileSaveDIB(hwndVideo, "test.bmp") ){
- MessageBox(hMain, "Save Bmp File Succeeded!", "photo save", MB_OK|MB_ICONINFORMATION);
- }
- else break;
- if (!bPhotoFileOpen)
- {
- OPENFILENAME ofnp;
- ZeroMemory(&ofnp, sizeof(OPENFILENAME));
- ofnp.lStructSize = sizeof(OPENFILENAME);
- ofnp.hwndOwner = hMain;
- ofnp.lpstrFile = photoFile;
- ofnp.lpstrFilter = "*.bmp";
- ofnp.nMaxFile = sizeof(photoFile);
- ofnp.nFilterIndex = 1;
- ofnp.nMaxFileTitle = 0;
- ofnp.lpstrInitialDir = NULL;
- ofnp.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;
-
- if (GetSaveFileName(&ofnp) == TRUE)
- {
- bPhotoFileOpen = TRUE;
- strcpy(photoFile, ofnp.lpstrFile);
- strcat(photoFile, ".bmp");
- capDriverConnect(hwndPhoto, 0);
- capOverlay(hwndPhoto, TRUE);
-
- capPreview(hwndVideo, TRUE);
- capPreviewScale(hwndVideo, TRUE);
- capPreviewRate(hwndVideo, 1000/30);
- capPreview(hwndVideo, TRUE);
- capGrabFrameNoStop(hwndVideo);
- capEditCopy(hwndVideo);
- if (capFileSaveDIB(hwndVideo, photoFile)){
- MessageBox(hMain, "Save Bmp File Succeeded!", "photo save", MB_OK|MB_ICONINFORMATION);
- }
- break;
- }
- }
- break;
- case RECORDVIDEO:
- if (HIWORD(wParam) == BN_CLICKED && (HWND)lParam == hwndRecord)
- {
- OPENFILENAME ofnp;
- if (!bRecordFileOpen)
- {
- ZeroMemory(&ofnp, sizeof(OPENFILENAME));
- ofnp.lStructSize = sizeof(OPENFILENAME);
- ofnp.nMaxFile = sizeof(recordFile);
- ofnp.hwndOwner = hMain;
- ofnp.lpstrFile = recordFile;
- ofnp.lpstrFilter = "*.avi";
- ofnp.lpstrInitialDir = NULL;
- ofnp.nFilterIndex = 1;
- ofnp.lpstrFileTitle = NULL;
- ofnp.nMaxFileTitle = 0;
- ofnp.Flags = OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;
-
- if (GetSaveFileName(&ofnp) == TRUE)
- {
- strcpy(recordFile, ofnp.lpstrFile);
- strcat(recordFile, ".avi");
- bRecordFileOpen = TRUE;
-
- DWORD id;
- SECURITY_ATTRIBUTES sa;
- sa.nLength = sizeof(SECURITY_ATTRIBUTES);
- sa.lpSecurityDescriptor = NULL;
- sa.bInheritHandle = TRUE;
- hVideoTread = CreateThread(&sa,
- (ULONG)0,
- (LPTHREAD_START_ROUTINE)VideoThreadProc,
- (LPVOID)(ULONG)0,
- 0,
- &id);
-
- if (hVideoTread == NULL)
- {
- MessageBox(NULL, "Video Thread Create Failure!", "Thread", MB_OK|MB_ICONINFORMATION);
- }
- }
- break;
- }
- if (bRecordFileOpen)
- {
- if (bRecording)
- {
- bThreadEnd = true;
-
- if ( capFileSaveAs(hwndVideo, recordFile) ){
- MessageBox(NULL, "Save Avi File Succeeded!", "RecordVideo", MB_OK|MB_ICONINFORMATION);
- }
- SetWindowText(hwndRecord, "录 像");
- bRecording = false;
- break;
- }
- else
- {
- int rt = 0;
- rt = MessageBox(hMain, "Do you want write over that file?", "系统提示", MB_YESNO|MB_ICONINFORMATION);
- if (rt == IDYES)
- {
- if (capCaptureSequence(hwndRecord))
- {
- bRecording = true;
- SetWindowText(hwndRecord, "停 止");
- }
- }
- else
- {
- bRecordFileOpen = false;
- SendMessage(hMain, WM_COMMAND, MAKEWPARAM(RECORDVIDEO, BN_CLICKED), (LPARAM)hwndRecord);
- }
- break;
- }
- break;
- }
- }
- }
- break;
- case WM_DESTROY:
- capSetCallbackOnError(hwndVideo, NULL);
- capPreview(hwndVideo, FALSE);
- capCaptureAbort(hwndVideo);
- capDriverDisconnect(hwndVideo);
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hMain, msg, wParam, lParam);
- }
- return 0;
- }
-
- LRESULT WINAPI SelCapDrcProc( HWND hMian, UINT msg, WPARAM wParam, LPARAM lParam )
- {
-
- switch(msg)
- {
- case WM_INITDIALOG:
- return TRUE;
- case WM_COMMAND:
- switch(wParam)
- {
- case BTN_SEL:
- int sel = 0;
- SendMessage(hwndSelCapDrvLBox, LB_GETSELITEMS, 1, sel );
- SendMessage(hwndVideo, WM_CAP_DRIVER_CONNECT, sel, 0L);
- SendMessage(hwndSelCapDrvDlg, WM_CLOSE, 0, 0);
- SendMessage(hwndVideo, WM_CAP_DRIVER_GET_CAPS, sizeof(CAPDRIVERCAPS), (long)(LPVOID)&capDrvCaps);
- if (capDrvCaps.fHasOverlay)
- {
- capOverlay(hwndVideo, TRUE);
- }
- capPreviewRate(hwndVideo, 66);
- if ( !capPreview(hwndVideo, TRUE))
- {
- MessageBox(NULL, "预览启动失败", "提示", MB_OK|MB_ICONINFORMATION);
- SendMessage(hMian, WM_COMMAND, EXIT, 0);
- return FALSE;
-
- }
- }
- return TRUE;
- case WM_CLOSE:
- DestroyWindow(hwndSelCapDrvDlg);
- return TRUE;
- }
- return (0L);
- }
-
- int EnumCapDrv()
- {
- char drvName[100];
- char drvVesion[100];
- char drvStr[200];
- for (int i = 0; i < 5; i++)
- {
- if ( capGetDriverDescription(i, drvName, sizeof(drvName), drvVesion, sizeof(drvVesion)) )
- {
- strcpy(drvStr, drvName);
- strcat(drvStr, " ");
- strcat(drvStr, drvVesion);
- SendMessage(hwndSelCapDrvLBox, LB_ADDSTRING, 0, (LPARAM)drvStr);
- SendMessage(hwndSelCapDrvLBox, LB_SETITEMDATA, i, (LPARAM)i);
- }
- }
- return 0;
- }
-
- VOID APIENTRY HandlePopupMenu( HWND hwnd, POINT pt )
- {
- HMENU hmenu;
- HMENU hPopupMenu;
- hmenu = LoadMenu((HINSTANCE)ghInstance, MAKEINTRESOURCE(IDR_POPUPMENU));
- if(hmenu == NULL) return;
-
- hPopupMenu = GetSubMenu(hmenu, 0);
-
- ClientToScreen(hwnd, &pt);
- TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN|TPM_LEFTBUTTON, pt.x, pt.y, 0, hwnd, NULL);
- DestroyMenu(hmenu);
- }
-
- WORD WINAPI VideoThreadProc( LPVOID lParam )
- {
-
- if( capCaptureSequence(hwndVideo) )
- {
- SetWindowText(hwndRecord, "停 止");
- MessageBox(NULL, "Start to capture video.", "提示", MB_OK|MB_ICONINFORMATION);
- bRecording = true;
- }
- while(!bThreadEnd);
- MessageBox(NULL, "Leaving Record Thread", "Thread",NULL);
- return 0;
- }
-
相关阅读:
RestTemplateConfig写法,用于配置Template引擎模板
RedisUtil写法,好用
ftpUtil写法,记录一下
生成唯一id写法,雪花算法
base64编码转图片,图片转base64编码
MultipartFile上传图片的写法,记录一下。
httpClientUtil的put请求
httpClientUtil的post请求
python time和datetime
ubuntu16.04TLS软件源update
-
原文地址:https://www.cnblogs.com/lidabo/p/3701651.html
Copyright © 2020-2023
润新知