📄 unit1.~pas
字号:
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 + -