当前位置: 首页 > article >正文

全网首发!!!opencv三通道Mat点云转halcon点云—HTuple类型

OpenCV三通道Mat点云转Halcon点云—HTuple类型的难点

在将OpenCV中的三通道Mat(通常用于存储图像数据,包括RGB三通道)转换为Halcon中的点云数据时,并直接转换为Halcon特有的HTuple类型(HTuple是Halcon中用于存储和处理数据的强大容器,可以包含多种类型的数据,如整数、浮点数、字符串等,并支持数组和动态数据结构),存在以下难点:

  1. 数据结构差异
    • OpenCV的Mat主要用于存储二维图像数据,其数据结构主要围绕像素的行列展开。
    • Halcon的点云数据通常包含三维坐标信息(x, y, z),并可能包含其他属性如颜色、强度等,这些数据需要以适当的方式组织在Halcon的数据结构中。
  2. 类型转换复杂性
    • 如果要将OpenCV的RGB图像转换为点云,首先需要将图像中的每个像素的RGB值转换为三维空间中的坐标(这通常不是直接转换,因为RGB仅代表颜色信息,不直接对应空间坐标)。
    • 若确实需要将颜色信息保留为点云属性,则需要在Halcon中创建相应的数据结构来存储这些信息,这涉及到复杂的类型转换和数据处理。
  3. HTuple的灵活性与复杂性
    • HTuple虽然功能强大且灵活,但使用它来处理点云数据(尤其是当点云数据量较大时)可能会增加编程的复杂性。
    • 需要编写额外的代码来遍历OpenCV的Mat数据,并将其转换为HTuple中适合的点云数据结构。

OpenCV与Halcon的各自优点

OpenCV的优点
  1. 开源与免费:OpenCV是开源的,可以免费使用和修改,非常适合学术界、研究机构和个人开发者使用。
  2. 丰富的功能:OpenCV提供了大量的计算机视觉算法和工具,包括图像处理、视频分析、目标检测、跟踪等。
  3. 多平台支持:OpenCV支持多种操作系统和编程语言,如Windows、Linux、macOS,以及C++、Python等。
  4. 社区支持:由于OpenCV的开源性质,其拥有庞大的社区支持,可以方便地获取帮助和教程。
Halcon的优点
  1. 高精度与高效性:Halcon在图像处理算法和技术方面相对更先进和复杂,能够实现更高精度的图像处理任务,并且处理速度相对较快,特别是对于大规模、高精度的图像处理任务。
  2. 工业级应用:Halcon被广泛应用于工业自动化、机器人视觉、医疗、安全监控等领域,具有高度的可靠性和稳定性。
  3. 丰富的工具和库:Halcon提供了丰富的图像处理和分析功能,如形状匹配、OCR、二维码识别等,并支持2D和3D图像处理、形状识别、特征提取、运动跟踪、三维重建等多种功能。
  4. 灵活的编程模式:Halcon支持多种编程语言,包括Halcon语言、C++、C#和Python等,并且可以在不同的操作系统和硬件平台上运行。
  5. 易于使用:Halcon的API相对简单,且提供了丰富的教程和文档,使得用户更容易上手和学习。

    代码如下:测试相机(中科融合

bool FrameData2HTupleMat2(const FrameData& tmp_frameData, const CameraParam& tmp_stCamParam, Mat& pointMat, HTuple& hv_ObjectModel3D)
{
    //可以去除——stata(这段是基于中科测试的)
	const auto point3D = tmp_frameData.point3D;
	const auto pointUV = tmp_frameData.pointUV;
	//int width = tmp_stCamParam.irWidth;
	//int height = tmp_stCamParam.irHeight;
	//int textureWidth = tmp_stCamParam.textureWidth;
	//int textureHeight = tmp_stCamParam.textureHeight;

	if (point3D == nullptr || pointUV == nullptr)
	{
		std::cout << "Input points or pointUV is nullptr." << std::endl;
		return false;
	}
    //可以去除——end
	/*int tmp_nHeight = pointMat.size().height;
	int tmp_nWidth = pointMat.size().width;
	int i = 0;*/
	//创建3通道f类型Mat
	cv::Mat3f tmp_mat3f_m;
	//除以1000将单位从mm转换为m
	cv::divide(pointMat, 1000.0, tmp_mat3f_m);
	//创建单通道数组三个
	cv::Mat1f imgs_array_m[3];
	//分割通道
	cv::split(tmp_mat3f_m, imgs_array_m);
	//获取单通道数组元素个数
	int tmp_num = imgs_array_m[0].total();
	//赋值过去HTuple
	HTuple a1(reinterpret_cast<float*>(imgs_array_m[0].data), tmp_num);
	HTuple a2(reinterpret_cast<float*>(imgs_array_m[1].data), tmp_num);
	HTuple a3(reinterpret_cast<float*>(imgs_array_m[2].data), tmp_num);
	//有一些没办法使用Htuple/1000
	//a1 = a1 / 1000;
	//a2 = a1 / 1000;
	//a3 = a1 / 1000;
	
	//重新合成点云
	GenObjectModel3dFromPoints(a1, a2, a3, &hv_ObjectModel3D);

	a1.Clear();
	a2.Clear();
	a3.Clear();
	return true;
};


http://www.kler.cn/a/293966.html

相关文章:

  • AI时代的研发生产关系,是否有新的可能?
  • vue el-date-picker 日期选择器禁用失效问题
  • mysql 实现分库分表之 --- 基于 MyCAT 的分片策略详解
  • 品融电商:新形势下电商平台如何助力品牌长期经营
  • 【贪心算法】——力扣763. 划分字母区间
  • Snort的配置与使用
  • linux编译出现报错
  • ★ 算法OJ题 ★ 力扣3 - 无重复字符的最长子串
  • 百家云 BRTC:革新华为 HarmonyOS NEXT 系统的实时通信体验
  • ctfshow-php特性(web123-web150plus)
  • 安卓玩机工具-----ADB方式的刷机玩机工具“秋之盒”’ 测试各项功能预览
  • SpinalHDL之数据类型(一)
  • 【LeetCode】11.盛最多水的容器
  • UE4_后期处理_后期处理材质及后期处理体积三—遮挡物体描边显示
  • 网络安全与恶意攻击:如何应对?
  • 2024 年高教社杯全国大学生数学建模竞赛 C 题 农作物的种植策略 完整参考论文
  • Jenkins+Svn+Vue自动化构建部署前端项目(保姆级图文教程)
  • [数据集][目标检测]智慧农业草莓叶子病虫害检测数据集VOC+YOLO格式4040张9类别
  • 仿论坛项目--Kafka,构建TB级异步消息系统
  • IOS 20 发现界面(UITableView)歌单列表(UICollectionView)实现
  • 51单片机-第十二节-LCD1602液晶显示屏
  • MyBatis-Plus 框架 QueryWrapper UpdateWrapper 方法修复sql注入漏洞事件
  • 2024社区版IDEA springboot日志输出颜色
  • Excel数据导入MySQL数据库的完整指南
  • 4.6 Sensors -- useMouse
  • EmguCV学习笔记 C# 10.2 人脸识别 FaceRecgnizer类