热点推荐:
您现在的位置: 电脑学习网 >> 软件专区 >> 正文

如何把摄像头做监控

2013-09-12 15:53:21  来源: 软件专区 

  花了一百块钱买的USB摄像头除了跟几个朋友聊视频外,平时就一直处于闲置状态。一日我突发奇想:能不能用它来做个视频监视报警系统,经过本人一段时间的研究发现还真是可以,只要使用C++ Builder6就很容易实现这个功能,而且效果还是不错的,现在就把自己的心得和大家分享一下!www.sq120.com推荐文章

一、创建窗体
  创建窗体Form1,将它调整到适当大小,在上面放上Panel1、Label1、StatusBar1、ScrollBar1、GroupBox1、Memo1、Button1、Button2和Timer1控件,将Button1的caption属性改为“启动摄像头”,Button2的Captio n属性改为“开始监控”,Label1的Caption改为“灵敏度”,修改Timer1的Enabled为false,Interval为500,修改ScrollBar1的Min为100,Max为1000。

二、增加头文件
  打开头文件:Unit1.h,为它增加两个头文件:
  #include "jpeg.hpp"
  #include "vfw.h"
  修改private段如下:
  private: // User declarations
  CAPDRIVERCAPS gCapDrvCaps;
  int sizef,sizetemp,jd;
  int __fastcall getfiles();
  void __fastcall scanpic();
三、添加函数
  打开Unit1.cpp文件,添加两个函数:
  void __fastcall TForm1::scanpic()
  {
  Graphics::TBitmap *Bitmap=new Graphics::TBitmap;
  TJPEGImage *jmp= new TJPEGImag
  e;
  Bitmap->Width=Form1->Panel1->Width;
  Bitmap->Height=Form1->Panel1->Height;
  Bitmap->PixelFormat=pf32bit;
  ::BitBlt(Bitmap->Canvas->Handle,Form1->Panel1->Left,Form1->Panel1->Top,Form1->Panel1->Width,Form1->Panel1->Height, Form1->Canvas->Handle,0,0,SRCCOPY);
  // Bitmap->SaveToFile("tu.bmp");
  jmp->Assign(Bitmap);
  jmp->Compress();
  jmp->SaveToFile("temp.jpg");
  delete jmp;
  delete Bitmap;
  }
  //-----------------
  int __fastcall TForm1::getfiles()
  {
  HANDLE HMyFile=::CreateFile("aa.jpg",GENERIC_READ,0,0,OPEN_EXIS
  TING,FILE_ATTRIBUTE_NORMAL,0);
  double sized=(double)::GetFileSize((void *)HMyFile,NULL);
  CloseHandle(HMyFile);
  return sized;
  }
  
四、为按钮添加代码
  双击Button1按钮,为它添加OnClick事件代码如下:
  HWND capWin = capCreateCapture
  Window ((LPSTR) "Video Windows",WS_CHILD | WS_VISIBLE,Panel1->Left,Panel1->Top,Panel1->Width,Panel
  1->Height,(HWND) Handle,1);
  if(capDriverConnect(capWin,0))
  {
  capDriverGetCaps(capWin,&gCapDrvCaps,sizeof(CAPDRIVERCAPS));
  if(gCapDrvCaps.fCaptureInitialized)
  {
  capPreviewRate(capWin,66);
  capPreview(capWin,TRUE);
  }
  else
  {
  StatusBar1->SimpleText="摄像头初始化失败!";
  }
  }
  else
  {
  StatusBar1->SimpleText="摄像头连接不成功!";
  }
  双击Button2为它添加OnClick事件代码如下:
  jd=ScrollBar1->Position;
  scanpic();
  sizef=getfiles();
  Timer1->Enabled=true;
  双击ScrollBar1为它添加OnChange事件如下:
  jd=ScrollBar1->Position;
  双击Timer1为它添加OnTimer事件如下:
  scanpic();
  sizetemp=getfiles();
  if(abs(sizetemp-sizef)>jd)
  {
  AnsiString fp;
  DateTimeToString(fp,"yyyy'年'mm'月'dd'日'mm'分'ss'秒'",Now());
  Memo1->Lines->Add("有人偷苹果!"+fp+IntToStr(sizetemp));//产生报警日志
  sndPlaySound("xx.wav",SND_ASYNC);//播放警报声
  }
五、设置报警声
  在程序目录下面放上你喜欢听到的报警声音,并将声音文件命名为xx.wav,运行程序,点击“启动摄像头”将摄像头对准桌面上的苹果,当画面基本稳定时再按“开始监控”。Www.iTCompuTEr.COM.CN这时你偷偷地把手伸过去抓苹果,是不是报警了?同样你还可以将摄像头对准你房间的门,防止你在聚精会神地玩电脑时,有人突然窜到你的背后吓唬你,在使用过程中还可以任意调整监视系统的灵敏度。

 
