3.1.23 IMAQ GetImagePixelPtr获取图像像素指针
3.1.23 IMAQ GetImagePixelPtr获取图像像素指针 该函数将获取图像中的像素在内存中的指针。同时,该函数也返回图像在内存中的构成信息。IMAQGetImagePixelPtr获取图像像素指针在程序选板中的位置IMAQGetImagePixelPtr获取图像像素指针使用说明、接线端与支持图像类型Function功能:指定函数获取像素指针信息的方法。以下的三个选项可以使用:Map Pixel Pointer (0)获取图像中像素的指针以及获取内存中图像的构成相关信息。
Unmap Pixel Pointer (1)释放之前使用Map Pixel Pointer获取的指针及相关信息。
Get Pixels Infos (2)仅获取内存中的图像的构成相信信息,不映射像素指针。
由于上面的信息可知,三种方法中第一种方法获取指针与图像构成信息,第二种方法释放第一种方法获得的指针与信息,第三种方法则获取信息,不获取像素指针。X Coordinate X坐标: 允许用户选择需要获取图像中哪个像素的X坐标。该参数在Function中的第二种方法Unmap Pixel Pointer中是无效的。默认值为0。Y Coordinate Y坐标:和X坐标一样,这里只是像素的Y坐标。一幅图像是由于X、Y二维关系确定的。所以需要获取某个像素的指针时,是需要同时指定X、Y的坐标。默认值为(0,0)。Pixel Pointer in像素指针输入:该输入端仅在UnmapPixel Pointer模式下有效。当该函数在使用Map Pixel Pointer功能执行获取指针后,一些关于指针的信息会被记录,这些信息在释放映射指针时需要使用。即一般来讲,可以先使用一次该函数,使用Map Pixel Pointer,然后再使用一次该函数使用Unmap PixelPointer,则可以将第一次获取的指针输入到第二次释放功能中的像素指针输入。注意:1、在执行UnmapPixel Pointer功能时,需要指定该指针来取回信息。2、在332位的操作系统中,该输入端使用32位的值可以安全通过。Image Border Size图像边界大小:是图像的边界大小。如3、5、7之类的。Pixel Pointerout像素指针输出:是图像中像素的指针输出值。该值仅在Map Pixel Pointer功能中可以返回。LineWidth(Pixels)线宽(像素):返回图像水平行所有的像素数量。该值为图像的X分辨率、图像边界、图像的左对齐和右对齐之和,如下图所示。该值不一定和图像的水平值一样。图像构成图像构成中,水平方向会多一部分左、右对齐区域。而垂直方向则不用对齐区域,仅仅只有图像本身大小与边界大小。Pixel Size(Bytes)像素大小(字节):返回图像中的每个像素的字节大小(位深)。该值乘以线宽将得到图像一行在内存中所占的字节数量。Transfer MaxSize传输最大大小:返回从指针到图像结束的字节大小。这个大小表示了最大字节大小可以被传输。例如,一个8位的图像,大小为256*256,边界为1,线宽为288,则其从像素(0,0)开始最大传输大小为73728字节(288*256)。图像为32字节对齐。下面来看一下该函数的使用方法:**** Hidden Message *****IMAQ GetImagePixelPtr获取图像像素指针函数的应用程序框图IMAQ GetImagePixelPtr获取图像像素指针函数应用效果-彩色图像IMAQ GetImagePixelPtr获取图像像素指针函数应用效果-灰度图像 从上面的图像效果中可以看到,同样都是130万像素的图像,灰度图像的Pixel Size(Bytes)为1字节8位,线宽为1344,每行占用1344*1字节内容,有964行,则共占用Transfer Max Size为1295616(1344*964),而彩色图像的像素大小则4字节,最大传输大小则为5059072(1312*4*964)。可以看到,彩色图像在传输时占用的内存会是同样的灰度图像的4倍左右(与图像对齐有关),这是因为彩色图像通常是由RGB+Alpha透明通道组成的32位图像,而灰度图像则是8位的图像,所以其占用的内存会大一些。使用Unmap Pixel Pointer方法得到的效果使用Get Pixels Infos方法得到的效果从上面的两个图像中可以看到,如果没有使用Max Pixel Pointer映射像素指针功能,则不会返回像素的指针值,即Pixel Pointer out输出的是0值。映射像素指针-不同时间得到的像素指针不同因为LabVIEW中分配内存只是指定了一个内存名称,并不会具体指定内存地址,所以映射返回的像素指针在不同的时间是会有所不同的,如图上所示,就和前面的像素指针地址不同。(0,0)点的像素指针(1,0)点的像素指针(2,0)点的像素指针(1291,0)点的像素指针(0,1)点像素指针(1,1)点像素指针从上面的图像中可以看到,当前的内存区域中,(0,0)点对应的地址是9A91000(十进制为162074624,(1,0)点对应的是9A91001(162074625),(2,0)对应的是9A91002(162074626),(1291,0)对应的则是9A9150B(162075915),162075915-162074624+1=1292,即占用了1292个像素,即为图像中的一行。而当换到第二行时,(0,1)占用的内存地址为9A91540(162075968),(0,2)为9A91541(162075969)。第二行与第一行之间,并不是直接相连的,而是隔了一段地址(对齐与边缘)。从输出的数据中可以看到, LineWidth(pixels)行宽为1344,其实际尺寸只有1292,即边界与对齐共有52个像素(左边两边平均26个字节)。也就是在1291像素点的基础上,先补第一行的右边的26字节的边界与对齐,再补第二行的左边26字节的对齐与边界。即第一行需要占用到162075915+26=162075941的地址上,然后转移到下一行,加26字节的对齐与边界162075967,然后(0,1)对应的162075968。该函数在实际应用中,很少用到,大家了解一下即可。即使NI官方有提供一下例子,还使用到了C代码的DLL,目前为止未发现什么大作用。示例:LabVIEW2014SP1版:**** Hidden Message *****
石鑫华视觉网http://shixinhua.com,工业相机、工业镜头、机器视觉光源、光源控制器、图像处理、系统集成服务商 石鑫华视觉网http://shixinhua.com,工业相机、工业镜头、机器视觉光源、光源控制器、图像处理、系统集成服务商 谢谢大神分享 谢谢谢谢。。 sssssssssss 学习学习感谢楼主 谢谢分享,正在学习内存读图 学习学习,谢谢分享!
学习学习,谢谢分享! 好好向楼主学习 好好向楼主学习,好好学习