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;
}