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

📄 main.pas

📁 大恒摄像机开发范例程序 有利于大家二次开发
💻 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 + -