探索工具
使用 Jupyter Notebook逐句运行Python代码,并且可以通过matplotlib模块将nv12格式的图像直接在开发机的浏览器上显示。
**如何为RDK X3安装Jupyter Notebook:**https://developer.horizon.cc/forumDetail/188481611833243692
**如何使用matplotlib将nv12的图像显示出来:**https://developer.horizon.cc/forumDetail/188481611833243698
RDK X3的VPS
RDK X3有一个硬件上的视频处理模块VPS,使能指定camera通道的vps(video process)图像处理功能,可以对nv12格式的图像输入图像完成缩放、旋转、裁剪等功能,时间开销都是微秒级的。
具体请参考 RDK X3 用户手册:
**Python接口:**https://developer.horizon.cc/documents_rdk/python_development/pydev_multimedia_api_x3/object_camera
**C/C++接口:**https://developer.horizon.cc/documents_rdk/clang_development/cdev_multimedia_api_x3/vio_api#sp_open_vps
VPS的问题
在使用VPS对一张1080p的图像进行缩小到300*300的操作为,应该输出135000大小的数组,但是输出了144000大小数据。因为300不是32的整数,所以向上取整到320,可以通过后期裁剪来去掉绿色区域。
首先通过Camera获取一张1080p的图像,分辨率为1920 x 1080,格式为nv12,将这张图片转化为BGR8的格式,显示效果如下:
# 声明一个VPS的对象
vps = srcampy.Camera()
ret = vps.open_vps(2, 1, 1920, 1080, 300, 300)
# mipi_data是1920*1080的nv12图片
mipi_img = np.frombuffer(mipi_data, dtype=np.uint8)
print(mipi_img.shape) # 输出(3110400,),其中3110400 = 1920*1080*1.5
# 将1080p的图像送入VPS
ret = vps.set_img(mipi_data)
print(ret) # 输出为0, 表示操作成功
# 从VPS取照片,应该得到300*300的图片,但是得到的是300*320的图片
vps_data = vps.get_img(2, 300, 300)
nv12 = np.frombuffer(vps_data, dtype=np.uint8)
print(nv12.shape) # 输出(144000,),其中144000 = 320*300*1.5
将这张图片转化为BGR8的格式,显示效果如下:
暂时的解决方法
暂时的解决方法是利用numpy的接口对获得的nv12图像进行裁剪,将 300 x 320 的nv12图像裁剪为300 x 300 的nv12图像,大约有 2.4ms 的时间开销。
### 对象 nv12 是从VPS获得的数据流,表达为numpy数组的格式
### 对象 new_nv12 是裁剪后的nv12图像,表达为numpy数组的格式
# 对Y分量进行裁剪
y_channel = nv12[:300*320].reshape(300,320)[:,:-20]
# 对UV分量进行裁剪
uv_channel =nv12[300*320:].reshape(150,320)[:,:-20]
# 合并
new_nv12 = np.concatenate((y_channel.ravel(), uv_channel.ravel()))
print(new_nv12.shape) # 输出(135000,),其中135000 = 300*300*1.5
这里将这张图片转化为BGR8的格式,显示效果如下,可以观察到绿边已经被裁剪,原始图像也没有出现问题,裁剪是成功的: