分享

Halcon12.0结合vs2010进行大恒相机SDK二次开发

 ouyangsbb 2019-10-18

Halcon12.0结合vs2010进行大恒相机SDK二次开发

2018-04-01 21:51:11 德赛法 阅读数 3082
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

一 功能

实时显示通过调用halcon函数处理后的图像

二 前期

相机大恒MER-500-7UM,系统win7-64位,编程环境vs2010,软件halcon12.0,基础开发为大恒自带样例SDK包(C:\Program Files\Daheng Imavision\MER-Series\Samples\VC SDK\src\GxSingleCamMono)

三 方法

先说总体思想,直接在SDK开发基础上增加图像处理功能。先将bitmap转成HObject(必须要把bitmap格式转成halcon相关格式,然后才能调用halcon函数库处理图像),然后调用halcon库函数(halcon生成的图像处理cpp代码片段),最后再将处理后的图像格式由HObject改成bitmap,通过大恒自身带的函数显示出来。

1   打开halcon12.0->文件->浏览实例程序->图像分割->background_seg.hdev->文件->导出->C++,HALCON/C++。

2 打开大恒SDK开发包,位置如上文((C:\Program Files\Daheng Imavision\MER-Series\Samples\VC SDK\src\GxSingleCamMono)视安装目录而定)GxSingleCamMono_VS2010。然后把halcon生成的cpp文件代码截取加入到CGxSingleCamMonoDlg.cpp中。代码中加中文注释的部分是我添加的代码(A,bitmap转HObject;B,halcon图像处理;C,HObject转bitmap)

  1. void __stdcall CGxSingleCamMonoDlg::OnFrameCallbackFun(GX_FRAME_CALLBACK_PARAM* pFrame)
  2. {
  3. CGxSingleCamMonoDlg *pDlg = (CGxSingleCamMonoDlg*)(pFrame->pUserParam);
  4. int nImageHeight = (int)pDlg->m_nImageHeight;
  5. int nImageWidth = (int)pDlg->m_nImageWidth;
  6. if (pFrame->status == 0)
  7. {
  8. memcpy(pDlg->m_pBufferRaw,pFrame->pImgBuf,pFrame->nImgSize);
  9. // Show image after flipping image data if mono camera has been used.
  10. for(int i =0;i <nImageHeight;i++)
  11. {
  12. memcpy(pDlg->m_pImageBuffer+i*nImageWidth, pDlg->m_pBufferRaw+(nImageHeight-i-1)*nImageWidth,(size_t)nImageWidth);
  13. }
  14. ///////////bitmap转HObject///////////
  15. HObject Image;
  16. GenImage1(&Image,"byte",(HTuple)nImageWidth,(HTuple)nImageHeight,(long)pDlg->m_pImageBuffer);
  17. ////////////////////////////////////
  18. ///////////halcon图像处理///////////
  19. HObject ho_EdgeAmplitude,ho_Edges;
  20. SobelAmp(Image, &ho_EdgeAmplitude, "thin_sum_abs", 3);
  21. Threshold(ho_EdgeAmplitude, &ho_Edges, 5, 255);
  22. ////////////////////////////////////
  23. ///////////HObject转bitmap///////////
  24. HTuple hv_Pointer;
  25. HTuple hv_Type="byte";
  26. HTuple hv_Width=nImageWidth;
  27. HTuple hv_Height=nImageHeight;
  28. GetImagePointer1(ho_EdgeAmplitude, &hv_Pointer, &hv_Type, &hv_Width, &hv_Height);
  29. BYTE *p=(BYTE *)hv_Pointer[0].L();
  30. int height= (Hlong)hv_Height;
  31. int width = (Hlong)hv_Width;
  32. memcpy(pDlg->m_pImageBuffer,p,width*height*sizeof(BYTE));
  33. ////////////////////////////////////
  34. pDlg->DrawImg();
  35. if (pDlg->m_bIsSaveImg)
  36. {
  37. pDlg->SaveImage();
  38. }
  39. }
  40. }

四 效果

1  未加代码实时图像如下:


2 加代码实时图像如下:

注意看,有白色边界。


五 参考

1 https://blog.csdn.net/d_a_r_k/article/details/66973582将bitmap转HObject,原文是彩色图,我的是8位灰度图,因此做了些修改。

2 http://www./read-2272.html 将HObject转bitmap。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多