一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

OpenCV和Halcon之间有很多数据要转换,特此记录

1 字符串与HTuple互转

1 char *pImageName = "D:/data/temp.png";
2 HTuple hv_path;
3 hv_path = (HTuple)(pImageName);
4 cout << hv_path.S() << endl;
5 string path = hv_path.S();
6 cout << path<<endl;

2 double与HTuple互转

1 HTuple hv_data;
2 hv_data = 10.0;
3 double data = hv_path.D();
4 cout << data<<endl;

3 Mat 与 HObject互转,这两个项目经常用,代码来自别的博客,非常感谢。

Mat 转 HObject

 1 HObject Cpu_halcon_detect::mat_to_hobject(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<Mat> imgchannel;
11         split(image, imgchannel);
12         Mat imgB = imgchannel[0];
13         Mat imgG = imgchannel[1];
14         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 }

HObject 转 Mat

 1 Mat Cpu_halcon_detect::hobject_to_mat(HObject Hobj)
 2 {
 3     HTuple htCh = HTuple();
 4     HTuple cType;
 5     Mat Image;
 6     ConvertImageType(Hobj, &Hobj, "byte");
 7     CountChannels(Hobj, &htCh);
 8     HTuple wid;
 9     HTuple hgt;
10     int W, H;
11     if (htCh[0].I() == 1)
12     {
13         HTuple ptr;
14         GetImagePointer1(Hobj, &ptr, &cType, &wid, &hgt);
15         W = (Hlong)wid;
16         H = (Hlong)hgt;
17         Image.create(H, W, CV_8UC1);
18         uchar* pdata = (uchar*)ptr[0].I();
19         memcpy(Image.data, pdata, W*H);
20     }
21     else if (htCh[0].I() == 3)
22     {
23         HTuple ptrR, ptrG, ptrB;
24         GetImagePointer3(Hobj, &ptrR, &ptrG, &ptrB, &cType, &wid, &hgt);
25         W = (Hlong)wid;
26         H = (Hlong)hgt;
27         Image.create(H, W, CV_8UC3);
28         vector<Mat> vecM(3);
29         vecM[2].create(H, W, CV_8UC1);
30         vecM[1].create(H, W, CV_8UC1);
31         vecM[0].create(H, W, CV_8UC1);
32         uchar* pr = (uchar*)ptrR[0].I();
33         uchar* pg = (uchar*)ptrG[0].I();
34         uchar* pb = (uchar*)ptrB[0].I();
35         memcpy(vecM[2].data, pr, W*H);
36         memcpy(vecM[1].data, pg, W*H);
37         memcpy(vecM[0].data, pb, W*H);
38         merge(vecM, Image);
39     }
40     return Image;
41 }

 

posted on 2020-12-28 13:37  一杯清酒邀明月  阅读(3471)  评论(0编辑  收藏  举报