16,748
社区成员
发帖
与我相关
我的任务
分享
procedure TFormMain.OpenOneDev(iDevId: Integer);
var
Hr: Integer;
begin
if m_DoFlag[iDevId] then
begin
MessageBox(0, PChar('相机 '+IntToStr(iDevId)+' 已经打开!'), PChar('提示'), MB_ICONWARNING or MB_OK);
Exit;
end;
//打开设备
Hr:= HV_OpenDevice(iDevId);
if (Hr <> HV_SUCCESS) then
begin
MessageBox(0, PChar('HV_OpenDevice 失败!'), PChar('提示'), MB_ICONWARNING or MB_OK);
Exit;
end;
//初始化设备
Hr:= HV_DevCapInit(iDevId);
if (Hr <> HV_SUCCESS) then
begin
MessageBox(0, PChar('HV_DevCapInit 失败!'), PChar('提示'), MB_ICONWARNING or MB_OK);
Exit;
end;
Hr:= HV_SetExposureValue(3000,iDevId);
if (Hr <> HV_SUCCESS) then
begin
MessageBox(0, PChar('HV_SetExposureValue 失败!'), PChar('提示'), MB_ICONWARNING or MB_OK);
Exit;
end;
//设置去抖动的时间,该时间越短,触发采集输出就越快
Hr:= HV_SetSnapDebounceTime(20,iDevId);
if (Hr <> HV_SUCCESS) then
begin
MessageBox(0, PChar('HV_SetSnapDebounceTime 失败!'), PChar('提示'), MB_ICONWARNING or MB_OK);
Exit;
end;
//设置触发模式下的参数,第一个参数为相机输出的帧率,不能高于该相机固有帧率。
//第二个参数为一次触发获取几幅图像,该参数设为0时,则表示以第一个参数为帧率连续触发输出。
//第三个参数表示相机的对应网卡的ID号
HV_SetSnapTrigFreqImgCount(14,1,iDevId);
//设置回调函数
case iDevId of
0:HV_SetCallBack(@MyCallBackProc0,iDevId);
1:HV_SetCallBack(@MyCallBackProc1,iDevId);
2:HV_SetCallBack(@MyCallBackProc2,iDevId);
3:HV_SetCallBack(@MyCallBackProc3,iDevId);
end;
//设置采集模式,第一个参数:1:连续采集模式,0:触发模式
HV_SetPreviewSnapMode(0,1,iDevId);
HV_SetImageMirror(2,iDevId);
//设置SDK进入采集状态
HV_StartCapture(iDevId);
m_DoFlag[iDevId]:= True;
Label2.Caption:= '相机:'+IntToStr(iDevId);
end;
procedure TFormMain.SpeedButton1Click(Sender: TObject);
begin
OpenOneDev(0);
// SpeedButton2.Click; //直接调用打开设备2的事件,还是会跳出来。。。
end;
procedure TFormMain.SpeedButton2Click(Sender: TObject);
begin
OpenOneDev(1); //单个打开,就可以
end;
procedure TFormMain.SpeedButton3Click(Sender: TObject);
begin
OpenOneDev(2);
end;
procedure TFormMain.OpenDeviceBtnClick(Sender: TObject);
var
i: Integer;
begin
for i:=0 to 2 do
OpenOneDev(i);
end;
procedure TFormMain.SpeedButton1Click(Sender: TObject);
begin
OpenOneDev(0);
OpenOneDev(1);
OpenOneDev(2);
end;
执行到OpenOneDev(1);还是不行~~~~
神啊,救救我吧/******************************************************************************
* Function: HV_DevCapInit
* Description: 设备捕捉初始化
* Format:
* HRESULT HV_DevCapInit(int nDevId, LPCSTR lpFileName = NULL) ;
* Params:
* int nDevId
* LPCSTR lpFileName: 配置文件保存路径,当为空时,默认为当前目录;
* Return:
* HV_SUCCESS: 成功
******************************************************************************/
HVGIGE_WP_API HRESULT __stdcall HV_DevCapInit(int nDevId, LPCSTR lpFileName = NULL);
后边多了一个参数。
就剩下这个循环i改变很大值的问题了
procedure TFormMain.OpenOneDev;
var
Hr: Integer;
iDevId: Integer;
begin
for iDevId := 0 to 2 do
begin
if m_DoFlag[iDevId] then
begin
MessageBox(0, PChar('Device is already opened!'), PChar('Error'), MB_ICONWARNING or MB_OK);
Exit;
end;
Hr:= HV_OpenDevice(iDevId);
if (Hr <> HV_SUCCESS) then
begin
MessageBox(0, PChar('Open Device fail!'), PChar('Error'), MB_ICONWARNING or MB_OK);
Exit;
end;
Hr:= HV_DevCapInit(iDevId);
if (Hr <> HV_SUCCESS) then
begin
MessageBox(0, PChar('Device initial fail!'), PChar('Error'), MB_ICONWARNING or MB_OK);
Exit;
end;
HV_SetExposureValue(200,iDevId);
HV_SetSnapDebounceTime(20,iDevId);
HV_SetSnapTrigFreqImgCount(14,1,iDevId);
case iDevId of
0:HV_SetCallBack(@MyCallBackProc0,iDevId);
1:HV_SetCallBack(@MyCallBackProc1,iDevId);
2:HV_SetCallBack(@MyCallBackProc2,iDevId);
end;
HV_SetPreviewSnapMode(0,0,iDevId);
//HV_SetImageMirror(2,iDevId);
HV_StartCapture(iDevId);
m_DoFlag[iDevId]:= True;
end;
end;
procedure TFormMain.Button1Click(Sender: TObject);
begin
OpenOneDev;
end;
void CIndCamDemoDlg::OnOpenCam0()
{
int i;
for(i=0;i<3;i++)
//这是我们准备用循环的方式把8个相机顺序打开,我们这里用三个相机做实验 {
// TODO: Add your control notification handler code here
if (bCamStatus[i])
{
MessageBox(_T("Device is already opened!"));
return ;
}
HRESULT hr;
hr = HV_OpenDevice(i); //打开设备
if(hr!=HV_SUCCESS)
{
MessageBox(_T("Open Device fail!"));
return ;
}
// 初始化设备
hr = HV_DevCapInit(i); //初始化设备
if(hr!=HV_SUCCESS)
{
MessageBox(_T("Device initial fail!"));
return ;
}
HV_SetExposureValue(200,i); //设置曝光行数,一行为30微秒左右
HV_SetSnapDebounceTime(20,i); //设置去抖动的时间,该时间越短,触发采集输出就越快
HV_SetSnapTrigFreqImgCount(14,1,i); //设置触发模式下的参数,第一个参数为相机输出的帧率,不能高于该相机固有帧率。
//第二个参数为一次触发获取几幅图像,该参数设为0时,则表示以第一个参数为帧率连续触发输出。
//第三个参数表示相机的对应网卡的ID号
//设置回调函数
if (i==0)
HV_SetCallBack(CIndCamDemoDlg::MyCallBackProc0,i);
if (i==1)
HV_SetCallBack(CIndCamDemoDlg::MyCallBackProc1,i);
if (i==2)
HV_SetCallBack(CIndCamDemoDlg::MyCallBackProc2,i);
//设置采集模式,第一个参数:1:连续采集模式,0:触发模式
HV_SetPreviewSnapMode(0,0,i);
//设置SDK进入采集状态
HV_StartCapture(i);
bCamStatus[i] = TRUE;
// m_nIndex = -1;
//MessageBox(_T("打开成功!"));
//下边的OpenCam1是为了测试两个相机打开的时候会不会跳出来,把相机1打开的消息事件放到这里来执行。 //OnOpenCam1();
}
return ;
}
在VC里边这样就没问题procedure TFormMain.OpenDeviceBtnClick(Sender: TObject);
var
i: Integer;
begin
for i:=0 to 2 do
begin
if m_DoFlag[i] then
begin
MessageBox(0, PChar('相机 '+IntToStr(i)+' 已经打开!'), PChar('提示'), MB_ICONWARNING or MB_OK);
Exit;
end;
HV_OpenDevice(i);
// HV_DevCapInit(i);
HV_SetExposureValue(3000,i);
HV_SetSnapDebounceTime(20,i);
HV_SetSnapTrigFreqImgCount(14,1,i);
if (i=0) then
HV_SetCallBack(@MyCallBackProc0,0);
if (i=1) then
HV_SetCallBack(@MyCallBackProc1,1);
if (i=2) then
HV_SetCallBack(@MyCallBackProc2,2);
if (i=3) then
HV_SetCallBack(@MyCallBackProc3,3);
HV_SetPreviewSnapMode(0,1,i);
HV_SetImageMirror(2,i);
HV_StartCapture(i);
m_DoFlag[i]:= True;
label2.Caption:= 'OK';
Sleep(3000);
end;
end;
。。。。。。涛声依旧