1. //win32 摄像头捕获系统vfw
  1. //  VideoRecord.h
  2. ///  用于定义一些资源ID
  1. #include "resource.h"
  2. //#define EXIT  104
  3. #define HELP  105
  4. #define MINIMIZE 106
  5. //#define DISPLAY  107
  6. #define BUTTONSIZE  15
  7. #define PHOTO   108
  8. #define RECORDVIDEO 109
  9. // #define RESOURCE 110
  10. // #define FORMAT   111
  11. #define CONNECT 112
  1. #include <Windows.h>
  2. #include <STRING>
  3. #include <vfw.h>
  4. #include "VideoRecord.h"
  5. #pragma comment(lib, "vfw32.lib")
  6. LRESULT WINAPI MainWndProc( HWND, UINT, WPARAM, LPARAM );
  7. LRESULT WINAPI SelCapDrcProc( HWND, UINT, WPARAM, LPARAM );
  8. int EnumCapDrv();
  9. VOID APIENTRY HandlePopupMenu(HWND, POINT);  // 右键弹出菜单回调函数
  10. WORD WINAPI VideoThreadProc( LPVOID lParam); // 视频捕捉线程函数
  11. ////////////////全局变量
  12. HANDLE ghInstance;  // 应用程序实例
  13. HWND hwndMain;  // 主窗口句柄
  14. HWND hwndVideo;  // 视频捕捉窗口句柄
  15. HWND hwndSelCapDrvDlg; // 选择捕捉驱动对话框句柄
  16. HWND hwndSelCapDrvLBox; // 选择驱动对话框列举驱动名称列表框句柄
  17. HWND hwndExit;
  18. HWND hwndMin;
  19. HWND hwndHelp;
  20. HWND hwndPhoto;
  21. HWND hwndRecord;
  22. HWND hwndBtnExit;
  23. HWND hwndSource;
  24. HWND hwndFormat;
  25. HWND hwndConnect;
  26. HANDLE hVideoTread; // 视频采集线程
  27. HRGN hRoundRgn; // 窗口修正区域
  28. CAPDRIVERCAPS capDrvCaps; // 驱动性能
  29. bool bRecordFileOpen = false;  // 录像开始标志
  30. bool bPhotoFileOpen = false;  // 照相开始标志
  31. bool bRecording = false;  // 判断是否正在录像
  32. bool bThreadEnd = false; // 判断视频线程是否终止
  33. char recordFile[260]; //保持录像标志
  34. char photoFile[260]; // 保持照相标志
  35. char gachBuffer[260]; // 保存错误信息
  36. //////////////////////////////////////////////////////////////////////////////
  37. // ErrorCallbackProc:    错误回调函数,过capSetCallbackOnError宏来注册回调
  38. // hWnd:              捕获窗口句柄
  39. // nErrID:              错误代码
  40. // lpErrorText:          关于错误的文本信息
  41. ///////////////////////////////////////////////////////////////////////////////
  42. LRESULT CALLBACK ErrorCallbackProc(HWND hWnd,int nErrID,LPSTR lpErrorText)
  43. {
  44. if(!hwndMain)
  45. return FALSE;
  46. if(nErrID==0)
  47. return TRUE;//清除旧的错误
  48. wsprintf(gachBuffer,"Error# %d",nErrID);//显示错误标识和文本
  49. MessageBox(hWnd, lpErrorText, gachBuffer,MB_OK | MB_ICONEXCLAMATION);
  50. return (LRESULT) TRUE;
  51. }
  52. /////////////////////////////////////
  53. int PASCAL WinMain( IN HINSTANCE hInstance,
  54. IN HINSTANCE hPrevInstance,
  55. IN LPSTR lpCmdLine,
  56. IN int nShowCmd )
  57. {
  58. WNDCLASS wndClass;
  59. MSG msg;
  60. char className[] = "VideoClass";
  61. // 如果不是前实例
  62. if (!hPrevInstance)
  63. {
  64. wndClass.lpszClassName = className;
  65. wndClass.lpfnWndProc = MainWndProc;
  66. wndClass.style = CS_HREDRAW|CS_VREDRAW|CS_OWNDC;
  67. wndClass.hInstance = hInstance;
  68. wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  69. wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  70. wndClass.hbrBackground = CreateSolidBrush( RGB(200,200,100) );
  71. wndClass.lpszMenuName = NULL;
  72. wndClass.cbClsExtra = 0;
  73. wndClass.cbWndExtra = 0;
  74. RegisterClass( &wndClass );
  75. }
  76. ghInstance = hInstance;
  77. // 创建主窗口
  78. hwndMain = CreateWindow(className,
  79. "视频监控系统",
  80. WS_POPUP|WS_OVERLAPPED,
  81. GetSystemMetrics(SM_CXFULLSCREEN)/2 - 600/2,
  82. GetSystemMetrics(SM_CYFULLSCREEN)/2-600/2,
  83. 600, 600,
  84. NULL,
  85. NULL,
  86. hInstance,
  87. NULL);
  88. ShowWindow(hwndMain, nShowCmd);
  89. // 设定主窗口主要区域
  90. SetWindowRgn(hwndMain, hRoundRgn, 1);
  91. while( GetMessage(&msg, NULL, 0, 0))
  92. {
  93. TranslateMessage(&msg);//该函数将虚拟键消息转换为字符消息。
  94. //字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或PeekMessage时被读出
  95. DispatchMessage(&msg);//该函数调度一个消息给窗口程序。
  96. //通常调度从GetMessage取得的消息。消息被调度到的窗口程序即是MainProc()函数
  97. }
  98. return msg.wParam;
  99. }
  100. LRESULT CALLBACK MainWndProc( HWND hMain, UINT msg, WPARAM wParam, LPARAM lParam )
  101. {
  102. HDC hdc = GetDC(hMain);
  103. RECT rc;   // 客户区
  104. POINT pt;  // 鼠标位置
  105. HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
  106. switch(msg)
  107. {
  108. case WM_LBUTTONDBLCLK:
  109. SetFocus(hMain);
  110. break;
  111. case WM_RBUTTONDOWN:
  112. GetClientRect(hMain, (LPRECT)&rc);
  113. pt.y = HIWORD(lParam);
  114. pt.x = LOWORD(lParam);
  115. if ( PtInRect(&rc, pt) )
  116. {
  117. HandlePopupMenu(hMain, pt);
  118. }
  119. break;
  120. case WM_PAINT:
  121. RECT helpRect, minRect, exitRect;
  122. HRGN helpRgn, minRgn, exitRgn;
  123. FrameRgn(hdc, hRoundRgn, CreateSolidBrush(RGB(0,0,0)), 2, 2);
  124. BringWindowToTop(hwndSelCapDrvDlg);
  125. return DefWindowProc(hMain, msg, wParam, lParam);
  126. case WM_CREATE:
  127. // 注册错误提示回调函数
  128. capSetCallbackOnError(hwndVideo, (FARPROC)ErrorCallbackProc);
  129. // 主窗口主要圆角矩形区域
  130. hRoundRgn = CreateRoundRectRgn(100, 70, 500, 460, 20, 20);
  131. // 捕捉视频区域s
  132. hwndVideo = capCreateCaptureWindow((LPSTR)"My Capture Window",
  133. WS_CHILD|WS_VISIBLE,
  134. 140, 100, 320, 280,
  135. (HWND)hMain,
  136. (int)1);
  137. hwndExit = CreateWindow("button",    // 建立一个按钮,更多如BUTTON,COMBOBOX,LISTBOX
  138. "x",    // button text
  139. WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_CENTER|BS_VCENTER,
  140. 470, 75, BUTTONSIZE, BUTTONSIZE,
  141. hMain,
  142. (HMENU)EXIT,
  143. (HINSTANCE)ghInstance,
  144. (LPVOID)NULL );
  145. hwndMin = CreateWindow("button",    // 建立一个按钮,更多如BUTTON,COMBOBOX,LISTBOX
  146. "-",    // button text
  147. WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|BS_CENTER|BS_VCENTER,
  148. 450, 75, BUTTONSIZE, BUTTONSIZE,
  149. hMain,
  150. (HMENU)MINIMIZE,
  151. (HINSTANCE)ghInstance,
  152. (LPVOID)NULL );
  153. hwndHelp = CreateWindow("button",    // 建立一个按钮,更多如BUTTON,COMBOBOX,LISTBOX
  154. "?",    // button text
  155. WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON/*|BS_CENTER|BS_VCENTER*/,
  156. 430, 75, BUTTONSIZE, BUTTONSIZE,
  157. hMain,
  158. (HMENU)HELP,
  159. (HINSTANCE)ghInstance,
  160. (LPVOID)NULL );
  161. hwndPhoto = CreateWindow("button",
  162. "照 相",
  163. WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
  164. 150, 410, 50, 20,
  165. hMain,
  166. (HMENU)PHOTO,
  167. (HINSTANCE)ghInstance,
  168. (LPVOID)NULL );
  169. SendMessage(hwndPhoto, WM_SETFONT, (WPARAM)hFont, 1);  // 设置按钮字体为系统默认字体
  170. hwndRecord = CreateWindow("button",
  171. "录 像",
  172. WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_VCENTER|BS_CENTER,
  173. 220, 410, 50, 20,
  174. hMain,
  175. (HMENU)RECORDVIDEO,
  176. (HINSTANCE)ghInstance,
  177. (LPVOID)NULL );
  178. SendMessage(hwndRecord, WM_SETFONT, (WPARAM)hFont, 1);// 设置按钮字体为系统默认字体
  179. hwndBtnExit = CreateWindow("button",   // 退出按钮
  180. "退 出",
  181. WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_VCENTER|BS_CENTER,
  182. 400, 410, 50, 20,
  183. hMain,
  184. (HMENU)EXIT,
  185. (HINSTANCE)ghInstance,
  186. (LPVOID)NULL );
  187. SendMessage(hwndBtnExit, WM_SETFONT, (WPARAM)hFont, 1);
  188. // 设置按钮区域
  189. GetClientRect(hwndHelp, &helpRect);
  190. GetClientRect(hwndMin, &minRect);
  191. GetClientRect(hwndExit, &exitRect);
  192. helpRgn = CreateEllipticRgnIndirect(&helpRect);
  193. minRgn = CreateEllipticRgnIndirect(&minRect);
  194. exitRgn = CreateEllipticRgnIndirect(&exitRect);
  195. SetWindowRgn(hwndExit,exitRgn,1);
  196. SetWindowRgn(hwndMin,minRgn,1);
  197. SetWindowRgn(hwndHelp,helpRgn,1);
  198. // 创建选择驱动对话框
  199. hwndSelCapDrvDlg = CreateDialog((HINSTANCE)ghInstance,
  200. MAKEINTRESOURCE(DLG_SELCAPDRIVER),
  201. 0, (DLGPROC)SelCapDrcProc);
  202. hwndSelCapDrvLBox = GetDlgItem(hwndSelCapDrvDlg, LISTBOX_SELCAPDRIVER);
  203. EnumCapDrv();
  204. break;
  205. case WM_COMMAND:
  206. CAPSTATUS capStatus;
  207. switch(wParam)
  208. {
  209. case EXIT:  // 退出系统
  210. SendMessage(hMain, WM_SYSCOMMAND, SC_CLOSE, 0);
  211. break;
  212. case MINIMIZE: // 最小化
  213. SendMessage(hMain, WM_SYSCOMMAND, SC_MINIMIZE, 0);
  214. break;
  215. case HELP:  // 帮助按钮
  216. SendMessage(hMain, WM_SYSCOMMAND, SC_CONTEXTHELP, 0);
  217. break;
  218. case RESOURCE: // 视频源选项
  219. if (capDrvCaps.fHasDlgVideoSource)
  220. {
  221. capDlgVideoSource(hwndVideo);
  222. }
  223. break;
  224. case FORMAT:  // 视频格式选项
  225. if (capDrvCaps.fHasDlgVideoFormat)
  226. {
  227. capDlgVideoFormat(hwndVideo);
  228. }
  229. break;
  230. case CONNECT:
  231. break;
  232. case DISPLAY: // 视频显示选项
  233. if (capDrvCaps.fHasDlgVideoDisplay)
  234. {
  235. capDlgVideoDisplay(hMain);
  236. capGetStatus(hwndVideo, &capStatus, sizeof(CAPSTATUS));// 得到当前捕获窗口的状态
  237. SetWindowPos(hwndVideo, NULL, 0, 0, capStatus.uiImageWidth, capStatus.uiImageHeight, SWP_NOZORDER|SWP_NOMOVE);
  238. }
  239. break;
  240. case PHOTO:  // 抓取图片
  241. if ( capFileSaveDIB(hwndVideo, "test.bmp") ){
  242. MessageBox(hMain, "Save Bmp File Succeeded!", "photo save", MB_OK|MB_ICONINFORMATION);
  243. }
  244. else break;
  245. if (!bPhotoFileOpen)
  246. {
  247. OPENFILENAME ofnp;  // open file name structure
  248. ZeroMemory(&ofnp, sizeof(OPENFILENAME));
  249. ofnp.lStructSize = sizeof(OPENFILENAME);
  250. ofnp.hwndOwner = hMain;
  251. ofnp.lpstrFile = photoFile;
  252. ofnp.lpstrFilter = "*.bmp";
  253. ofnp.nMaxFile = sizeof(photoFile);
  254. ofnp.nFilterIndex = 1;
  255. ofnp.nMaxFileTitle = 0;
  256. ofnp.lpstrInitialDir = NULL;
  257. ofnp.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;
  258. // 显示保存文件对话框
  259. if (GetSaveFileName(&ofnp) == TRUE)
  260. {
  261. bPhotoFileOpen = TRUE;
  262. strcpy(photoFile, ofnp.lpstrFile);
  263. strcat(photoFile, ".bmp");
  264. capDriverConnect(hwndPhoto, 0);  // 与驱动连接
  265. capOverlay(hwndPhoto, TRUE); // //使用 hardware overlay
  266. //使 video input directlyinto framebuffer,使不用 CPU
  267. capPreview(hwndVideo, TRUE);  // 抓取图像显示在视窗
  268. capPreviewScale(hwndVideo, TRUE); // 使图像延伸到所设定的视窗大小
  269. capPreviewRate(hwndVideo, 1000/30); // 每秒图像变化张数
  270. capPreview(hwndVideo, TRUE); // 预览图像显示
  271. capGrabFrameNoStop(hwndVideo);
  272. capEditCopy(hwndVideo);
  273. if (capFileSaveDIB(hwndVideo, photoFile)){
  274. MessageBox(hMain, "Save Bmp File Succeeded!", "photo save", MB_OK|MB_ICONINFORMATION);
  275. }
  276. break;
  277. }
  278. }
  279. break;
  280. case RECORDVIDEO:  // 录制视频
  281. if (HIWORD(wParam) == BN_CLICKED && (HWND)lParam == hwndRecord)
  282. {
  283. OPENFILENAME ofnp;
  284. if (!bRecordFileOpen)
  285. {
  286. ZeroMemory(&ofnp, sizeof(OPENFILENAME));
  287. ofnp.lStructSize = sizeof(OPENFILENAME);
  288. ofnp.nMaxFile = sizeof(recordFile);
  289. ofnp.hwndOwner = hMain;
  290. ofnp.lpstrFile = recordFile;
  291. ofnp.lpstrFilter = "*.avi";
  292. ofnp.lpstrInitialDir = NULL;
  293. ofnp.nFilterIndex = 1;
  294. ofnp.lpstrFileTitle = NULL;
  295. ofnp.nMaxFileTitle = 0;
  296. ofnp.Flags = OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;
  297. // 显示保存文件对话框
  298. if (GetSaveFileName(&ofnp) == TRUE)
  299. {
  300. strcpy(recordFile, ofnp.lpstrFile);
  301. strcat(recordFile, ".avi");
  302. bRecordFileOpen = TRUE;
  303. // 创建视频采集线程
  304. DWORD id;
  305. SECURITY_ATTRIBUTES sa;
  306. sa.nLength = sizeof(SECURITY_ATTRIBUTES);
  307. sa.lpSecurityDescriptor = NULL;
  308. sa.bInheritHandle = TRUE;
  309. hVideoTread = CreateThread(&sa,
  310. (ULONG)0,
  311. (LPTHREAD_START_ROUTINE)VideoThreadProc,
  312. (LPVOID)(ULONG)0,
  313. 0,
  314. &id);
  315. // 如果创建线程失败,弹出提示对话框
  316. if (hVideoTread == NULL)
  317. {
  318. MessageBox(NULL, "Video Thread Create Failure!", "Thread", MB_OK|MB_ICONINFORMATION);
  319. }
  320. }
  321. break;
  322. }
  323. if (bRecordFileOpen)  // 已经打开一个选择对话框
  324. {
  325. if (bRecording)  // 已经在录制视频中
  326. {
  327. bThreadEnd = true;
  328. // 结束录制,并保存
  329. if ( capFileSaveAs(hwndVideo, recordFile) ){
  330. MessageBox(NULL, "Save Avi File Succeeded!", "RecordVideo", MB_OK|MB_ICONINFORMATION);
  331. }
  332. SetWindowText(hwndRecord, "录 像");
  333. bRecording = false;
  334. break;
  335. }
  336. else  // 没有录像但是选择了一个文件
  337. {
  338. int rt = 0;
  339. rt = MessageBox(hMain, "Do you want write over that file?", "系统提示", MB_YESNO|MB_ICONINFORMATION);
  340. if (rt == IDYES)  // 继续录制,覆盖当前文件
  341. {
  342. if (capCaptureSequence(hwndRecord))
  343. {
  344. bRecording = true;
  345. SetWindowText(hwndRecord, "停 止");
  346. }
  347. }
  348. else
  349. {
  350. bRecordFileOpen = false;
  351. SendMessage(hMain, WM_COMMAND, MAKEWPARAM(RECORDVIDEO, BN_CLICKED), (LPARAM)hwndRecord);
  352. }
  353. break;
  354. }
  355. break;
  356. }
  357. }
  358. }
  359. break;
  360. case WM_DESTROY:
  361. capSetCallbackOnError(hwndVideo, NULL);
  362. capPreview(hwndVideo, FALSE); // 停止预览
  363. capCaptureAbort(hwndVideo);  // 停止捕获
  364. capDriverDisconnect(hwndVideo); // 断开驱动连接
  365. PostQuitMessage(0);
  366. break;
  367. default:
  368. return DefWindowProc(hMain, msg, wParam, lParam);
  369. }
  370. return 0;
  371. }
  372. LRESULT WINAPI SelCapDrcProc( HWND hMian, UINT msg, WPARAM wParam, LPARAM lParam )
  373. {
  374. //  ShowWindow(hwndSelCapDrvDlg, SW_SHOW);
  375. switch(msg)
  376. {
  377. case WM_INITDIALOG:
  378. return TRUE;
  379. case WM_COMMAND:
  380. switch(wParam)
  381. {
  382. case BTN_SEL:
  383. int sel = 0;
  384. SendMessage(hwndSelCapDrvLBox, LB_GETSELITEMS, 1, sel );  // 获取选择的驱动
  385. SendMessage(hwndVideo, WM_CAP_DRIVER_CONNECT, sel, 0L);   // 连接驱动
  386. SendMessage(hwndSelCapDrvDlg, WM_CLOSE, 0, 0);   // 关闭对话框
  387. SendMessage(hwndVideo, WM_CAP_DRIVER_GET_CAPS, sizeof(CAPDRIVERCAPS), (long)(LPVOID)&capDrvCaps); // 更新驱动的能力
  388. if (capDrvCaps.fHasOverlay)
  389. {
  390. capOverlay(hwndVideo, TRUE);
  391. }
  392. capPreviewRate(hwndVideo, 66);   //设置视频捕获速率提高到66 miliseconds
  393. if ( !capPreview(hwndVideo, TRUE))   //用CapPreview启动预览功能
  394. {
  395. MessageBox(NULL, "预览启动失败", "提示", MB_OK|MB_ICONINFORMATION);
  396. SendMessage(hMian, WM_COMMAND, EXIT, 0);
  397. return FALSE;
  398. }
  399. }
  400. return TRUE;
  401. case WM_CLOSE:
  402. DestroyWindow(hwndSelCapDrvDlg);
  403. return TRUE;
  404. }
  405. return (0L);
  406. }
  407. int EnumCapDrv()
  408. {
  409. char drvName[100];
  410. char drvVesion[100];
  411. char drvStr[200];
  412. for (int i = 0; i < 5; i++)  // 扫面获取驱动信息
  413. {
  414. if ( capGetDriverDescription(i, drvName, sizeof(drvName), drvVesion, sizeof(drvVesion)) )
  415. {
  416. strcpy(drvStr, drvName);
  417. strcat(drvStr, "  ");
  418. strcat(drvStr, drvVesion);
  419. SendMessage(hwndSelCapDrvLBox, LB_ADDSTRING, 0, (LPARAM)drvStr); // 向列表框增加字符串
  420. SendMessage(hwndSelCapDrvLBox, LB_SETITEMDATA, i, (LPARAM)i);
  421. }
  422. }
  423. return 0;
  424. }
  425. VOID APIENTRY HandlePopupMenu( HWND hwnd, POINT pt )
  426. {
  427. HMENU hmenu;
  428. HMENU hPopupMenu;
  429. hmenu = LoadMenu((HINSTANCE)ghInstance, MAKEINTRESOURCE(IDR_POPUPMENU));
  430. if(hmenu == NULL) return;
  431. // 获取子菜单
  432. hPopupMenu = GetSubMenu(hmenu, 0);
  433. // 弹出菜单使用屏幕坐标,所以转换鼠标点击坐标到屏幕坐标
  434. ClientToScreen(hwnd, &pt);
  435. TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN|TPM_LEFTBUTTON, pt.x, pt.y, 0, hwnd, NULL);
  436. DestroyMenu(hmenu); // 销毁指定菜单,并释放此菜单占用的内存
  437. }
  438. WORD WINAPI VideoThreadProc( LPVOID lParam )
  439. {
  440. // 捕获视频
  441. if( capCaptureSequence(hwndVideo) ) //该函数调控启动流视频和音频捕获到一个文件,你能使用这个功能发送消息
  442. {
  443. SetWindowText(hwndRecord, "停 止");
  444. MessageBox(NULL, "Start to capture video.", "提示", MB_OK|MB_ICONINFORMATION);
  445. bRecording = true;
  446. }
  447. while(!bThreadEnd);
  448. MessageBox(NULL, "Leaving Record Thread", "Thread",NULL);
  449. return 0;
  450. }

