Halcon 10.0:Hobject图像转CBitmap

 1 void HImage2CBitmap(Hobject pImage,CBitmap *wImage)
 2 {
 3     char lpcsType[MAX_STRING];
 4     Hlong lPointer,width,height,channels;
 5     Hlong lPointerR,lPointerG,lPointerB;
 6     count_channels(pImage,&channels);
 7     //获取Halcon数据的Long指针
 8     if (channels == 3)
 9     {
10         get_image_pointer3(pImage,&lPointerR,&lPointerG,&lPointerB,lpcsType,&width,&height);
11     }else
12     {
13         get_image_pointer1(pImage,&lPointer,lpcsType,&width,&height);
14     }
15
16
17     //创建文件头
18     BYTE tmp[sizeof(BITMAPINFO)+1024];
19     BITMAPINFO *bmi = (BITMAPINFO*)tmp;
20     HBITMAP hBmp;
21
22     memset(bmi,0,sizeof(BITMAPINFO));
23     bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
24     bmi->bmiHeader.biWidth = width;
25     bmi->bmiHeader.biHeight = -height; //正负可以上下翻转图像
26     bmi->bmiHeader.biPlanes = 1;
27     bmi->bmiHeader.biBitCount = 8*channels;
28     bmi->bmiHeader.biCompression = BI_RGB;
29     bmi->bmiHeader.biSizeImage = 0;        //if biCompression is BI_RGB,this can be 0
30     bmi->bmiHeader.biClrImportant =0 ;
31     //初始化数据
32     switch(8*channels)
33     {
34     case 8 :
35         for(int i=0 ; i < 256 ; i++){
36             bmi->bmiColors[i].rgbBlue = i;
37             bmi->bmiColors[i].rgbGreen= i;
38             bmi->bmiColors[i].rgbRed= i;
39         }
40         break;
41     case 32:
42     case 24:
43         ((DWORD*) bmi->bmiColors)[0] = 0x00FF0000;
44         ((DWORD*) bmi->bmiColors)[1] = 0x0000FF00;
45         ((DWORD*) bmi->bmiColors)[2] = 0x000000FF;
46         break;
47     }
48     hBmp = ::CreateDIBSection(NULL,bmi,DIB_RGB_COLORS,NULL,0,0);
49
50     //Halcon转换成BYTE数据
51     BYTE *pData = new BYTE[width*height*channels];
52     long byteStep = 0;
53     if (channels == 3)
54     {
55         byteStep = 3*width;
56         BYTE *pHimageR = (BYTE*)lPointerR;
57         BYTE *pHimageG = (BYTE*)lPointerG;
58         BYTE *pHimageB = (BYTE*)lPointerB;
59         for (int i=0; i<height; ++i)
60         {
61             for (int j=0; j<width; ++j)
62             {
63                 *(pData + i*byteStep + 3*j + 0) = *pHimageB;
64                 *(pData + i*byteStep + 3*j + 1) = *pHimageG;
65                 *(pData + i*byteStep + 3*j + 2) = *pHimageR;
66                 pHimageR++;
67                 pHimageG++;
68                 pHimageB++;
69             }
70         }
71     }else
72     {
73         byteStep = width;
74         BYTE *pHimage = (BYTE*)lPointer;
75         for (int i=0; i<height; ++i)
76         {
77             for (int j=0; j<width; ++j)
78             {
79                 *(pData + i*byteStep + j) = *pHimage;
80                 pHimage++;
81             }
82         }
83     }
84
85     //BYTE数据拷贝
86     SetDIBits(NULL,hBmp,0,height,pData,bmi,DIB_RGB_COLORS);
87
88     //CBitmap关联HBITMAP
89     wImage->Attach(hBmp);
90
91     delete [] pData;
92
93     return;
94 }

对于灰度图像和彩色图像基本能使用,只测试过宽为4的倍数的图像。另外速度和效率可能不够用,500W的彩色图像(约14M)时间估计在1s左右。
有能力的可以自行优化下或留言交流下想法。

时间: 2024-10-19 13:44:45

Halcon 10.0:Hobject图像转CBitmap的相关文章

Halcon 10.0 Sample:完整性检查(圆形)

