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