如何清除ie地址栏   Q:我知道在“HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\TypedUrls”中,删除右侧窗格中的所有“url+数字”项,即可把IE这些键全部删除掉。但是,这样做未免太麻烦了。请问,有什么方法可以提高清除的效率?www.sq120.com推荐文章

  A:利用注册表的删除功能,就完全可以轻松解决这个问题。在注册表中选择“TypedURLs”分支并执行“导出”操作,接着,用记事本打开导出的reg文件,在其中的“[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\TypedURLs]”语句前加“-”符号,即改成:[-HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\TypedURLs]。完成修改并保存文件后,以后要删除TypedURLs下的所有键,只须双击此reg文件即可。  
word中的空行如何删除

  日常工作中在网上找到了一些文字材料,想要把文字拷贝下来,可是从网页上拷贝下来的文字在粘贴到文本编辑器上时,就会在段落与段落之间多出很多空行。若手动删除这些空行,既费时又费事。关于这个问题的几种解决方法网上也有介绍,都各有利弊,下面我就介绍另外的两种编写代码的解决方法,效率更高。www.sq120.com推荐文章

一、使用Word的宏
  如果拷贝下来的文字里有连续的多行空行,或者在有些空行里还有数量不等的空格字符,不妨让Word的宏来一显身手。
  创建一个宏,取名为DBL。代码及注释如下:
  Sub DBL()
  i = 1
  Do
  '从当前文档的顶端开始逐一选择文档的每一段文字
  ActiveDocument.Paragraphs(i).Range.Select
  If Trim(Selection.Text) = Chr(13) Then
  '如果选择的段落里只有回车符和空格则删除此段
  Selection.Delete
  Else
  '如果选择的段落非空,就将选择的指针移向下一段
  Selection.MoveDown
  i = i + 1
  End If
  Loop Until i = ActiveDocument.Parag
  raphs.Count
  End Sub
  写好了宏程序之后,可以把刚才建好的宏拖拽到快捷工具栏上,做好以后,如果需要从网页上拷贝文字到Word上编辑时,只要单击一次这个宏按钮,即可瞬间删除整篇文档里的空行了。
二、使用网页脚本语言
  如果电脑上用的文字处理工具是金山WPS系列的字处理软件,而没有安装Word和UltraEdit等软件时,不妨试试借助一下微软的网页脚本语言(VBScript)来处理删除空行的问题。现在绝大部分的机器上装的操作系统都是Windows,一般办公室里的机器都可以执行。
  脚本程序要完成的任务不同于上面的Word宏。首先要把从网页上复制下来的文字粘贴到一个文本文件(以下简称A文件)里保存。脚本程序要做的事情是在程序执行时再创建一个文本文件(以下简称B文件),从A文件里逐行读取文字,并把非空行的文字内容写入到B文件里。这样,B文件里就没有空行了。
  新建一个文本文件,把文件的扩展名改为.vbs。在记事本里打开该文件并输入脚本代码,代码及注释如下:
  Const ForReading = 1, ForWriting = 2, TristateUseDefault = -2
  Dim fsoA, fA, tA, fsoB, fB, tB, s, dir
  '如果脚本程序和A文件在同一目录下,直接输入A文件的文件名和扩展名即可
  dir=inputbox("请输入源文件的路径或相对路径:")
  if dir<>"" then
  '初始化A文件的对象
  Set fsoA = CreateObject("Scripting.FileSystemObject")
  Set fA = fsoA.GetFile(dir)
  Set tA = fA.OpenAsTextStream(ForRe
  ading, TristateUseDefault)
  '创建并初始化B文件的对象
  Set fsoB = CreateObject("Scripting.FileSystemObject")
  fsoB.CreateTextFile("_"+dir)
  Set fB = fsoB.GetFile("_"+dir)
  Set tB = fB.OpenAsTextStream(ForWr
  iting, TristateUseDefault)
  '逐行读A文件并把非空行写入B文件
  while not tA.AtEndOfStream
  s=tA.ReadLine
  if trim(s)<>"" then tB.WriteLine s
  wend
  '关闭文件对象
  tB.Close
  tA.Close
  end if
  脚本文件代码写好之后,保存,退出记事本。下面就可以用写好的脚本文件来删除空行了。用鼠标双击脚本文件即可执行程序。当程序执行完成之后就会自动产生一个在A文件名前加了一个下划线作为文件名的新文件,打开看看吧,里面的空行早被一扫而空。

 
From:http://www.itcomputer.com.cn/Article/Software/201309/334.html
  • 上一篇文章:

  • 下一篇文章:
  • Copyright © 2005-2013 电脑知识网 Computer Knowledge   All rights reserved.