1 * ball.hdev: Inspection of Ball Bonding 2 * 球接合检查 Comment Time:2014/9/10 3 *核心思想:1.白色区域用作自动ROI,黑色区域是目标 4 * 2.Opening_circle:圆形开算子是关键 5 *关闭窗口刷新,关闭窗口,打开窗口[728,512] 6 dev_update_window ('off') 7 dev_close_window () 8 dev_open_window (0, 0, 728, 512, '

Halcon 10.0:Sample 分割边缘拟合圆Circles.hdev

处理流程:快速二值化(区域)->获取区域边缘->截取边缘->膨胀边缘区域(定位)->定位区域进行边缘检测->边缘分割:线和圆->选择属性为圆的弧->拟合圆 *读取图像 read_image (Image, 'double_circle') dev_close_window () get_image_size (Image, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHan

如何在Visual Studio 10.0中设置Halcon机器视觉

开始做Halcon的上位机,选用Visual Studio 10.0平台. 具体设置以C#,VB为例子,如下: C# 第一步: 01.新建项目 02.选择Visual C# 03.修改文件名 04.确认 第二步: 01.选择"解决方案资源管理器" 02.选择"引用",右键 03.选择"添加引用" 第三步: 01.在添加引用选项卡选择浏览 02.选择路径:X:\Program Files\MVTec\HALCON-10.0\bin\dotnet20

Visual Studio 10.0设置引用HalconDotNet.dll

开始做Halcon的上位机,选用Visual Studio 10.0平台. 具体设置以C#,VB为例子,如下: C# 第一步: 01.新建项目 02.选择Visual C# 03.修改文件名 04.确认 第二步: 01.选择"解决方案资源管理器" 02.选择"引用",右键 03.选择"添加引用" 第三步: 01.在添加引用选项卡选择浏览 02.选择路径:X:\Program Files\MVTec\HALCON-10.0\bin\dotnet20

安装python 第三方库遇到的安装问题 microsoft visual studio c++ 10.0 is required,Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?

问题一: microsoft visual studio c++ 10.0 is required 安装scrapy时候出现需要vc c++ 10,有时安装其他也会有. 解决方法:安装vc 2010,安装过2017无效,安装过程也不一样. 问题二: 安装好,出现Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed? 解决办法: 1.pip install wheel 2. 到http://

Microsoft Visual Studio 10.0执行WinPcap获取网络设配器的代码

WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库. 大多数网络应用程序通过被广泛使用的操作系统元件来访问网络,比如sockets.  这是一种简单的实现方式,因为操作系统已经妥善处理了底层具体实现细节(比如协议处理,封装数据包等等),并且提供了一个与读写文件类似的,令人熟悉的接口. 然而,有些时候,这种"简单的方式"并不能满足任务的需求,因为有些应用程序需要直接访问网络中的数据包.也就是说,那些应用程序需要访问原始数据包,即没有被操作系统利用网络协议处理过

TimePickerDialog时间选择器,选择0-9分钟时,显示为10:0 9:1的样式,要改成 10:00 09:01的样式 的解决方式

1 /** 2 * 设置时间选择器 3 */ 4 private void setTimePickerDialog() { 5 Calendar mCalendar = Calendar.getInstance(); 6 mCalendar.setTimeInMillis(System.currentTimeMillis()); 7 final int hour = mCalendar.get(Calendar.HOUR_OF_DAY); 8 int minute = mCalendar.get

What&#39;s is new in MariaDB 10.0(MySQL创始人Monty演讲)

视频地址(请使用翻墙软件观看): http://www.youtube.com/watch?v=4Th7JeRxPlo&feature=youtu.be PDF在附件里. What's is new in MariaDB 10.0(MySQL创始人Monty演讲),布布扣,bubuko.com What's is new in MariaDB 10.0(MySQL创始人Monty演讲)

MariaDB 10.0.X中,动态列支持 JSON 格式来获取数据。

MariaDB 10.0.X中,动态列(Dynamic Columns),可以支持 JSON 格式来获取数据. 为了兼容传统SQL语法,MariaDB 10和MySQL5.7支持原生JSON格式,即关系型数据库和文档型NoSQL数据库集于一身. 使用说明: ###表结构 create table assets (   item_name varchar(32) primary key, -- A common attribute for all items   dynamic_cols  blo