Jupyter远程开发RDK X3,将RDK X3的mipi摄像头图像imshow到电脑上!

Jupyter Notebook是以网页的形式打开,可以在网页页面中直接编写代码运行代码,代码的运行结果也会直接在代码块下显示的程序。

本文将为您提供利用Jupyter将X3的mipi摄像头画面直接imshow到Windows开发机的浏览器中,在屏幕中直接预览开发板的mipi镜头采集的图像。

本文所使用的ipynb文件已在附件中给出,您也可以下载后直接动手尝试,观察RDK X3中Python代码运行的美妙过程!

以下为附件的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.3

cell 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 mclk

cell 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 µs

cell 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_img

cell 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

mipi_camera.ipynb

你好,我想问问如果是USB摄像头,在代码上和mipi摄像头1有什么区别