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

📄 main.pas

📁 大恒摄像机开发范例程序 有利于大家二次开发
💻 PAS
字号:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus;

type
  TFrmMain = class(TForm)
    MainMenu1: TMainMenu;
    SnapBtn: TMenuItem;
    SnapShotBtn: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure SnapShotBtnClick(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FrmMain: TFrmMain;

implementation

uses HVAPI;

{$R *.dfm}
var
        m_hhv: HHV;			//数字摄像机句柄

	m_bOpen: Boolean;		//初始化标志
	m_bStart: Boolean;		//启动标志

        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.FormCreate(Sender: TObject);
var
        status:HVSTATUS;
        i:integer;
        dTint:double;
        lExposure:longWord;        
begin

        DeviceNum:=1;
        Resolution:= RES_MODE0;
        SnapMode:= CONTINUATION;
        Layout:= BAYER_GR;
        Gain:= 8;
        ADCLevel := ADC_LEVEL1;

	//
	//	初始化所有成员变量,同时打开数字摄像机
	//
	status:= STATUS_OK;
	m_bOpen := FALSE;
	m_bStart := FALSE;



	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;
	
	//
	//	分配原始图像缓冲区,一般用来存储采集图像原始数据
	//  一般图像缓冲区大小由输出窗口大小和视频格式确定。
	//

        //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);


end;

procedure TFrmMain.FormDestroy(Sender: TObject);
var
      status: HVSTATUS;
begin
      //
      //	用户在没有通过菜单项正常关闭数字摄像机采集,
      //	而直接关闭应用程序时,应保证数字摄像机采集被关闭
      //

      status:= STATUS_OK;
      if (m_bOpen) then
      begin
          status:=HVCloseSnap(m_hhv);
      end;

      //	关闭数字摄像机,释放数字摄像机内部资源
      status:= EndHVDevice(m_hhv);
      HV_VERIFY(status);

      //释放缓冲区
      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);


end;





procedure TFrmMain.SnapShotBtnClick(Sender: TObject);
var
    status:HVSTATUS;
    strMsg:string;
    VideoDc:HDC;
    ppBuf:Array[1..1] of pChar;     //保存图像的缓冲区列表
    pPointer:longWord;             //指向缓冲区列表的指针

    plutR:longword;       //指向颜色查值表的指针
    plutG:longword;
    plutB:longword;
begin
	status := STATUS_OK;


	//
	//	启动数字摄像机采集序列图像到内存

        ppBuf[1] := m_pRawBuffer;
        pPointer := longWord(@ppBuf);
	status := HVSnapShot(m_hhv, pPointer,1);
	HV_VERIFY(status);

	if (HV_SUCCESS(status)) then
        begin
		//strMsg := 'Snap shot 1 images totally to memory ';
	       	MessageBox(FrmMain.Handle,'Snap shot 1 images totally to memory ', 'Notice', MB_OK);

                VideoDc := GetDc(FrmMain.Handle);

                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);

		//在视图客户区显示图像
		StretchDIBits(VideoDc,
			0,
			0,
			Width,				//显示窗口宽度
			Height,				//显示窗口高度
			0,
			0,
			Width,				//图像宽度
			Height,				//图像高度
			m_pImageBuffer,		//图像缓冲区
			m_pBmpInfo^,			//BMP图像描述信息
			DIB_RGB_COLORS,
			SRCCOPY
			);

		ReleaseDC(FrmMain.Handle, VideoDC);
	end;

end;

end.

⌨️ 快捷键说明

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