win32 摄像头捕获系统vfw的更多相关文章

  1. iOS 捕获系统外异常

    iOS 捕获系统外异常 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太 ...

  2. 使用OpenCV通过摄像头捕获实时视频并探测人脸

    在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,视频可以看作是一帧一帧的图片,因此图片操作其实是视频操作的基础,这篇手记就来讲讲OpenCV中的视频操作,并实现一个用笔记本 ...

  3. 摄像头ISP系统原理(下)

    摄像头ISP系统原理(下) l  WDR(Wide Dynamic Range)------宽动态 动态范围(Dynamic Range)是指摄像机支持的最大输出信号和最小输出信号的比值,或者说图像最 ...

  4. 摄像头ISP系统原理(中)

    摄像头ISP系统原理(中) AF(FOCUS)----自动对焦 根据光学知识,景物在传感器上成像最清晰时处于合焦平面上.通过更改 LENS 的位置,使得景物在传感器上清晰的成像,是 ISP FOCUS ...

  5. 摄像头ISP系统原理(上)

    摄像头ISP系统原理(上) ISP(Image Signal Processor),即图像信号处理器,用于处理图像信号传感器输出的图像信号.它在相机系统中占有核心主导的地位,是构成相机的重要设备. 主 ...

  6. OneAPM大讲堂 | 基于图像质量分析的摄像头监控系统的实现

    今天咱们要介绍的技术很简单,请看场景: 你在家里安装了几个摄像头想监视你家喵星人的一举一动,然而,就在喵星人准备对你的新包发动攻击的时候,图像突然模糊了.毕竟图像模糊了以后你就没法截图回家和喵当面对质 ...

  7. Unity 3D 调用摄像头捕获照片 录像

    1,要想调用摄像头首先要打开摄像头驱动,如果用户允许则可以使用. 2,定义WebCamTexture的变量用于捕获单张照片. 3,连续捕获须启用线程. 实现代码: using UnityEngine; ...

  8. 使用ffserver实现转发实时流媒体(摄像头捕获)

    本系统为ubuntu 10.04LTS 说明1:本实验在本机成功测试通过: 说明2:本实验仅仅测试了视频流,未测试音频流. 1.配置ffserver.conf -------------------- ...

  9. Win32汇编常用系统函数

    汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地 ...

