OpenCV的Mat和Halcon的HObject类型互相转换

项目之前一直使用的OpenCV,最近有个小问题使用Halcon有更好的效果,于是有了cv::Mat和Halcon中HObject互相转换的需求。

参考了博客http://blog.csdn.net/u010627377/article/details/76687178,我使用他的代码的时候出错了,于是在其基础上稍微做了下修改。Halcon的版本是13,OpenCV的版本是3.2。如有问题,欢迎讨论。


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



猜你喜欢

转载自blog.csdn.net/monk1992/article/details/83105573