⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.pas

📁 威视V130采集卡开发包:包含了源代码、可执行文件和Demo
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2, Menus, ComCtrls, VFW, IniFiles;

CONST WM_COUNT = WM_APP + 10;

type
    PTForm1= ^TForm1;
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    DEVICE: TMenuItem;
    Create: TMenuItem;
    Close1: TMenuItem;
    Run1: TMenuItem;
    StatusBar1: TStatusBar;
    FrameMemory1: TMenuItem;
    Start1: TMenuItem;
    Stop1: TMenuItem;
    Malloc1: TMenuItem;
    PopupMenu1: TPopupMenu;
    Buffer: TMenuItem;
    SystemMemory_DX: TMenuItem;
    SystemMemory_GDI: TMenuItem;
    VideoMemory: TMenuItem;
    Recede_Noise: TMenuItem;
    Display: TMenuItem;
    DisplayOpen: TMenuItem;
    DisplayClose: TMenuItem;
    Stander: TMenuItem;
    PAL1: TMenuItem;
    NTSC1: TMenuItem;
    NoStander: TMenuItem;
    Source: TMenuItem;
    COMPOSITE: TMenuItem;
    SVIDEO: TMenuItem;
    Channel: TMenuItem;
    Channel0: TMenuItem;
    Channel1: TMenuItem;
    Channel2: TMenuItem;
    Channel3: TMenuItem;
    Channel4: TMenuItem;
    Channel5: TMenuItem;
    Channel6: TMenuItem;
    Channel7: TMenuItem;
    Channel8: TMenuItem;
    Channel9: TMenuItem;
    Format: TMenuItem;
    MONOCHOY8: TMenuItem;
    RGB1555: TMenuItem;
    CO_RGB24: TMenuItem;
    aRGB8888: TMenuItem;
    RGB8332: TMenuItem;
    CO_RGB565: TMenuItem;
    RGB5515: TMenuItem;
    CO_YUV444: TMenuItem;
    CO_YUV422: TMenuItem;
    YUV411: TMenuItem;
    Filp: TMenuItem;
    Filp_Yes: TMenuItem;
    Filp_NO: TMenuItem;
    UpDown: TMenuItem;
    UpDown_Yes: TMenuItem;
    UpDown_NO: TMenuItem;
    GarbMode: TMenuItem;
    Skip_Yes: TMenuItem;
    Skip_No: TMenuItem;
    SYNMODE: TMenuItem;
    SYNRED: TMenuItem;
    SYNGREEN: TMenuItem;
    SYNBLUE: TMenuItem;
    SYNOUTSIDE: TMenuItem;
    SYNSEPARATE: TMenuItem;
    SYNINSIDE1: TMenuItem;
    SYNINSIDE2: TMenuItem;
    ZGH: TMenuItem;
    GEHANG: TMenuItem;
    huHang: TMenuItem;
    Black: TMenuItem;
    BOGUSCOLOR: TMenuItem;
    FULLCOLOR: TMenuItem;
    Field_Frame: TMenuItem;
    Field: TMenuItem;
    Frame: TMenuItem;
    OSD: TMenuItem;
    MaskBit: TMenuItem;
    NoOSD: TMenuItem;
    OSD_0: TMenuItem;
    OSD_1: TMenuItem;
    Free1: TMenuItem;
    CaptureSingle: TMenuItem;
    avi: TMenuItem;
    Startavi: TMenuItem;
    cancelsave: TMenuItem;
    Chooseavi: TMenuItem;
    procedure OnCreate(Sender: TObject);
    procedure OnCreateCard(Sender: TObject);
    procedure OnCloseCard(Sender: TObject);
    procedure OnRun(Sender: TObject);
    procedure OnStrat(Sender: TObject);
    procedure OnStop(Sender: TObject);
    procedure OnMalloc(Sender: TObject);
    procedure OnMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure OnBuffer(Sender: TObject);
    procedure OnDisplay(Sender: TObject);
    procedure OnStander(Sender: TObject);
    procedure OnSource(Sender: TObject);
    procedure OnChannel(Sender: TObject);
    procedure OnFormat(Sender: TObject);
    procedure OnFlip(Sender: TObject);
    procedure OnUpDown(Sender: TObject);
    procedure OnSkip(Sender: TObject);
    procedure OnSynMode(Sender: TObject);
    procedure OnZGH(Sender: TObject);
    procedure OnBlack(Sender: TObject);
    procedure OnFieldFrame(Sender: TObject);
    procedure OnOSD(Sender: TObject);
    procedure OnClose(Sender: TObject; var Action: TCloseAction);
    procedure OnFree(Sender: TObject);
    procedure OnCaptureSingle(Sender: TObject);
    procedure OnShow(Sender: TObject);
    procedure COMPRESSClick(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure StartaviClick(Sender: TObject);
    procedure cancelsaveClick(Sender: TObject);
    procedure ChooseaviClick(Sender: TObject);
  private

  public
    m_CardNumber : DWORD;
    m_hDev           : array[0..15] of HANDLE;
    m_Current        : ULONG;
    m_DeviceListMenu : array[0..15]of TMenuItem;
    m_GarbCallCount, m_DispCallCount : ULONG;
    bCompress : Boolean;
    m_pImageInfo: PBITMAPINFO ;
    SavefccHandler : DWORD;
    IsSave  :  Boolean;
    a1,a2,a3,a4 : DWORD;
    a5 : POINTER;
    ii : integer;
    faceIni:   TIniFile;
    procedure COUNTProcess(var Mes: TWMCOMMAND); message WM_COUNT;


  end;

var
  Form1: TForm1;

implementation

uses Unit3, Unit5;

{$R *.dfm}

// 捕获用户回调,这里支队每一次调用进行计数,然后再状态条中显示捕获用户回调被调用的计数值
FUNCTION GarbCallBack( pData:POINTER; pImageInfo:PMV_IMAGEINFO; pUserData:POINTER; Index:ULONG ):BOOLEAN;Stdcall;
VAR  pF : PTForm1;
begin
   pF := PTForm1(pUserData);
   pF^.m_GarbCallCount := pF^.m_GarbCallCount + 1;
    Result := TRUE;

    if PF.bCompress = TRUE then begin
//		CClientDC dc((CM10VCView*)pUserData);
//		::StretchDIBits(dc.m_hDC, 0, 0, pImageInfo->Width, pImageInfo->Heigth, 0, 0,
//		pImageInfo->Width, pImageInfo->Heigth, pData, ((CM10VCView*)pUserData)->m_pImageInfo,DIB_RGB_COLORS, SRCCOPY);

		MV_AVIFileAddFrame(0, PF.m_pImageInfo,pData);

        end;
end;

// 显示用户回调,这里支队每一次调用进行计数,然后再状态条中显示处理后的显示用户回调被调用的计数值
FUNCTION DispCallBack( pData:POINTER; pImageInfo:PMV_IMAGEINFO; pUserData:POINTER; Index:ULONG ):BOOLEAN;Stdcall;
VAR    pF : PTForm1;
label  HERE;
begin
   pF := PTForm1(pUserData);
   pF^.m_DispCallCount := pF^.m_DispCallCount + 1;
   // 为了VCL安全,通过消息操控VCL控件
   if (pF^.m_DispCallCount MOD 20) = 0 Then PostMessage( pF^.Handle, WM_COUNT, 0, 0 );
   Result := TRUE;
End;

// 操控VCL控件的自定消息
procedure TForm1.COUNTProcess(var Mes: TWMCOMMAND);
begin
   StatusBar1.Panels[0].Text := InttoStr(m_GarbCallCount);
   StatusBar1.Panels[1].Text := InttoStr(m_DispCallCount);
end;

// 在应用程序创建时查询本机中插的卡数
procedure TForm1.OnCreate(Sender: TObject);
var i : integer;
begin
//        faceini:=TIniFile.Create('c:\MP.ini');
              //读取内容

//        IsSave := faceIni.ReadBool('mvavi','IsSave',FALSE);

//        Form4.avisi.fccHandler := faceIni.ReadInteger('mvavi','fccHandler','');


    m_CardNumber := MV_GetDeviceNumber();
    m_GarbCallCount := 0;    // 为捕获用户回调初始化计数
    m_DispCallCount := 0;    // 为显示用户回调初始化计数
    for i:=0 to 15 do begin m_DeviceListMenu[i] := NIL;
                            m_hDev[i]           := 0;
                      end;

    for i:=0 to m_CardNumber - 1 do
        begin m_hDev[i] := MV_OpenDevice( i, FALSE );
              MV_GetLastError( TRUE );  // 如果有错,TRUE参数将显示一个错吴消息对话框,否则MV_GetLastError将什麽都不做
        end;
    m_Current := 0;
    IsSave := FALSE;
    bCompress := FALSE;
    ii := 20;
end;

procedure TForm1.OnShow(Sender: TObject);
VAR     i : Integer;
begin
        faceini :=TIniFile.Create('c:\mvavi.ini');
              //读取内容

//        faceini.WriteString();

        IsSave := faceini.ReadBool('mvavi', 'IsSave', FALSE);
        Form4.a1 := Strtoint(faceIni.ReadString('mvavi', 'fccHandler', ''));


   for I:=0 to (m_CardNumber-1) do
       begin m_DeviceListMenu[I] := TMenuItem.Create(m_DeviceListMenu[I]);
             try  m_DeviceListMenu[i].Caption := '设备' + IntTostr(I + 1);
                  MainMenu1.Items[0].Items[0].Insert( I, m_DeviceListMenu[I] );
             except m_DeviceListMenu[I].Free;
                    m_DeviceListMenu[I] := NIL;
                    raise;
             end;
             m_DeviceListMenu[I].OnClick := OnCreateCard;
       end;
end;

// 创建设备消息
procedure TForm1.OnCreateCard(Sender: TObject);
Var CurrentIndex, CardType, I : Integer;
begin
    MV_OperateDevice( m_hDev[m_Current], MVSTOP );
    MV_SetCallBack( m_hDev[m_Current], NIL, NIL, BEFORE_PROCESS );
    MV_SetCallBack( m_hDev[m_Current], NIL, NIL, AFTER_PROCESS );
    for I:=0 to m_CardNumber - 1 do
        if Sender = m_DeviceListMenu[I] Then begin m_DeviceListMenu[I].Checked := TRUE;
                                                   m_Current := I;
                                             End
        else m_DeviceListMenu[I].Checked := FALSE;
    // 设置处理前(即采集)和处理后(即显示)的回调
    MV_SetCallBack( m_hDev[m_Current], @GarbCallBack, @Form1, BEFORE_PROCESS );
    MV_SetCallBack( m_hDev[m_Current], @DispCallBack, @Form1, AFTER_PROCESS );
    m_GarbCallCount := 0;    // 为捕获用户回调初始化计数
    m_DispCallCount := 0;    // 为显示用户回调初始化计数

    // 得到板卡类型,并修改应用程序标题
    CardType := MV_GetDeviceParameter( m_hDev[m_Current], GET_BOARD_TYPE );
    case CardType Of
       LEVIN_M10   : Form1.Caption := 'LEVIN_M10';
       LEVIN_M20   : Form1.Caption := 'LEVIN_M20';
       LEVIN_RGB10 : Form1.Caption := 'LEVIN_RGB10';
       LEVIN_RGB20 : Form1.Caption := 'LEVIN_RGB20';
       LEVIN_VGA100: Form1.Caption := 'LEVIN_VGA100';
       LEVIN_VGA170: Form1.Caption := 'LEVIN_VGA170';
       V3A         : Form1.Caption := 'V3A';
       V300	   : Form1.Caption := 'V300';
       V500        : Form1.Caption := 'V500';
       V510        : Form1.Caption := 'V510';
       V520         : Form1.Caption := 'V520';
       V200        : Form1.Caption := 'V200';
       V120        : Form1.Caption := 'V120';
       V110	   : Form1.Caption := 'V110';
       V130        : Form1.Caption := 'V130';
       V112	   : Form1.Caption := 'V112';
       V410	   : Form1.Caption := 'V410';
       S100	   : Form1.Caption := 'S100';
       S450	   : Form1.Caption := 'S450';
       S400S420	   : Form1.Caption := 'S400S420';
       V8T	   : Form1.Caption := 'V8T';
       V400	   : Form1.Caption := 'V400';
       MOKAC10     : Form1.Caption := 'MOKAC10';
       MOKAC20     : Form1.Caption := 'MOKAC20';
       MOKAC40     : Form1.Caption := 'MOKAC40';
       MOKAC41     : Form1.Caption := 'MOKAC41';
       X400	   : Form1.Caption := 'X400';
       X800	   : Form1.Caption := 'X800';
       E450	   : Form1.Caption := 'E450';
       E410	   : Form1.Caption := 'E410';
    end;
end;

// 应用程序退出时释放关闭设备
procedure TForm1.OnClose(Sender: TObject; var Action: TCloseAction);
VAR i : Integer;
begin
   for I := 0 to 15 do if m_DeviceListMenu[I] <> NIL THEN Begin m_DeviceListMenu[I].Free;
                                                                m_DeviceListMenu[I] := NIL;
                                                          End;
   for I := 0 to 15 do if m_hDev[I] <> 0 THEN
       Begin MV_OperateDevice( m_hDev[I], MVSTOP );
             MV_CloseDevice( m_hDev[I] );
             m_hDev[I] := 0;
       End;
end;

// 关闭设备菜单的消息
procedure TForm1.OnCloseCard(Sender: TObject);
begin
end;

// 运行设备菜单的消息
procedure TForm1.OnRun(Sender: TObject);
begin
   // 设置一个显示窗口句柄,和该显示在窗口中的起始位置,和大小
   MV_SetDeviceParameter( m_hDev[m_Current], DISP_WHND, Form1.Handle );
   MV_SetDeviceParameter( m_hDev[m_Current], DISP_TOP, 0 );
   MV_SetDeviceParameter( m_hDev[m_Current], DISP_LEFT, 0 );
   // MV_SetDeviceParameter( m_hDev[m_Current], DISP_HEIGHT, 576 );
   // MV_SetDeviceParameter( m_hDev[m_Current], DISP_WIDTH, 768 );
   MV_OperateDevice( m_hDev[m_Current], MVRUN );   // 使设备处于运行}

   {
      //  也可以如下代码,即先运行后设置,设置与运行次序无关
      MV_OperateDevice( m_Handle, MVRUN );
      MV_SetDeviceParameter( m_Handle, DISP_WHND, Form1.Handle );
      MV_SetDeviceParameter( m_Handle, DISP_TOP, 0 );
      MV_SetDeviceParameter( m_Handle, DISP_LEFT, 0 );
      MV_SetDeviceParameter( m_Handle, DISP_HEIGHT, 576 );
      MV_SetDeviceParameter( m_Handle, DISP_WIDTH, 768 );
   }

   MV_GetLastError( TRUE );
end;

// 用户任意时刻捕获一幅图
procedure TForm1.OnCaptureSingle(Sender: TObject);
Var ptr   : POINTER;
    Str   : String;
    Image : TMV_IMAGEINFO;
begin
    ptr := MV_CaptureSingle( m_hDev[m_Current],
                             FALSE,    // 捕获一幅图未经显示处理的原始数据
                             NIL,      // 用户自己不分配内存,用SDK提供的内存
                             0,        // 用户自己不分配内存,用SDK提供的内存
                             @Image    // 调用返回后为图像的信息
                           );
    if ptr = NIL Then Exit;
    // 调用返回,将该图存成BMP文件
    Str := 'CaptureSingle';
    MV_SaveFile( PUCHAR(Str), BMP, ptr, @Image, 1, FALSE, FALSE, 0, FALSE );
end;

////////////////////////////////////////////////////////////////////////////////////////////////////
// 下面是用户请求一块大帧存,然后启动连续捕获机制,捕获结束时用户的通知回调被触发,在通知回调中将 //
// 捕获到的图像存成JPEG文件                                                                       //
////////////////////////////////////////////////////////////////////////////////////////////////////

// 用户的通知回调,在被调用时代表连续捕获条件满足,或用户发出了停止命令
procedure SaveCallBack( pData:POINTER; pImage:PMV_IMAGEINFO; ImageNumber,WholeLength:ULONG; pUserData:POINTER );Stdcall;
Var  Str : String;
begin
   // 存成JPEG文件
   Str := 'Test';
   MV_SaveFile( @(Str[1]), JPEG, pData, pImage, ImageNumber, FALSE, TRUE, 50, FALSE );
end;

// 用户请求一块大帧存,可存50幅图,
procedure TForm1.OnMalloc(Sender: TObject);
begin
   MV_AllocSequenceFrameMemory( m_hDev[m_Current], 0, 50, BEFORE_PROCESS );
   MV_GetLastError( TRUE );
end;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -