📄 main.pas
字号:
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;
type
TFrmMain = class(TForm)
Button1: TButton;
SaveDialog1: TSaveDialog;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmMain: TFrmMain;
implementation
uses HVAPI;
{$R *.dfm}
var
m_hhv: HhV; //数字摄像机句柄
m_pBmpInfo: PBITMAPINFO; //BITMAPINFO 结构指针,显示图像时使用
m_pRawBuffer: PChar; //采集图像原始数据缓冲区
m_pImageBuffer: PChar; //Bayer转换后缓冲区
m_ImgBufLength: Integer;
m_RawImgBufLength:Integer;
//设置usb摄像机的一些参数
DeviceNum: integer;
Resolution:HV_RESOLUTION;
SnapMode: HV_SNAP_MODE;
Layout:HV_BAYER_LAYOUT;
Gain: longword;
ADCLevel: longword ;
//查值表
m_pLutR:array[0..255] of BYTE;
m_pLutG:array[0..255] of BYTE;
m_pLutB:array[0..255] of BYTE;
const
//窗口位置和大小
XStart = 0;
YStart = 0;
HV_Width = 800;
HV_Height = 600;
procedure TFrmMain.Button1Click(Sender: TObject);
var
status:HVSTATUS;
i:integer;
dTint:double;
lExposure:longWord;
Bmp: TBitmap;
plutR:longword; //指向颜色查值表的指针
plutG:longword;
plutB:longword;
ppBuf:Array[1..1] of pChar; //保存图像的缓冲区列表
pPointer:longWord; //指向缓冲区列表的指针
begin
//
// 初始化所有成员变量,同时打开数字摄像机
//
DeviceNum:=1;
Resolution:= RES_MODE0;
SnapMode:= CONTINUATION;
Layout:= BAYER_GR;
Gain:= 8;
ADCLevel := ADC_LEVEL1;
status:= STATUS_OK;
m_pBmpInfo := nil;
m_pRawBuffer := nil;
m_pImageBuffer := nil;
for i := 0 to 255 do
begin
m_pLutR[i] := i;
m_pLutG[i] := i;
m_pLutB[i] := i;
end;
//打开数字摄像机 1
status:= BeginHVDevice(1, m_hhv);
//检验函数执行状态,如果失败,则返回错误状态消息框
HV_VERIFY(status);
//
// 初始化数字摄像机硬件状态,用户也可以在其他位置初始化数字摄像机,
// 但应保证数字摄像机已经打开,建议用户在应用程序初始化时,
// 同时初始化数字摄像机硬件。
//
//设置数字摄像机分辨率
HVSetResolution(m_hhv, Resolution);
//采集模式,包括 CONTINUATION(连续)、TRIGGER(外触发)
HVSetSnapMode(m_hhv, SnapMode);
//设置各个分量的增益
for i:= 0 to 3 do
begin
HVAGCControl(m_hhv, RED_CHANNEL + i, Gain);
end;
// 设置曝光时间
// 请参考曝光时间计算公式
dTint := 6.0 / 100.0;
dTint := dTint * 24000000.0 + 180.0;
lExposure := round(dTint);
lExposure := round(lExposure /(HV_Width + 244));
Status := HVAECControl(m_hhv, AEC_EXPOSURE_TIME,lExposure) ;
// 设置ADC的级别
HVADCControl(m_hhv, ADC_BITS, ADCLevel);
//
// 视频输出窗口,即视频输出范围,输出窗口取值范围必须在输入窗口范围以内,
// 视频窗口左上角X坐标和窗口宽度应为4的倍数,左上角Y坐标和窗口高度应为2的倍数
// 输出窗口的起始位置一般设置为(0, 0)即可。
//
HVSetOutputWindow(m_hhv, XStart, YStart, HV_Width, HV_Height);
//用户可以自己分配BTIMAPINFO缓冲区
m_pBmpInfo:= AllocMem(2048);
// 初始化BITMAPINFO 结构,此结构在保存bmp文件、显示采集图像时使用
m_pBmpInfo^.bmiHeader.biSize:= sizeof(BITMAPINFOHEADER);
// 图像宽度,一般为输出窗口宽度
m_pBmpInfo^.bmiHeader.biWidth:= HV_Width;
// 图像宽度,一般为输出窗口高度
m_pBmpInfo^.bmiHeader.biHeight:= HV_Height;
//
// 以下设置一般相同,
// 对于低于8位的位图,还应设置相应的位图调色板
//
m_pBmpInfo^.bmiHeader.biPlanes:= 1;
m_pBmpInfo^.bmiHeader.biBitCount:= 24;
m_pBmpInfo^.bmiHeader.biCompression:= BI_RGB;
m_pBmpInfo^.bmiHeader.biSizeImage:= 0;
m_pBmpInfo^.bmiHeader.biXPelsPerMeter:= 0;
m_pBmpInfo^.bmiHeader.biYPelsPerMeter:= 0;
m_pBmpInfo^.bmiHeader.biClrUsed:= 0;
m_pBmpInfo^.bmiHeader.biClrImportant:= 0;
Bmp := TBitmap.Create;
Bmp.Width:= HV_Width;
Bmp.Height := HV_Height;
Bmp.PixelFormat := pf24bit;
//
// 分配原始图像缓冲区,一般用来存储采集图像原始数据
// 一般图像缓冲区大小由输出窗口大小和视频格式确定。
//
//rgb 图像数据大小
m_ImgBufLength := HV_Width * HV_Height * 3;
//RAW格式数据大小
m_RawImgBufLength := HV_Width * HV_Height;
//分配缓冲区
m_pRawBuffer := AllocMem(m_RawImgBufLength);
m_pImageBuffer:= AllocMem(m_ImgBufLength);
//
// 启动数字摄像机采集图像到内存
ppBuf[1] := m_pRawBuffer;
pPointer := longWord(@ppBuf);
status := HVSnapShot(m_hhv, pPointer,1);
HV_VERIFY(status);
SaveDialog1.Filter := 'Bitmap Files(*.bmp)|*.bmp';
SaveDialog1.Title := 'Save Bmp';
if (HV_SUCCESS(status)) then
begin
if SaveDialog1.Execute then
begin
plutR := longword(@ m_pLutR);
plutG := longword(@ m_pLutG);
plutB := longword(@ m_pLutB);
// 将原始图像数据进行Bayer转换,转换后为24位。
ConvertBayer2Rgb(m_pImageBuffer, m_pRawBuffer, HV_Width, HV_Height, BAYER2RGB_NEIGHBOUR, plutR, plutG,plutB, True, BAYER_GR);
//调用win32的API函数将Buf中的数据以图象形式保存到结构Bmp
SetStretchBltMode(Bmp.Canvas.Handle, COLORONCOLOR);
SetDIBitsToDevice(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height,
0, 0, 0, m_pBmpInfo^.bmiHeader.biHeight,
m_pImageBuffer, m_pBmpInfo^, DIB_RGB_COLORS);
Bmp.SaveToFile(SaveDialog1.FileName);
end;
end;
//释放内存
Bmp.Free;
//释放缓冲区
if (m_pBmpInfo <> nil) then
FreeMem(m_pBmpInfo, 2048);
if (m_pRawBuffer <> nil) then
FreeMem(m_pRawBuffer, m_RawImgBufLength);
if (m_pImageBuffer <> nil) then
FreeMem(m_pImageBuffer, m_ImgBufLength);
// 关闭数字摄像机,释放数字摄像机内部资源
status:= EndHVDevice(m_hhv);
HV_VERIFY(status);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -