在使用 HALCON 进行图像处理时,我们通常使用其自带的图像处理算子来操作图像。但是在某些情况下,我们希望直接访问图像数据进行高效处理,这时候 get_image_pointer1
和 get_image_pointer3
这两个算子就能派上用场。它们的作用是 获取图像数据的指针,让我们可以直接读取或修改像素值。
1. get_image_pointer1
——获取单通道图像指针
get_image_pointer1
用于 单通道图像(例如灰度图、深度图、二值图像),它返回该图像的 指针、类型、宽度和高度。
1.1 语法
get_image_pointer1(Image : Pointer, Type, Width, Height)
Image
:输入的单通道图像。Pointer
:返回的指针(可以通过它访问图像数据)。Type
:图像的类型,例如'byte'
(灰度图)。Width
和Height
:图像的宽度和高度。
1.2 使用示例
以下是 C 语言的使用示例:
Hobject Image;
char Type[20];
Hlong Pointer, Width, Height;
read_image(&Image, "example.jpg"); // 读取图像
get_image_pointer1(Image, &Pointer, Type, &Width, &Height); // 获取指针
printf("图像类型: %s\n", Type);
printf("指针地址: %ld\n", Pointer);
printf("图像宽高: %ld x %ld\n", Width, Height);
在这里,Pointer
指向图像的第一个像素,我们可以用它来遍历或修改像素值。
1.3 使用注意事项
1. 指针的生命周期
Pointer
只有在Image
仍然存在时才有效,如果Image
被释放或覆盖,指针会变成无效,使用它会导致 程序崩溃。
2. 共享数据的影响
- 如果多个 HALCON 变量共享同一张图像,修改指针指向的数据会影响所有变量。
示例:
这里reduce_domain(Image, ROI, ReducedImage) get_image_pointer1(Image, Pointer, Type, Width, Height)
Image
和ReducedImage
共享同一片数据,修改Pointer
的内容时,ReducedImage
也会跟着变。
解决方案
- 如果要修改数据,最好创建新的图像:
gen_image1(NewImage, 'byte', Width, Height, Pointer)
2. get_image_pointer3
——获取彩色图像(RGB)指针
get_image_pointer3
适用于 彩色图像(RGB),它会返回 红、绿、蓝三个通道的指针,让你可以分别访问每个通道的像素值。
2.1 语法
get_image_pointer3(ImageRGB : PointerRed, PointerGreen, PointerBlue, Type, Width, Height)
ImageRGB
:输入的彩色图像。PointerRed
、PointerGreen
、PointerBlue
:分别返回 R、G、B 三个通道的指针。Type
:图像的类型(如'byte'
,表示 0~255)。Width
和Height
:图像的宽度和高度。
2.2 使用注意事项
1. 只能用于单张图像
get_image_pointer3
一次只能获取一张彩色图像的指针,如果有多张图像需要处理,必须分别调用该算子。
2. 三个通道是独立的
PointerRed
、PointerGreen
和PointerBlue
分别指向 R、G、B 三个通道的数据,修改某一个不会影响其他两个通道。
3. 修改数据的影响
- 如果
ImageRGB
被多个 HALCON 变量引用,修改指针指向的数据,会导致 所有变量的图像数据都被改变。
解决方案
- 如果你要修改数据,建议复制一份新图像:
gen_image3(NewImage, 'byte', Width, Height, PointerRed, PointerGreen, PointerBlue)
3. get_image_pointer1
vs get_image_pointer3
get_image_pointer1 |
get_image_pointer3 |
|
---|---|---|
适用图像 | 灰度图(单通道) | 彩色图(RGB) |
返回数据 | 1 个指针 | 3 个指针(R、G、B) |
存储方式 | 一块连续的内存 | 三块独立的内存 |
修改数据影响 | 影响所有共享该图像的变量 | 修改 R/G/B 影响该通道的所有变量 |
适合的场景 | 深度图、灰度摄像头、二值图像 | 彩色图像、摄像头视频流 |
4. 什么时候该用哪个?
如果处理的是灰度图(单通道) → 用 get_image_pointer1
如果处理的是彩色图(RGB) → 用 get_image_pointer3
如果需要修改数据,建议先创建新图像,避免影响原图像。