HObject cv::Mat 互相转换

xiaoxiao2021-02-28  40

void Mat2HObject(const Mat &image, HObject &outObj) { HObject Hobj = HObject(); int hgt = image.rows; int wid = image.cols; int i; // CV_8UC3 if (image.type() == CV_8UC3) { vector<Mat> imgchannel; split(image, imgchannel); Mat imgB = imgchannel[0]; Mat imgG = imgchannel[1]; 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; } outObj = Hobj; } void HObject2Mat(const HObject &_Hobj, cv::Mat &outMat) { HTuple htCh = HTuple(); HString cType; cv::Mat Image; HObject Hobj; ConvertImageType(_Hobj, &Hobj, "byte"); CountChannels(Hobj, &htCh); Hlong w; Hlong h; if (htCh[0].I() == 1) { void* ptr = ((HImage)Hobj).GetImagePointer1(&cType, &w, &h); Image.create(h, w, CV_8UC1); uchar *pdata = static_cast<unsigned char *>(ptr); memcpy(Image.data, pdata, w * h); } else if (htCh[0].I() == 3) { void** pr=nullptr; void** pg = nullptr; void** pb = nullptr; ((HImage)Hobj).GetImagePointer3(pr, pg, pb, &cType,&w, &h); Image.create(h, w, CV_8UC3); std::vector<cv::Mat> vecM(3); vecM[2].create(h, w, CV_8UC1); vecM[1].create(h, w, CV_8UC1); vecM[0].create(h, w, CV_8UC1); memcpy(vecM[2].data, pr, w * h); memcpy(vecM[1].data, pg, w * h); memcpy(vecM[0].data, pb, w * h); merge(vecM, Image); } outMat = Image; }

 

转载请注明原文地址: https://www.6miu.com/read-2613983.html

最新回复(0)