Halcon中的HObject类型转OpenCV中的Mat类型_halcon hobject转opencv mat-程序员宅基地

技术标签: Halcon  opencv  

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 *R2 = (unsigned char *)Rptr;
		unsigned char *G = (unsigned char *)Gptr;
		unsigned char *B = (unsigned char *)Bptr;
		memcpy(VecM[2].data, R2, W*H);
		memcpy(VecM[1].data, G, W*H);
		memcpy(VecM[0].data, B, W*H);
		cv::merge(VecM, Image);
	}
	return Image;
}

Mat转HObject

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38815760/article/details/88759919

智能推荐

Android自定义摇杆_rockerview kongqw:leftbottombackground-程序员宅基地

文章浏览阅读2.4w次,点赞26次,收藏76次。转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN效果图源码KqwRockerDemo喜欢就给个star,谢谢!功能支持自适应大小支持2个方向、4个方向、8个方向的摇动监听支持摇动角度获取可选回调模式支持可摇动区域自定义支持摇杆自定义支持设置图片、色值、Share图形使用

###七段数码管绘制###python_绘制abcdef七段数码管,数码管风格不限。-程序员宅基地

文章浏览阅读291次。七段数码管绘制要求如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬(1) 使用 time 库获得系统当前时间,格式如下..._绘制abcdef七段数码管,数码管风格不限。

设置harbor开机自启动_harbor 开机自启-程序员宅基地

文章浏览阅读7.4k次,点赞5次,收藏14次。编辑文件/lib/systemd/system/harbor.service[Unit]Description=HarborAfter=docker.service systemd-networkd.service systemd-resolved.serviceRequires=docker.serviceDocumentation=http://github.com/vmware/h..._harbor 开机自启

从小白开始学python-网络爬虫二 (HTML、 CSS、Beautiful Soup介绍)_python基础知识与html/css样式基础知识的巩固,学习python爬虫并练习-程序员宅基地

文章浏览阅读652次,点赞5次,收藏10次。python网络爬虫HTML和CSS简介Beautiful Soup正则表达式_python基础知识与html/css样式基础知识的巩固,学习python爬虫并练习

vue中better-scroll中页面滚动无效的问题_vue使用better-scroll监听滚动不生效on('scroll-程序员宅基地

文章浏览阅读3.4k次,点赞5次,收藏2次。因为在做项目的时候要用到滚动,所以引用了better-scroll这个插件,于是按照官网用法:&lt;script&gt; import BScroll from 'better-scroll' export default{ name: "CityList", mounted(){ this.scroll = new BScroll(this..._vue使用better-scroll监听滚动不生效on('scroll

12.大小写转换(编程入门题-C/C++&Java&Python实现)_题目:从键盘输入一个小写字母,要求改用大写字母输出。char fun(char c)-程序员宅基地

文章浏览阅读966次。大小写转换(编程入门题-C/C++&Java&Python实现)题目描述从键盘输入一个大写字母,要求改用小写字母输出。输入包括多组测试数据以EOF结束,每组输入一个大写字母。输出输出对应的小写字母。样例输入 AB样例输出 ab_题目:从键盘输入一个小写字母,要求改用大写字母输出。char fun(char c)

随便推点

简单rpm打包测试_macrpm怎么测试-程序员宅基地

文章浏览阅读1.5k次。1 准备首先请准备一个Linux环境,比如CentOS。 RPM打包使用的是rpmbuild命令,这个命令来自rpm-build包,这个是必装的。$ yum install rpm-build当然也可以直接安装rpmdevtools,这个工具还包含一些其他的工具,同时它依赖rpm-build,所以直接安装的话会同时把rpm-build装上。$ yum install rpmdevtools当然,根..._macrpm怎么测试

【Pandas】修改Pandas的行或列的名字(重命名)-程序员宅基地

文章浏览阅读4.4w次,点赞6次,收藏34次。pandas.DataFrame.rename使用函数: DataFrame.rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None)功能:更改轴标签函数字典值必须是唯一的(1对1)。未包含在 字典/Series 中的标签将保留原样。列出的额外标签不会引...

Linux下载并安装JDK1.8_linux jdk 1.8.0_131下载-程序员宅基地

文章浏览阅读7.6k次,点赞3次,收藏4次。一、下载并配置下载地址:点击下载 使用命令进行解压 我们要将解压后的【jdk1.8.0_131】里面的所有数据移动到我们需要安装的文件夹当中,我们打算将jdk安装在usr/java当中,我们在usr目录下新建一个java文件夹 将【jdk1.8.0_131】里的数据拷贝至java目录下 修改环境变量 在打开的文件结尾添加如下的代码 export JA..._linux jdk 1.8.0_131下载

vs2015企业版安装教程-程序员宅基地

文章浏览阅读6.4k次。参考教程VS2015详细安装步骤_vs2015企业版安装教程

【老九学堂】【PHP】第一章_老九课堂讲义-程序员宅基地

文章浏览阅读299次。注意:hi~小伙伴们,老九君很激动又和大家见面了,作业是检验自己学习成效的方式之一,也希望大家认真对待。如有任何疑问和好的建议,欢迎骚扰老九君。【课后作业】1.列举常见的WEB服务器和数据库服务器。2.列举你所熟知的动态网页程序设计语言。3.PHP的开始标记与结束标记有哪些,使用时有何注意,你更喜欢哪种标记方式?4.echo语句和print语句有何区别和联系?print_r实现什么功能?..._老九课堂讲义

MySQL5.5安装教程及64位/32位下载指南-程序员宅基地

文章浏览阅读5.3k次。MySQL5.5是一款开源的关系型数据库管理系统,使用这款软件可以用于数据库的管理、存储操作,拥有性能稳定、执行速度快的特点,拥有速度快、配置简单的特点,可以说是php开发者以及web管理者的必备,这个mysql5.5版本也是较为经典稳定的一个版本,支持32位和64位系统。MySQL5.5安装教程1、运行安装包,勾选同意,Next2、选择安装类型第一个选项包含了一些MySQL其他组件,如果只安装M..._下载mysql-5.5-56-win32位