图像处理之Hobject与Mat互转

这篇博客介绍了如何在C++环境中将Halcon的Hobject图像格式转换为OpenCV的Mat格式,以及反过来将Mat转换为Hobject。转换过程涉及获取图像指针、通道信息以及数据拷贝。这对于在两种库之间进行图像处理任务非常有用。
摘要由CSDN通过智能技术生成

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;
}
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值