Halcon12 HObject与VC++ OpenCV Mat相互转换

网上大多是Halcon10 Hobject的例子,今天终于研究成功,贴出代码,欢迎批评指正奋斗

  1. // 转换函数
  2. HObject Mat2HObject(Mat& image)
  3. {
  4. HObject Hobj=HObject();
  5. int hgt=image.rows;
  6. int wid=image.cols;
  7. int i;
  8. // CV_8UC3
  9. if(image.type() == CV_8UC3)
  10. {
  11. vector<Mat> imgchannel;
  12. split(image,imgchannel);
  13. Mat imgB=imgchannel[ 0];
  14. Mat imgG=imgchannel[ 1];
  15. Mat imgR=imgchannel[ 2];
  16. uchar* dataR= new uchar[hgt*wid];
  17. uchar* dataG= new uchar[hgt*wid];
  18. uchar* dataB= new uchar[hgt*wid];
  19. for(i= 0;i<hgt;i++)
  20. {
  21. memcpy(dataR+wid*i,imgR.data+imgR.step*i,wid);
  22. memcpy(dataG+wid*i,imgG.data+imgG.step*i,wid);
  23. memcpy(dataB+wid*i,imgB.data+imgB.step*i,wid);
  24. }
  25. GenImage3(&Hobj, "byte",wid,hgt,(Hlong)dataR,(Hlong)dataG,(Hlong)dataB);
  26. delete []dataR;
  27. delete []dataG;
  28. delete []dataB;
  29. dataR= NULL;
  30. dataG= NULL;
  31. dataB= NULL;
  32. }
  33. // CV_8UCU1
  34. else if(image.type() == CV_8UC1)
  35. {
  36. uchar* data= new uchar[hgt*wid];
  37. for(i= 0;i<hgt;i++)
  38. memcpy(data+wid*i,image.data+image.step*i,wid);
  39. GenImage1(&Hobj, "byte",wid,hgt,(Hlong)data);
  40. delete[] data;
  41. data= NULL;
  42. }
  43. return Hobj;
  44. }
  45. Mat HObject2Mat(HObject Hobj)
  46. {
  47. HTuple htCh=HTuple();
  48. HTuple cType;
  49. Mat Image;
  50. ConvertImageType(Hobj,&Hobj, "byte");
  51. CountChannels(Hobj,&htCh);
  52. HTuple wid;
  53. HTuple hgt;
  54. int W,H;
  55. if(htCh[ 0].I()== 1)
  56. {
  57. HTuple ptr;
  58. GetImagePointer1(Hobj,&ptr,&cType,&wid,&hgt);
  59. W=(Hlong)wid;
  60. H=(Hlong)hgt;
  61. Image.create(H,W,CV_8UC1);
  62. uchar* pdata=(uchar*)ptr[ 0].I();
  63. memcpy(Image.data,pdata,W*H);
  64. }
  65. else if(htCh[ 0].I()== 3)
  66. {
  67. HTuple ptrR, ptrG, ptrB;
  68. GetImagePointer3(Hobj,&ptrR,&ptrG,&ptrB,&cType,&wid,&hgt);
  69. W=(Hlong)wid;
  70. H=(Hlong)hgt;
  71. Image.create(H,W,CV_8UC3);
  72. vector<Mat> vecM( 3);
  73. vecM[ 2].create(H,W,CV_8UC1);
  74. vecM[ 1].create(H,W,CV_8UC1);
  75. vecM[ 0].create(H,W,CV_8UC1);
  76. uchar* pr=(uchar*)ptrR[ 0].I();
  77. uchar* pg=(uchar*)ptrG[ 0].I();
  78. uchar* pb=(uchar*)ptrB[ 0].I();
  79. memcpy(vecM[ 2].data,pr,W*H);
  80. memcpy(vecM[ 1].data,pg,W*H);
  81. memcpy(vecM[ 0].data,pb,W*H);
  82. merge(vecM,Image);
  83. }
  84. return Image;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值