项目之前一直使用的OpenCV,最近有个小问题使用Halcon有更好的效果,于是有了cv::Mat和Halcon中HObject互相转换的需求。
参考了博客http://blog.youkuaiyun.com/u010627377/article/details/76687178,我使用他的代码的时候出错了,于是在其基础上稍微做了下修改。Halcon的版本是13,OpenCV的版本是3.2。如有问题,欢迎讨论。
- HObject Mat2HObject(const cv::Mat &image)
- {
- HObject Hobj = HObject();
- int hgt = image.rows;
- int wid = image.cols;
- int i;
- // CV_8UC3
- if (image.type() == CV_8UC3)
- {
- vector<cv::Mat> imgchannel;
- split(image, imgchannel);
- cv::Mat imgB = imgchannel[0];
- cv::Mat imgG = imgchannel[1];
- cv::Mat imgR = imgchannel[2];
- uchar* dataR = new uchar[hgt*wid];
- uchar* dataG = new uchar[hgt*wid];
- uchar* dataB = new uchar[hgt*wid];
- for (i = 0; i<hgt; i++)
- {
- memcpy(dataR + wid*i, imgR.data + imgR.step*i, wid);
- memcpy(dataG + wid*i, imgG.data + imgG.step*i, wid);
- memcpy(dataB + wid*i, imgB.data + imgB.step*i, wid);
- }
- GenImage3(&Hobj, "byte", wid, hgt, (Hlong)dataR, (Hlong)dataG, (Hlong)dataB);
- delete[]dataR;
- delete[]dataG;
- delete[]dataB;
- dataR = NULL;
- dataG = NULL;
- dataB = NULL;
- }
- // CV_8UCU1
- else if (image.type() == CV_8UC1)
- {
- uchar* data = new uchar[hgt*wid];
- for (i = 0; i<hgt; i++)
- memcpy(data + wid*i, image.data + image.step*i, wid);
- GenImage1(&Hobj, "byte", wid, hgt, (Hlong)data);
- delete[] data;
- data = NULL;
- }
- return Hobj;
- }
-
- cv::Mat HObject2Mat(HObject Hobj)
- {
- HTuple htCh;
- HString cType;
- cv::Mat Image;
- ConvertImageType(Hobj, &Hobj, "byte");
- CountChannels(Hobj, &htCh);
- Hlong wid = 0;
- Hlong hgt = 0;
- if (htCh[0].I() == 1)
- {
- HImage hImg(Hobj);
- void *ptr = hImg.GetImagePointer1(&cType, &wid, &hgt);//GetImagePointer1(Hobj, &ptr, &cType, &wid, &hgt);
- int W = wid;
- int H = hgt;
- Image.create(H, W, CV_8UC1);
- unsigned char *pdata = static_cast<unsigned char *>(ptr);
- memcpy(Image.data, pdata, W*H);
- }
- else if (htCh[0].I() == 3)
- {
- void *Rptr;
- void *Gptr;
- void *Bptr;
- HImage hImg(Hobj);
- hImg.GetImagePointer3(&Rptr, &Gptr, &Bptr, &cType, &wid, &hgt);
- int W = wid;
- int H = hgt;
- Image.create(H, W, CV_8UC3);
- vector<cv::Mat> VecM(3);
- VecM[0].create(H, W, CV_8UC1);
- VecM[1].create(H, W, CV_8UC1);
- VecM[2].create(H, W, CV_8UC1);
- unsigned char *R = (unsigned char *)Rptr;
- unsigned char *G = (unsigned char *)Gptr;
- unsigned char *B = (unsigned char *)Bptr;
- memcpy(VecM[2].data, R, W*H);
- memcpy(VecM[1].data, G, W*H);
- memcpy(VecM[0].data, B, W*H);
- cv::merge(VecM, Image);
- }
- return Image;
- }

本文分享了在项目中从OpenCV的cv::Mat转换到Halcon的HObject的代码实现,解决了两者间图像格式互转的问题。适用于Halcon 13和OpenCV 3.2版本,涵盖单通道和三通道图像的处理。
1966

被折叠的 条评论
为什么被折叠?



