[MFC] 调用相机采集图像(Halcon)

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶布布

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值