1. 程式人生 > 其它 >Opencv和Halcon影象相互轉換

Opencv和Halcon影象相互轉換

Opencv和Halcon影象相互轉換

HObject型別→ Mat型別 影象轉化

 1 Mat HObject2Mat(HObject Hobj)
 2 { 
 3     HTuple htCh;
 4     HString cType;
 5     cv::Mat Image;
 6     ConvertImageType(Hobj, &Hobj, "byte");
 7     CountChannels(Hobj, &htCh);
 8     Hlong wid = 0;
 9     Hlong hgt = 0;
10     if (htCh[0].I() == 1
) 11 { 12 HImage hImg(Hobj); 13 void *ptr = hImg.GetImagePointer1(&cType, &wid, &hgt);//GetImagePointer1(Hobj, &ptr, &cType, &wid, &hgt); 14 int W = wid; 15 int H = hgt; 16 Image.create(H, W, CV_8UC1); 17 unsigned char *pdata = static_cast<unsigned char
*>(ptr); 18 memcpy(Image.data, pdata, W*H); 19 } 20 else if (htCh[0].I() == 3) 21 { 22 void *Rptr; 23 void *Gptr; 24 void *Bptr; 25 HImage hImg(Hobj); 26 hImg.GetImagePointer3(&Rptr, &Gptr, &Bptr, &cType, &wid, &hgt);
27 int W = wid; 28 int H = hgt; 29 Image.create(H, W, CV_8UC3); 30 vector<cv::Mat> VecM(3); 31 VecM[0].create(H, W, CV_8UC1); 32 VecM[1].create(H, W, CV_8UC1); 33 VecM[2].create(H, W, CV_8UC1); 34 unsigned char *R2 = (unsigned char *)Rptr; 35 unsigned char *G = (unsigned char *)Gptr; 36 unsigned char *B = (unsigned char *)Bptr; 37 memcpy(VecM[2].data, R2, W*H); 38 memcpy(VecM[1].data, G, W*H); 39 memcpy(VecM[0].data, B, W*H); 40 cv::merge(VecM, Image); 41 } 42 return Image; 43 }

Mat型別→ HObject型別 影象轉化

 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 }