Jupyter Notebook是以网页的形式打开,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直接在代码块下显示的程序。
本文将为您提供利用Jupyter将X3的mipi摄像头画面直接imshow到Windows开发机的浏览器中,在屏幕中直接预览开发板的mipi镜头采集的图像。
本文所使用的ipynb文件已在附件中给出,您也可以下载后直接动手尝试,观察RDK X3中Python代码运行的美妙过程!
- 关于Jupyter如何安装和使用:Jupyter远程开发RDK X3,Jupyter安装与端口映射
- 关于mipi摄像头的共轭教程:Jupyter远程开发RDK X3,将RDK X3的USB摄像头图像imshow到电脑上!
- 关于使用Jupyter观察官方YOLO v5s 运行代码:Jupyter远程开发RDK X3,逐句运行官方YOLO v5s 2.0的推理!
以下为附件的ipynb文件在Jupyter中的运行效果,注意:
- 所有的运行结果,无论是文本还是图像,均是在开发机Windows电脑的浏览器中显示,X3无需外接任何USB键鼠或显示器,只需开发机能够正常ssh登陆即可。
- 所有的Python代码块均是使用RDK X3系统中的Python解释器,调用的均为RDK X3上的硬件资源或文件,能够正常使用地平线的多媒体Python接口和模型推理Python接口。
cell 1
# 导入cv2 和 matplotlib
import cv2
import numpy as np
print(cv2.__version__)
print(np.__version__) 4.7.0
1.24.3cell 2
# 导入地平线的多媒体库
from hobot_vio import libsrcampy as srcampy # jupyter显示图像的函数,能显示cv2的彩色图和灰度图,这个在上节有出现过
# 缺省值为图像大小
from matplotlib import pyplot as plt
%matplotlib inline
def cv2_img2plt_img(cv2_img):
if cv2_img.ndim==3: # 彩图
return cv2_img[:,:,::-1]
else: # 灰度图
return cv2_img
def jshow(cv2_img, size=4):
plt.figure(figsize=(size, size))
plt.imshow(cv2_img2plt_img(cv2_img), plt.cm.gray)
plt.show()cell 3
# 新建一个mipi相机对象
cap_mipi = srcampy.Camera()
# 设置X3派相机参数
height, width = 1440, 2560
ret = cap_mipi.open_cam(0, -1, 30, width, height)
2023/10/17 11:21:47.251 !INFO [x3_cam_init_param][0099]Enable mipi host0 mclk
2023/10/17 11:21:47.252 !INFO [x3_cam_init_param][0099]Enable mipi host1 mclkcell 4
# 由于不是正常在循环中使用摄像头,故需要跳过一些缓冲区中的帧
for i in range(15):
cap_mipi.get_img(2, width, height)
# 获取相机的数据流
mipi_data = cap_mipi.get_img(2, width, height)cell 5
# 我们一起来看看从摄像头获取的数据流是什么
print(type(mipi_data)) <class 'bytes'>cell 6
%%time
# 看起来是一些bytes,我们一起来转化成numpy数组
mipi_img = np.frombuffer(mipi_data, dtype=np.uint8)
print(mipi_img.shape) (5529600,)
CPU times: user 609 µs, sys: 131 µs, total: 740 µs
Wall time: 635 µscell 7
# 按照/app/pydev_demo/03_mipi_camera_sample/mipi_camera.py 的demo
# 这是nv12格式的图片,可以直接送入bpu推理了,可以看到这个处理非常迅速
# 此处将此nv12格式的图片转成cv2的的RGB格式图片,存储在numpy数组中,并进行可视化看看
# mipi的nv12格式图片 转 cv2的rgb格式图片
def mipi_img2cv2_img(mipi_img, height, width):
# 按照nv12的格式进行排布
mipi_img = mipi_img.reshape(int(1.5*height), width)
# 利用cv2的函数进行格式转换
cv2_img = cv2.cvtColor(mipi_img, cv2.COLOR_YUV420SP2BGR)
return cv2_imgcell 8
# 我们看看从mipi摄像头获得的图像
cv2_img = mipi_img2cv2_img(mipi_img, height, width)
print(cv2_img.shape)
jshow(cv2_img) (1440, 2560, 3)
cell 9
# 这就是从mipi摄像头获得的图像了,可以转为为rgb格式,
# 并使用cv2的imwrite方法存储到本地的png格式
# 这里转换了一下BGR和RGB,具体的原因也不清楚,这样保证jupyter的显示和保存颜色都是正常的
ret = cv2.imwrite("./mipi_camera_picture.png", cv2.cvtColor(cv2_img, cv2.COLOR_BGR2RGB))
print(ret)
True在Jupyter的工作目录下,就可以看到这张由mipi摄像头采集,并保存为png格式的图片了:

cell 10
# 用完记得关闭摄像头,回收资源
cap_mipi.close_cam()参考:
[1] https://developer.horizon.cc/documents_rdk/python_development/pydev_multimedia_api_x3/object_camera
[2] https://developer.horizon.cc/forumDetail/174216054053201037