Opencv和Halcon影象相互轉換
阿新 • • 發佈:2022-03-03
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 }