随机推荐

  1. uva 10617

    当s[i] = s[j]   dp[i][j] = 1+dp[i+1][j-1]+dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1] = 1+dp[i][j-1]+dp[i+1][j ...

  2. Openstack Quantum project 更名为 Neuron

    因为与磁带备份厂商Quantum商标冲突: The OpenStack Foundation has changed the name of its networking project from Q ...

  3. HDU4276 The Ghost Blows Light SPFA&&树dp

    题目的介绍以及思路完全参考了下面的博客:http://blog.csdn.net/acm_cxlove/article/details/7964739 做这道题主要是为了加强自己对SPFA的代码的训练 ...

  4. POJ 1456 Supermarket(贪心+并查集优化)

    一开始思路弄错了,刚开始想的时候误把所有截止时间为2的不一定一定要在2的时候买,而是可以在1的时候买. 举个例子: 50 2  10 1   20 2   10 1    50+20 50 2  40 ...

  5. java基础知识回顾之java Thread类学习(十)--线程的状态以及转化使用的方法介绍

       线程的概述:         线程是程序的多个执行路径,执行调度的单位,依托于进程存在.线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间叫做线程栈,是建立线程的时候由系 ...

  6. C# Regex类用法

    使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 利用Regex类实现全部匹配输出 string str = "test43232 ...

  7. cojs 简单的数位DP 题解报告

    首先这道题真的是个数位DP 我们考虑所有的限制: 首先第六个限制和第二个限制是重复的,保留第二个限制即可 第五个限制在转移中可以判断,不用放在状态里 对于第一个限制,我们可以增加一维表示余数即可 对于 ...

  8. lintcode 中等题 :Maximum Product Subarray 最大连续乘积子序列

    题目 乘积最大子序列 找出一个序列中乘积最大的连续子序列(至少包含一个数). 样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6. 解题  法一:直接暴力求解 时 ...

  9. windows下安装ubantu

        首先声明我是一个linux大菜鸟,之所以学这个,一个是好玩,另外做DL的一些软件如Caffe要在这个平台上运行,所以没事就鼓捣鼓捣.linux是一种内核,市场上支持这种内核的操作系统有uban ...

  10. switch… case 语句的用法

    switch… case 语句的用法   public class Test7 { public static void main(String[] args) { int i=5; switch(i ...