waterman 发表于 2025-1-11 17:18

RDK X3测评:2.摄像头使用

# wifi连接
1. 使用sudo nmcli device wifi rescan命令扫描热点
1. 使用sudo nmcli device wifi list命令列出扫描到的热点
2. 使用 sudo wifi_connect "SSID" "PASSWD"命令连接热点


# 系统更新
官方文档中推荐我们安装完系统后,通过apt命令对系统进行更新。
首先打开终端命令行,输入如下命令:
```
sudo apt update
```


其次,升级所有已安装的软件包到最新版本,命令如下:
```
sudo apt full-upgrade
```
执行```apt full-upgrade```命令后,需要手动重启设备使更新生效,命令如下:
```
sudo reboot
```

# 图像处理
RDK X3 提供基于 MIPI Camera 的图像采集功能,并通过 python的libsrcampy 库完成相关操作。以下内容涵盖摄像头初始化、图像获取、编码和显示的详细步骤。
## 初始化配置并使用MIPI Camera
RDK X3 提供了完善的 MIPI Camera 图像采集和处理功能,能够满足不同场景下的图像采集需求。这里我们将介绍 RDK X3 中 MIPI Camera 的初始化配置并实现常规功能。

### Camera对象功能概述
Camera对象主要用于管理和控制MIPI摄像头,提供以下几种常用方法:
- open_cam:打开指定通道的摄像头,并设置帧率与分辨率。
- open_vps:使能图像处理功能,包括缩放、旋转和裁剪。
- get_img:从摄像头获取图像数据。
- set_img:向图像处理模块输入图像数据。
- close_cam:关闭摄像头。
Camera初始化与配置
1. 打开摄像头
open_cam方法用于打开指定通道的摄像头,设置摄像头输出的帧率和分辨率。
```
Camera.open_cam(pipe_id, video_index, fps, width, height, raw_height, raw_width)
```

2. 配置图像处理功能
open_vps方法使能图像处理功能,包括缩放、裁剪和旋转。
```
Camera.open_vps(pipe_id, proc_mode, src_width, src_height, dst_width, dst_height, crop_rect, rotate, src_size, dst_size)
```

3. 获取图像
在完成open_cam和open_vps的配置后,可以通过get_img获取图像。

```
# 等待图像采集
time.sleep(1)

# 获取图像
img = camera.get_img(2)
if img is not None:
    with open("output.img", "wb") as f:
      f.write(img)
    print("图像保存成功")
else:
    print("获取图像失败")
```
4. 关闭摄像头
在使用完摄像头后,调用close_cam关闭。
```
camera.close_cam()
print("摄像头已关闭")
```

### 完整代码示例
以下是一个简单示例,展示如何从初始化到保存img图像:
```python
import sys, os, time

from hobot_vio import libsrcampy

def test_camera():
    cam = libsrcampy.Camera()
    vps = libsrcampy.Camera()

    #open MIPI camera, fps: 30, solution: 1080p
    ret = cam.open_cam(0, -1, 30, 2560, 1440)
    print("Camera open_cam return:%d" % ret)

    ret = vps.open_vps(1, 1, 2560, 1440, 1920, 1080)

    # wait for 1s
    time.sleep(1)
    #get one image from camera   
    img = cam.get_img(2)
   
    ret = vps.set_img(img)
    img = vps.get_img()
   
    if img is not None:
      #save file
      fo = open("output.img", "wb")
      fo.write(img)
      fo.close()
      print("camera save img file success")
    else:
      print("camera save img file failed")
   
    #close MIPI camera
    cam.close_cam()
    print("test_camera done!!!")

test_camera()
```
上述代码中我们使用到了VPS进行图像变换,将其从2560x1440大小缩放为1920x1080大小,注意到,我们需要分别创建vps和cam,并将其绑定到不同的通道上,之后将cam读取到的图像输入到vps中,再将vps的输出保存。除此之外,如果仅仅是简单的缩放,我们可以不需要使用vps,直接指定cam的输出为1920x1080即可,示例代码如下:
```python
import sys, os, time

from hobot_vio import libsrcampy

def test_camera():
    cam = libsrcampy.Camera()

    #open MIPI camera, fps: 30, solution: 1080p
    ret = cam.open_cam(0, -1, 30, 1920, 1080)
    print("Camera open_cam return:%d" % ret)

    # wait for 1s
    time.sleep(1)
    #get one image from camera   
    img = cam.get_img(2)
   
    if img is not None:
      #save file
      fo = open("output.img", "wb")
      fo.write(img)
      fo.close()
      print("camera save img file success")
    else:
      print("camera save img file failed")
   
    #close MIPI camera
    cam.close_cam()
    print("test_camera done!!!")

test_camera()
```
在读取到摄像头采集到的图像数据后,我们得到的是一个如下图的img文件,并不能直接进行查看,需要将其编码为jpeg格式并保存至文件或者输出到显示屏上进行查看,下面我们分别进行图像编码和图像显示的实验。


## 图像编码
Encoder对象实现了对视频数据的编码压缩功能,我们可以方便地将视频数据编码为H264、H265或MJPEG格式。其中包含了encode、encode_file、get_img、close等几种方法,使用方法如下:
### 配置编码模块
```
Encoder.encode(video_chn, encode_type , width, height, bits)
```

