5.7. sail.BMImage
BMImage封装了一张图片的全部信息,可利用Bmcv接口将BMImage转换为Tensor进行模型推理。
BMImage也是通过Bmcv接口进行其他图像处理操作的基本数据类型。
5.7.1. __init__
初始化BMImage。
- 接口形式:
- def __init__(self) def __init__(self, handle: sail.Handle, h: int, w: int, format: sail.Format, dtype: sail.ImgDtype) def __init__(self, handle: sail.Handle, buffer: bytes | np.array, h: int, w: int, format: sail.Format, dtype: sail.ImgDtype = DATA_TYPE_EXT_1N_BYTE, strides: list[int] = None, offset: int = 0) 
参数说明:
- handle: sail.Handle 
设定BMImage所在的设备句柄。
- h: int 
图像的高。
- w: int 
图像的宽。
- format : sail.Format 
图像的像素格式。 支持 sail.Format 中的像素格式。
- dtype: sail.ImgDtype 
图像的数据类型。 支持 sail.ImgDtype 中的像素格式。
- buffer: bytes | np.array 
用于创建图像的保存了像素值的buffer
- strides 
用buffer创建图像时图像的步长。单位为byte,默认为空,表示和一行的数据宽度相同。 如果需要指定,注意list中元素个数要与图像plane数一致
- offset 
用buffer创建图像时有效数据相对buffer起始地址的偏移量。单位为byte,默认为0
5.7.2. width
获取图像的宽。
- 接口形式:
- def width(self)->int 
返回值说明:
- width : int 
返回图像的宽。
5.7.3. height
获取图像的高。
- 接口形式:
- def height(self)->int 
返回值说明:
- height : int 
返回图像的高。
5.7.4. format
获取图像的格式。
- 接口形式:
- def format(self) -> sail.Format 
返回值说明:
- format : sail.Format 
返回图像的格式。
5.7.5. dtype
获取图像的数据类型。
- 接口形式:
- def dtype(self)->sail.ImgDtype 
返回值说明:
- dtype: sail.ImgDtype 
返回图像的数据类型。
5.7.6. data
获取BMImage内部的bm_image。
- 接口形式:
- def data(self) -> sail.bm_image 
返回值说明:
- img : sail.bm_image 
返回图像内部的bm_image。
5.7.7. get_device_id
获取BMImage中的设备id号。
- 接口形式:
- def get_device_id(self) -> int 
返回值说明:
- device_id : int 
返回BMImage中的设备id号
5.7.8. get_handle
获取BMImage中的Handle。
- 接口形式:
- def get_handle(self): 
返回值说明:
- Handle : Handle 
返回BMImage中的Handle
5.7.9. asmat
将BMImage中的数据转换成cv2默认的BGR_PACKED像素格式的numpy.ndarray。
- 接口形式:
- def asmat(self) -> numpy.ndarray[numpy.uint8] 
返回值说明:
- image : numpy.ndarray[numpy.uint8] 
返回BMImage中的数据,自动转换成BGR PACKED像素格式。
5.7.10. asnumpy
将BMImage中的图像裸数据转换成numpy.ndarray,并保持像素格式不变。
支持的像素格式为 sail.Format 中列出的格式。
支持的数据类型为DATA_TYPE_EXT_1N_BYTE、DATA_TYPE_EXT_1N_BYTE_SIGNED和DATA_TYPE_EXT_FLOAT32。
不同像素格式返回的ndarray的shape见下表:
| 像素格式 | 输出维度 | 
|---|---|
| FORMAT_BGR_PACKED / FORMAT_BGR_PACKED | (height, width, 3) | 
| FORMAT_ARGB_PACKED / FORMAT_ABGR_PACKED | (height, width, 4) | 
| FORMAT_GRAY | (1, height, width) | 
| FORMAT_BGR_PLANAR / FORMAT_RGB_PLANAR | (3, height, width) | 
| FORMAT_YUV444P | (3, height, width) | 
| 其他 | (numel,) | 
其中,numel表示该BMImage所含像素点的个数。 例如, 对于YUV420P或NV12,numel = height * width * 1.5 ; 对于BGR_PACKED或BGR_PLANAR,numel = height * width * 3 。
- 接口形式:
- def asnumpy(self) -> numpy.ndarray 
返回值说明:
- image : numpy.ndarray 
返回BMImage中的数据。
- 示例代码:
- import sophon.sail as sail import numpy as np if __name__ == '__main__': devid = 0 handle = sail.Handle(devid) height = 1080 width = 1920 dtype = sail.ImgDtype.DATA_TYPE_EXT_1N_BYTE np_dtype = np.uint8 # example for BGR_PLANAR format = sail.Format.FORMAT_BGR_PLANAR numel = int(height * width * 3) rawdata = np.random.randint(0, 255, (numel,), np_dtype) img = sail.BMImage(handle, rawdata, height, width, format, dtype) out_ndarray = img.asnumpy() assert out_ndarray.shape == (3, height, width) # example for YUV420P format = sail.Format.FORMAT_YUV420P numel = int(height * width * 1.5) rawdata = np.random.randint(0, 255, (numel,), np_dtype) img = sail.BMImage(handle, rawdata, height, width, format, dtype) out_ndarray = img.asnumpy() assert out_ndarray.shape == (numel,) 
5.7.11. get_plane_num
获取BMImage中图像plane的数量。
- 接口形式:
- def get_plane_num(self) -> int: 
返回值说明:
- planes_num : int 
返回BMImage中图像plane的数量。
5.7.12. align
将BMImage 64对齐
- 接口形式:
- def align(self) -> int: 
返回值说明:
- ret : int 
返回BMImage是否对齐成功, -1代表BMImage未创建, 0代表成功, 其他代表失败
5.7.13. check_align
获取BMImage中图像是否对齐
- 接口形式:
- def check_align(self) -> bool: 
返回值说明:
- ret : bool 
1代表已对齐, 0代表未对齐, -1代表BMImage未创建
5.7.14. unalign
将BMImage不对齐
- 接口形式:
- def unalign(self) -> int: 
返回值说明:
- ret : int 
返回BMImage是否不对齐成功, -1代表BMImage未创建, 0代表成功, 其他代表失败
5.7.15. check_contiguous_memory
获取BMImage中图像内存是否连续
- 接口形式:
- def check_contiguous_memory(self) -> bool: 
返回值说明:
- ret : bool 
1代表连续,0代表不连续
- 示例代码:
- import sophon.sail as sail if __name__ == '__main__': file_path = '/data/jinyu.lu/jpu_test/1920x1080_yuvj420.jpg' # 请替换为您的文件路径 dev_id = 0 handle = sail.Handle(dev_id) decoder = sail.Decoder(file_path, False, dev_id) BMimg = sail.BMImage() ret = decoder.read(handle, BMimg) # get bm_image bm_image = BMimg.data() # get BMimg width,height,dtype,format,device_id,plane_num,handle print(BMimg.width(), BMimg.height(), BMimg.format(), BMimg.dtype(), BMimg.get_device_id(), BMimg.get_plane_num(), BMimg.get_handle()) # get mat np_data = BMimg.asmat() # align BMimg ret = BMimg.align() if ret: print("align success") else: print("align failed") print(BMimg.check_align()) # unalign BMimg ret = BMimg.unalign() if ret: print("unalign success") else: print("unalign failed") # check contiguous memory print(BMimg.check_contiguous_memory()) # create BMImage with data from buffer buf = bytes([i % 256 for i in range(int(200*100*3))]) img_fromRawdata = sail.BMImage(handle, buf, 200, 100, sail.Format.FORMAT_BGR_PACKED) 
5.7.16. get_pts_dts
获取pts和dts
- 接口形式:
- def get_pts_dts() -> list 
返回值说明:
- result: list 
输出结果。输出具体的pts和dts值。
- 示例代码:
- import sophon.sail as sail if __name__ == '__main__': input_file_path = 'your_rtsp_url' dev_id = 0 handle = sail.Handle(dev_id) decoder = sail.Decoder(input_file_path, True, dev_id) image = sail.BMImage() ret = decoder.read(handle, image) if ret == 0: print("Frame read successfully into bm_image") pts,dts=image.get_pts_dts() print("pts:",pts) print("dts:",dts) else: print("Failed to read frame into bm_image")