zoukankan      html  css  js  c++  java
  • Delphi 控制摄像头操作

    DELPHI控制摄像头操作可以使用TVideoCap控件,或直接使用MS的AVICAP32.DLL就可轻松的实现对摄像头编程。

    首先常量定义和函数定义:

    implementation
    const WM_CAP_START = WM_USER;
    const WM_CAP_STOP = WM_CAP_START + 68;
    const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
    const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
    const WM_CAP_SAVEDIB = WM_CAP_START + 25;
    const WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
    const WM_CAP_SEQUENCE = WM_CAP_START + 62;
    const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
    const WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+  63 ;
    const WM_CAP_SET_OVERLAY =WM_CAP_START+  51 ;
    const WM_CAP_SET_PREVIEW =WM_CAP_START+  50 ;
    const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6;
    const WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2;
    const WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3;
    const WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5;
    const WM_CAP_SET_SCALE=WM_CAP_START+  53 ;
    const WM_CAP_SET_PREVIEWRATE=WM_CAP_START+  52 ;
    function capCreateCaptureWindowA(lpszWindowName : PCHAR;
    dwStyle : longint;
    x : integer;
    y : integer;
    nWidth : integer;
    nHeight : integer;
    ParentWin : HWND;
    nId : integer): HWND;
    STDCALL EXTERNAL 'AVICAP32.DLL';
    {$R *.dfm}

    打开Delphi,添加Panel1到Form1上,定义一个全局变量,var hWndC : THandle; 添加button1 ,caption为激活摄像头:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    hWndC := capCreateCaptureWindowA('My Own Capture Window',
    WS_CHILD or WS_VISIBLE ,
    Panel1.Left,
    Panel1.Top,
    Panel1.Width,
    Panel1.Height,
    Form1.Handle,
    0);
    if hWndC <> 0 then
    SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
    SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
    SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
    SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
    SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
    SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
    //SendMessage(hWndC, WM_CAP_SEQUENCE_NOFILE, 1, 0);
    SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
    SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
    end;

    添加button2 ,caption为关闭摄像头:

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    if hWndC <> 0 then begin
    SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
    hWndC := 0;
    end;
    end; 

    添加button3 ,caption为保存为BMP图像:

    procedure TForm1.Button3Click(Sender: TObject);
    begin
    if hWndC <> 0 then begin
    SendMessage(hWndC,WM_CAP_SAVEDIB,0,longint(pchar('c:\\test.bmp')));
    end;
    end;

    添加button4 ,caption为开始录像:

    procedure TForm1.Button4Click(Sender: TObject);
    begin
    if hWndC <> 0 then
    begin
    SendMessage(hWndC,WM_CAP_FILE_SET_CAPTURE_FILEA,0, Longint(pchar('c:\\test.avi')));
    SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
    end;
    end; 

    添加button5 ,caption为停止录像:

    procedure TForm1.Button5Click(Sender: TObject);
    begin
    if hWndC <> 0 then begin
    SendMessage(hWndC, WM_CAP_STOP, 0, 0);
    end;
    end;

    添加button6,caption为退出:

    procedure TForm1.Button6Click(Sender: TObject);
    begin
    close;
    end; 

    可以添加MediaPlayer和opendialog控件

    添加button7,caption为加载视频:

    procedure TForm1.Button7Click(Sender: TObject);
    begin
    openDialog1.DefaultExt := 'avi';
    openDialog1.Filter := 'avi files (*.avi)|*.avi';

    if OpenDialog1.Execute  then
    begin
     if (MediaPlayer1.DeviceID<>0) then
      begin
        if (MediaPlayer1.Mode=mpplaying) then MediaPlayer1.Stop;
      end;

     MediaPlayer1.FileName:=openDialog1.FileName;
     //MediaPlayer1.DisplayRect.Top:=panel2.Top;
     //MediaPlayer1.DisplayRect.Left:=panel2.left;
     //MediaPlayer1.DisplayRect.Right:=panel2.Height;
     //MediaPlayer1.DeviceType   :=dtAutoSelect;
     Mediaplayer1.Open;
     MediaPlayer1.Play;
     end;
    end;

    如果电脑没有摄像头,panel就会黑黑的,可以尝试安装SoftCam虚拟摄像头。

    关于摄像头编程,大家也可以看看这组VCL组件:DSPack,DSPack是一套使用微软Direct Show和DirectX技术的类和组件,设计工作于DirectX 9,支持系统Win9X, ME, 2000和Windows XP。

    视屏聊天 按数据压缩传输给对方,显示出来,不是那么简单。

    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, MPlayer;

    type
      TForm1 = class(TForm)
        Button1: TButton;
        Panel1: TPanel;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        Button5: TButton;
        Button6: TButton;
        Button7: TButton;
        OpenDialog1: TOpenDialog;
        MediaPlayer1: TMediaPlayer;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure Button5Click(Sender: TObject);
        procedure Button7Click(Sender: TObject);
        procedure Button6Click(Sender: TObject);
      private

        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;
       hWndC : THandle;

    implementation
    const WM_CAP_START = WM_USER;
    const WM_CAP_STOP = WM_CAP_START + 68;
    const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
    const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
    const WM_CAP_SAVEDIB = WM_CAP_START + 25;
    const WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
    const WM_CAP_SEQUENCE = WM_CAP_START + 62;
    const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
    const WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+  63 ;
    const WM_CAP_SET_OVERLAY =WM_CAP_START+  51 ;
    const WM_CAP_SET_PREVIEW =WM_CAP_START+  50 ;
    const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6;
    const WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2;
    const WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3;
    const WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5;
    const WM_CAP_SET_SCALE=WM_CAP_START+  53 ;
    const WM_CAP_SET_PREVIEWRATE=WM_CAP_START+  52 ;
    function capCreateCaptureWindowA(lpszWindowName : PCHAR;
    dwStyle : longint;
    x : integer;
    y : integer;
    nWidth : integer;
    nHeight : integer;
    ParentWin : HWND;
    nId : integer): HWND;
    STDCALL EXTERNAL 'AVICAP32.DLL';
    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    hWndC := capCreateCaptureWindowA('My Own Capture Window',
    WS_CHILD or WS_VISIBLE ,
    Panel1.Left,
    Panel1.Top,
    Panel1.Width,
    Panel1.Height,
    Form1.Handle,
    0);
    if hWndC <> 0 then
    SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
    SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
    SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
    SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
    SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
    SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);
    //SendMessage(hWndC, WM_CAP_SEQUENCE_NOFILE, 1, 0);
    SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
    SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    if hWndC <> 0 then begin
    SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
    hWndC := 0;
    end;
    end;

    procedure TForm1.Button3Click(Sender: TObject);
    begin
    if hWndC <> 0 then begin
    SendMessage(hWndC,WM_CAP_SAVEDIB,0,longint(pchar('c:\\test.bmp')));
    end;
    end;

    procedure TForm1.Button4Click(Sender: TObject);
    begin
    if hWndC <> 0 then
    begin
    SendMessage(hWndC,WM_CAP_FILE_SET_CAPTURE_FILEA,0, Longint(pchar('c:\\test.avi')));
    SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
    end;
    end;

    procedure TForm1.Button5Click(Sender: TObject);
    begin
    if hWndC <> 0 then begin
    SendMessage(hWndC, WM_CAP_STOP, 0, 0);
    end;
    end;

    procedure TForm1.Button7Click(Sender: TObject);
    begin
    openDialog1.DefaultExt := 'avi';
    openDialog1.Filter := 'avi files (*.avi)|*.avi';

    if OpenDialog1.Execute  then
    begin
     if (MediaPlayer1.DeviceID<>0) then
      begin
        if (MediaPlayer1.Mode=mpplaying) then MediaPlayer1.Stop;
      end;

     MediaPlayer1.FileName:=openDialog1.FileName;
     //MediaPlayer1.DisplayRect.Top:=panel2.Top;
     //MediaPlayer1.DisplayRect.Left:=panel2.left;
     //MediaPlayer1.DisplayRect.Right:=panel2.Height;
     //MediaPlayer1.DeviceType   :=dtAutoSelect;
     Mediaplayer1.Open;
     MediaPlayer1.Play;
     end;
    end;

    procedure TForm1.Button6Click(Sender: TObject);
    begin
    close;
    end;

    end.

    //= == =====================

    object Form1: TForm1
      Left = 192
      Top = 114
      Width = 658
      Height = 422
      Caption = '摄像头操作'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object Button1: TButton
        Left = 536
        Top = 8
        Width = 97
        Height = 41
        Caption = '激活摄像头'
        TabOrder = 0
        OnClick = Button1Click
      end
      object Panel1: TPanel
        Left = 0
        Top = 0
        Width = 521
        Height = 385
        Caption = '摄像头尚未激活中'
        TabOrder = 1
        object MediaPlayer1: TMediaPlayer
          Left = 200
          Top = 16
          Width = 253
          Height = 33
          TabOrder = 0
        end
      end
      object Button2: TButton
        Left = 536
        Top = 56
        Width = 97
        Height = 41
        Caption = '关闭摄像头'
        TabOrder = 2
        OnClick = Button2Click
      end
      object Button3: TButton
        Left = 536
        Top = 112
        Width = 97
        Height = 41
        Caption = '保存为BMP图片'
        TabOrder = 3
        OnClick = Button3Click
      end
      object Button4: TButton
        Left = 536
        Top = 160
        Width = 97
        Height = 41
        Caption = '开始录像'
        TabOrder = 4
        OnClick = Button4Click
      end
      object Button5: TButton
        Left = 536
        Top = 208
        Width = 97
        Height = 41
        Caption = '停止录像'
        TabOrder = 5
        OnClick = Button5Click
      end
      object Button6: TButton
        Left = 536
        Top = 320
        Width = 97
        Height = 41
        Caption = '退出'
        TabOrder = 6
        OnClick = Button6Click
      end
      object Button7: TButton
        Left = 536
        Top = 256
        Width = 97
        Height = 49
        Caption = '加载视频'
        TabOrder = 7
        OnClick = Button7Click
      end
      object OpenDialog1: TOpenDialog
        Left = 464
        Top = 24
      end
    end

    摘录自:Delphi摄像头操作 http://yxmhero1989.blog.163.com/blog/static/112157956201102703433980/

    试写的Delphi摄像头照相(抓图)小软件  http://www.codefans.net/soft/8385.shtml
    Delphi 激活摄像头  http://hi.baidu.com/warrially/blog
    利用Delphi编程控制摄像头 http://www.haoxiai.net/bianchengyuyan/Delphi/84272.html
    http://blog.csdn.net/walkershrek/archive/2007/12/04/1915440.aspx
    关与Usb摄像头问题  http://group.gimoo.net/review/142849
    MTPlay V1.0 摄像头视频捕捉程序  www.hackcode.com
    用Delphi开发视频捕获(摄像头拍照)程序 http://www.delphibbs.com/keylife/iblog_show.asp?xid=15554
    Delphi实现摄像头拍照能 http://www.xuedelphi.cn/wenzhang/mrjq/gjyy/2008/11/200811232621.htm
    用Delphi控制摄像头编程(转载)http://blog.ednchina.com/999wjc/4230/message.aspx
    http://blog.csdn.net/walkershrek/archive/2007/12/04/1915429.aspx
    VB编写控制摄像头程序  http://down.bbs156.cn/exef1226.html
    一个用VC写的视屏聊天工具(源代码) http://www.trydone.com/posts/list/301.page
    GraghDialog.rar   http://www.hackchina.com/cont/182020

  • 相关阅读:
    为何url地址不是直接发送到服务器,而是被编码后再发送
    http请求分析
    Nginx+Php不支持并发,导致curl请求卡死(Window环境)
    Vue开发调试神器 vue-devtools
    什么是闭包?闭包的优缺点?
    Nginx 504 Gateway Time-out分析及解决方法
    HTTP请求8种方法
    MySQL查询缓存总结
    MySQL单表多次查询和多表联合查询,哪个效率高?
    分布式系统一致性问题解决实战
  • 原文地址:https://www.cnblogs.com/doit8791/p/2575455.html
Copyright © 2011-2022 走看看