使用方法
```
#create encode object
encode = libsrcampy.Encoder()

#enable encode channel 0, solution: 1080p, format: H264
ret = encode.encode(0, 1, 1920, 1080)
```
### 输入图像文件
```
Encoder.encode_file(img)
```
使用方法
```
fin = open("output.img", "rb")
input_img = fin.read()
fin.close()

#input image data to encode
ret = encode.encode_file(input_img)
```
### 获取编码后的数据
```
Encoder.get_img()
```
### 关闭编码通道
```
Encoder.close()
```
### 完整代码示例
```
import sys, os, time

from hobot_vio import libsrcampy

def test_camera():
    encode = libsrcampy.Encoder()
   
    ret = encode.encode(0, 3, 1920, 1080)
   
    fin = open("output.img", "rb")
    input_img = fin.read()
    fin.close()
   
    ret = encode.encode_file(input_img)
   
    fo = open("output.jpeg",'wb')
    img = encode.get_img()
    fo.write(img)
    encode.close()

test_camera()
```
得到的output.jpeg文件如下:

可以看到我们已经正确地编码了图像文件并能够正常显示。此外我们还可以将cam得到的图像数据直接送入encoder中,编码并直接输出jpeg图像,具体代码如下所示:
```
import sys, os, time

from hobot_vio import libsrcampy

def test_camera():
    cam = libsrcampy.Camera()
    encode = libsrcampy.Encoder()

    ret = cam.open_cam(0, -1, 30, 2560, 1440)
    ret = encode.encode(0, 3, 2560, 1440)

    time.sleep(1)

    input_img = cam.get_img(2)
    ret = encode.encode_file(input_img)

    fo = open("output2.jpeg",'wb')
    img = encode.get_img()
    fo.write(img)

    fo.close()
    encode.close()

test_camera()
```
## 图像显示
使用Display对象,我们可以快速地将cam采集到的图像显示到hdmi显示器上。Display对象实现了视频显示功能,可以将图像数据通过HDMI接口输出到显示器,该对象包含display、set_img、set_graph_rect、set_graph_word、close等方法。我们这里主要使用到的是display和bind接口。
### display
显示模块初始化,并配置显示参数
```
Display.display(chn, width, height, vot_intf, vot_out_mode)
```

### bind接口
该接口可以把Camera、Encoder、Decoder、Display模块的输出与输入数据流进行绑定,绑定后无需用户操作,数据可在绑定模块之间自动流转。例如,绑定 Camera 和 Display 后,摄像头数据会自动通过显示模块输出到显示屏上,无需调用额外接口。
```
libsrcampy.bind(src, dst)
```

### 完整代码示例
```
import sys, os, time

from hobot_vio import libsrcampy

def test_camera():
    cam = libsrcampy.Camera()
    disp = libsrcampy.Display()

    ret = cam.open_cam(0, -1, 30, 1920, 1080)
    disp.display(0, 1920, 1080)

    time.sleep(1)

    libsrcampy.bind(cam, disp)
   
    while(1):
      print(1)

test_camera()
```


# 总结
通过本文的学习,可以看到使用 RDK X3 进行图像与视频开发非常高效。其内置的 libsrcampy 库提供了丰富的功能,包括摄像头图像采集、图像编码、视频显示等,且支持 Python 编程语言,降低了开发门槛,非常适合快速上手和项目实践。
下一篇文章中,我将进一步学习并探索 RDK X3 在 神经网络推理 方面的能力!

YUPINLE 发表于 2025-1-14 11:37

本帖最后由 YUPINLE 于 2025-1-14 18:50 编辑

<p>&nbsp;</p>

<p>&nbsp;</p>

waterman 发表于 2025-1-14 21:09

<div style="text-align: center;"></div>

<p>摄像头接线方式如图</p>

dirty 发表于 2025-1-14 21:14

<p>摄像头驱动功能验证了,后面可以做模型部署 目标检测人脸识别这些AI了哈,期待后续</p>

waterman 发表于 2025-1-14 21:30

dirty 发表于 2025-1-14 21:14
摄像头驱动功能验证了,后面可以做模型部署 目标检测人脸识别这些AI了哈,期待后续

<p><img height="50" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan33.gif" width="58" /></p>

SeasonMay 发表于 2025-1-17 15:47

<p>opencv-python的部署效果好不好呢?</p>

eew_Eu6WaC 发表于 2025-1-17 16:27

<p>写的真详细,期待这块板子后续更多功能,比如一些AI相关的应用</p>

waterman 发表于 2025-1-18 13:35

SeasonMay 发表于 2025-1-17 15:47
opencv-python的部署效果好不好呢?

<p>暂时还没来得及测试,但官方文档里给出了基于python的它自己的hobot_cv和opencv的性能对比,里面有提到opencv的性能,可以参考一下<a href="https://developer.d-robotics.cc/rdk_doc/Robot_development/quick_demo/demo_cv#resize" target="_blank">5.2.4 图像处理加速 | RDK DOC</a></p>

waterman 发表于 2025-1-18 13:35

eew_Eu6WaC 发表于 2025-1-17 16:27
写的真详细,期待这块板子后续更多功能,比如一些AI相关的应用

<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/congra.gif" width="48" /></p>
页: [1]
查看完整版本: RDK X3测评:2.摄像头使用