Halcon Image与OpenCV IplImage图像数据相互转换

2024-05-31 05:18

本文主要是介绍Halcon Image与OpenCV IplImage图像数据相互转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  这里贴出我用的两个函数,用于IplImage 与 Hobject 之间的相互转换,他们的数据类型分别是IPL_DEPTH_8U和'byte' 

  在Halcon中,图像数据是一个通道(channel)一个通道保持的,而在OpenCV中多个通道的数据分别在各个像素中。 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
Hobject IplImageToHImage(IplImage *pImage)
{  
     Hobject Hobj;
     if  (3 == pImage->nChannels)
     {
         IplImage *pImageRed,*pImageGreen,*pImageBlue;
         pImageRed = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);
         pImageGreen = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);
         pImageBlue = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_8U,1);
         cvSplit(pImage,pImageBlue,pImageGreen,pImageRed,NULL);
         uchar *dataRed =  new  uchar[pImage->width*pImage->height];
         uchar *dataGreen =  new  uchar[pImage->width*pImage->height];;
         uchar *dataBlue =  new  uchar[pImage->width*pImage->height];;
             
         int  height = pImage->height;
         int  width =pImage->width;
         for ( int  i = 0; i<height; i++)
         {
             memcpy (dataRed + width*i,pImageRed->imageData + pImageRed->widthStep*i, width);
             memcpy (dataGreen + width*i,pImageGreen->imageData + pImageGreen->widthStep*i, width);
             memcpy (dataBlue + width*i,pImageBlue->imageData + pImageBlue->widthStep*i, width);
         }
         gen_image3(&Hobj, "byte" ,pImage->width,pImage->height,(Hlong)(dataRed),(Hlong)(dataGreen),(Hlong)(dataBlue));
         cvReleaseImage(&pImageRed);
         cvReleaseImage(&pImageGreen);
         cvReleaseImage(&pImageBlue);
         delete [] dataRed;
         delete [] dataGreen;
         delete [] dataBlue;
     }
     if  (1 == pImage->nChannels)
     {
         int  height = pImage->height;
         int  width =pImage->width;
         uchar *dataGray =  new  uchar[width*height];
             
         for ( int  i = 0; i<height; i++)
         {
             memcpy (dataGray + width*i,pImage->imageData + pImage->widthStep*i, width);
         }
         gen_image1(&Hobj, "byte" ,pImage->width,pImage->height,(Hlong)(dataGray));
         delete [] dataGray;
     }   
     return  Hobj;
}
IplImage* HImageToIplImage(Hobject &Hobj)
{
     IplImage *pImage;
     HTuple htChannels;
     char  cType[MAX_STRING];
     Hlong     width,height;
     width = height =0;  
     //转换图像格式
     convert_image_type(Hobj,&Hobj, "byte" );
     count_channels(Hobj,&htChannels);
     if  (htChannels[0].I() == 1)  
     {
         unsigned  char  *ptr;
         get_image_pointer1(Hobj,(Hlong *)&ptr,cType,&width,&height);
         pImage = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
         for ( int  i = 0; i<height; i++)
         {
             memcpy (pImage->imageData+ pImage->widthStep*i, ptr + width*i, width);
         }
     }
     if  (htChannels[0].I() == 3)  
     {
     
         unsigned  char  *ptrRed,*ptrGreen,*ptrBlue;
         ptrRed = ptrGreen =ptrBlue = NULL;
     
         get_image_pointer3(Hobj,(Hlong *)&ptrRed,(Hlong *)&ptrGreen,(Hlong *)&ptrBlue,cType,&width,&height);
     
         IplImage *pImageRed,*pImageGreen,*pImageBlue;
         pImage = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3);
         pImageRed = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
         pImageGreen = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
         pImageBlue = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
         for ( int  i = 0; i<height; i++)
         {
             memcpy (pImageRed->imageData+ pImageRed->widthStep*i, ptrRed + width*i, width);
             memcpy (pImageGreen->imageData+ pImageGreen->widthStep*i, ptrGreen + width*i, width);
             memcpy (pImageBlue->imageData+ pImageBlue->widthStep*i, ptrBlue + width*i, width);
         }
         cvMerge(pImageBlue,pImageGreen,pImageRed,NULL,pImage);
         cvReleaseImage(&pImageRed);
         cvReleaseImage(&pImageGreen);
         cvReleaseImage(&pImageBlue);
     }  
     return  pImage;
}

这篇关于Halcon Image与OpenCV IplImage图像数据相互转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1017437

相关文章

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文