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

简介: [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();
  }

目录
相关文章
|
4月前
|
传感器 编解码 监控
LabVIEW图像采集处理项目中相机选择与应用
LabVIEW图像采集处理项目中相机选择与应用
41 0
|
6月前
|
计算机视觉
[Qt&MFC] 各种方式的图像读取(OpenCv、Halcon)
[Qt&MFC] 各种方式的图像读取(OpenCv、Halcon)
118 0
|
存储 编解码 计算机视觉
项目实战:Qt+OpenCV操作摄像头拍照、调节参数和视频录制
项目实战:Qt+OpenCV操作摄像头拍照、调节参数和视频录制
项目实战:Qt+OpenCV操作摄像头拍照、调节参数和视频录制
|
算法 数据可视化 开发工具
Baumer相机BGAPI SDK Demo软件去连接JPEG-650M相机进行采图时,发现图像显示为一条灰色条状图像(C++),联合OpenCV进行图像转换显示
Baumer相机BGAPI SDK Demo软件去连接JPEG-650M相机进行采图时,发现图像显示为一条灰色条状图像(C++),联合OpenCV进行图像转换显示
101 0
|
计算机视觉
Qt+opencv4区域鼠标截图+图像比对(视频采集)
Qt+opencv4区域鼠标截图+图像比对(视频采集)
|
传感器 安全 API
Baumer相机使用CameraExplorer软件采集VCXG-51M相机图像时,发现图像显示界面无任何图像现象。
Baumer相机使用CameraExplorer软件采集VCXG-51M相机图像时,发现图像显示界面无任何图像现象。
134 0
|
文字识别 监控 算法
Baumer工业相机堡盟相机使用BGAPISDK联合Halcon直接进行图像显示(Mono)(C#)(将图像数据Buffer转为HObject)
Baumer工业相机堡盟相机使用BGAPISDK联合Halcon直接进行图像显示(Mono)(C#)(将图像数据Buffer转为HObject)
131 0
|
文字识别 监控 算法
Baumer工业相机堡盟相机BGAPI SDK如何联合Halcon进行图像转换(C#)(将图像数据Buffer转为HObject)
Baumer工业相机堡盟相机BGAPI SDK如何联合Halcon进行图像转换(C#)(将图像数据Buffer转为HObject)
164 0
|
计算机视觉 C++
Qt中实时调取摄像头(利用OpenCV)
Qt中实时调取摄像头(利用OpenCV)
490 1
Qt中实时调取摄像头(利用OpenCV)
|
XML 传感器 并行计算
常用摄像头一些点云深度矫正ROS程序(ZED & kinect v2 & D415)(上)
常用摄像头一些点云深度矫正ROS程序(ZED & kinect v2 & D415)(上)
常用摄像头一些点云深度矫正ROS程序(ZED & kinect v2 & D415)(上)
下一篇
无影云桌面