1、首先,用助手进行采集后生成代码导出
上面函数导出成c++代码如下:
HObject ho_Image;
HTuple hv_AcqHandle;
OpenFramegrabber("GigEVision", 0, 0, 0, 0, 0, 0, "default", -1, "default", -1,
"false", "default", "PIN", 0, -1, &hv_AcqHandle);
GrabImageStart(hv_AcqHandle, -1);
while (0 != 1)
{
GrabImageAsync(&ho_Image, hv_AcqHandle, -1);
//Image Acquisition 01: Do something
}
CloseFramegrabber(hv_AcqHandle);
它是通过while循环,来实时更新画面。而在VS中,类似halcon的图像的采集有如下方式可以实现:
- 用定时器OnTimer函数,而SetTimer函数会每隔一段时间调用一次OnTimer函数里面的采集函数,到达每隔一段时间(可以控制)去采集一次图像的效果。
- 采用多线程,将采集函数放到子线程中。
- for循环
- SDK中的回调函数:将采集函数放到回调函数中,进行调用。
2、下面介绍采用定时器方法将halcon相机实时采集代码转换成VC++代码并在MFC上显示
1)将打开相机放到初始化函数OnInitDialog()中加入打开设备
OpenFramegrabber("GigEVision", 0, 0, 0, 0, 0, 0, "default", -1, "gray", -1,
"false", "default", "PIN", 0, -1, &hv_AcqHandle);
2)新建一个采集按钮,里面添加
//开始抓取,将抓取到的图像传入句柄hv_AcqHandle中
GrabImageStart(hv_AcqHandle, -1);
//每隔60毫秒,调用一次定时器中的抓取图像函数
SetTimer(1,60,NULL);
3)定义定时器函数OnTimer()
HObject ho_Image;
HTuple hv_AcqHandle,hv_Pointer,hv_Type,hv_Width,hv_Height;
BOOL m_kong = TRUE;
//这个指针装halcon图像的单通道指针
BYTE *pImage;
//结构体指针变量
BITMAPINFO* bmpinf;
//容纳结构体的数组
char Buf[2048];
GrabImageAsync(&ho_Image, hv_AcqHandle, -1);
//获取图像单通道指针hv_Pointer
GetImagePointer1(ho_Image,&hv_Pointer,&hv_Type,&hv_Width,&hv_Height);
//将halcon类型的控制变量强制转换
int Width = (Hlong)hv_Width;
int Height = (Hlong)hv_Height;
//专门放灰度的指针
BYTE * p = (BYTE *)hv_Pointer[0].L();
if(m_kong)
{
//pt = new BYTE(Width*Height);
//因为是灰度图,一个像素占一个字节
//为指针动态分配内存空间
pImage = new BYTE[Width*Height];
//将bool类型变量置为零,不让其一直申请内存空间
m_kong = FALSE;
}
//将数据转到分配好空间的指针 pImage中
memcpy(pImage,p,Width*Height*sizeof(BYTE));
/*********变量转换完成,开始显示*********************/
//位图信息头
//给信息头指针分配内存空间
bmpinf = (BITMAPINFO*)Buf;
//初始化BITMAPINFO结构,此结构在保存bmp文件,显示采集图像时使用
bmpinf->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpinf->bmiHeader.biWidth = Width;
bmpinf->bmiHeader.biHeight = Height;
bmpinf->bmiHeader.biBitCount = 8; //每个像素占8位
bmpinf->bmiHeader.biCompression = BI_RGB;
bmpinf->bmiHeader.biSizeImage = 0;
bmpinf->bmiHeader.biClrImportant = 0;
bmpinf->bmiHeader.biClrUsed = 0;
bmpinf->bmiHeader.biXPelsPerMeter = 0;
bmpinf->bmiHeader.biYPelsPerMeter = 0;
bmpinf->bmiHeader.biPlanes = 1;
//位图颜色表:灰度图比rgb三通道图多个颜色表,它由256和结构体,第一个结构体都是0,以此类推
for(int i = 0; i<256; i++)
{
bmpinf->bmiColors[i].rgbBlue=i;
bmpinf->bmiColors[i].rgbRed=i;
bmpinf->bmiColors[i].rgbGreen=i;
//预留一般为零
bmpinf->bmiColors[i].rgbReserved=0;
}
/***********显示部分******************/
CDC *pDC;
CRect Vedio;
pDC = GetDlgItem(IDC_DISPLAY_STATIC)->GetDC();
GetDlgItem(IDC_DISPLAY_STATIC)->GetClientRect(Vedio);
SetStretchBltMode(pDC->GetSafeHdc(),COLORONCOLOR);
//显示图像函数
StretchDIBits(pDC->GetSafeHdc(),
Vedio.left,
Vedio.top,
Vedio.Width(),
Vedio.Height(),
0,
0,
Width, //图像宽
Height, //图像高
pImage, //图像缓冲区
bmpinf, //BMP图像描述信息
DIB_RGB_COLORS,
SRCCOPY);
GetDlgItem(IDC_DISPLAY_STATIC)->ReleaseDC(pDC);
3)添加一个close消息,关闭窗口后自动关闭相机
void CHalconImageGatherDlg::OnClose()
{
CloseFramegrabber(hv_AcqHandle);
CDialogEx::OnClose();
}