Hobject是Halcon中的图像格式,Mat是OpenCV中的图像格式,以下是二者的转换
using namespace cv;
using namespace Halcon;
//Hobject转Mat
Mat Hobject2Mat(Hobject Hobj)
{
HTuple htCh = HTuple();
char* cType="";
Mat Image;
convert_image_type(Hobj, &Hobj, "byte");
count_channels(Hobj, &htCh);
Hlong wid;
Hlong hgt;
int W, H;
if (htCh[0].I() == 1)
{
Hlong ptr;
get_image_pointer1(Hobj, &ptr, cType, &wid, &hgt);
W = wid;
H = hgt;
Image.create(H, W, CV_8UC1);
int64 ptrImage;
uchar* pdata = (uchar*)ptr;
memcpy(Image.data, pdata, W*H);
}
else if (htCh[0].I() == 3)
{
unsigned char *ptrR = NULL, *ptrG = NULL, *ptrB = NULL;
unsigned char* data = NULL;
char imgType[128] = { 0 };
get_image_pointer3(Hobj, (Hlong*)&ptrR, (Hlong*)&ptrG, (Hlong*)&ptrB, imgType, &wid, &hgt);
W = wid;
H = hgt;
Image.create(H, W, CV_8UC3);
vector<Mat> vecM(3);
vecM[2].create(H, W, CV_8UC1);
vecM[1].create(H, W, CV_8UC1);
vecM[0].create(H, W, CV_8UC1);
uchar* pr = (uchar*)ptrR;
uchar* pg = (uchar*)ptrG;
uchar* pb = (uchar*)ptrB;
memcpy(vecM[2].data, pr, W*H);
memcpy(vecM[1].data, pg, W*H);
memcpy(vecM[0].data, pb, W*H);
merge(vecM, Image);
}
return Image;
}
//Mat转Hobject
Hobject Mat2Hobject(Mat& image)
{
Hobject Hobj = Hobject();
int hgt = image.rows;
int wid = image.cols;
int i;
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);
}
gen_image3(&Hobj, "byte", wid, hgt, (Hlong)dataR, (Hlong)dataG, (Hlong)dataB);
delete[]dataR;
delete[]dataG;
delete[]dataB;
dataR = NULL;
dataG = NULL;
dataB = NULL;
}
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);
gen_image1(&Hobj, "byte", wid, hgt, (Hlong)data);
delete[] data;
data = NULL;
}
return Hobj;
}