基于旭日派的Ros系统小车的再开发——使用python脚本调用MIPI相机(学习笔记)

这篇具有很好参考价值的文章主要介绍了基于旭日派的Ros系统小车的再开发——使用python脚本调用MIPI相机(学习笔记)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、python脚本代码

1. 导入库

import cv2
import time
import ipywidgets.widgets as widgets
from IPython.display import display
from SunriseRobotLib import Mipi_Camera

    这里我们导入了cv2timeipywidgetsMipi_Camera这几个库。其中,cv2是用于图像处理和计算机视觉的库;time是用于计时和休眠的库;ipywidgets是用于创建交互式窗口小部件的库;Mipi_Camera则是用于控制和采集MIPI接口相机图像的库。当然除此之外,我们在代码中还添加使用了display函数用于显示输出结果。

2. MIPI相机驱动信息调用

help(Mipi_Camera)

  help(Mipi_Camera) 是 Python 中的一个内置函数,用于获取对象的帮助信息。你可以在交互式环境中调用它来查看相关库或对象的文档。这个函数会显示对象的帮助文档,包括类的方法、属性和其它相关信息。

    而对于 Mipi_Camera 这个对象,它是 SunriseRobotLib 库中的一个类,用于控制和采集 MIPI 接口相机的图像。你可以通过调用 help(Mipi_Camera) 查看详细的帮助文档,以了解该类的方法、属性和参数的用法。

3. MIPI格式设置

width = 320
height = 240
g_camera = Mipi_Camera(width, height, debug=True)
if g_camera.isOpened():
    print("Open Camera OK!")
else:
    print("Fail To Open Camera!")

    这段代码使用了之前导入的 Mipi_Camera 类,首先设置了变量 width 和 height 的值分别为 320 和 240,分别表示采集图像的宽度和高度,具体数值可以根据实际应用情况进行修改。接着使用 Mipi_Camera() 这个类的构造函数创建了一个 g_camera 对象,并传入了 widthheight 和 debug=True 三个参数,用于初始化相机的配置。

    其中 debug=True 表示相机的调试模式开启,可以在开启调试后查看更详细的调试信息。在实际使用相机的过程中,这个参数可以根据实际需要来决定是否开启。创建完 g_camera 对象后,就可以使用该对象来控制和采集 MIPI 接口相机的图像了。

    g_camera.isOpened() 是 Mipi_Camera 对象的一个方法,用于检查相机是否打开成功。因为在实际使用相机的过程中,如果无法成功打开相机,后续的图像采集和处理都将无法进行,因此需要在程序中对相机打开是否成功进行检查。

    如果 g_camera.isOpened() 返回 True,则表示相机打开成功;反之,则表示打开相机失败。因此,这段代码判断相机是否成功打开,并输出相应的提示信息。如果成功打开,则会输出 “Open Camera OK!”,否则输出 “Fail To Open Camera!”。

4. 获取图像数据命名

def bgr8_to_jpeg(value, quality=75):
    return bytes(cv2.imencode('.jpg', value)[1])

image_widget = widgets.Image(format='jpeg', width=320, height=240)

    这里定义了一个名为 bgr8_to_jpeg 的函数,用于将 BGR 格式的图像转换为 JPEG 格式,并返回字节形式的 JPEG 图像数据。函数中使用了 cv2.imencode('.jpg', value) 函数将图像编码为 JPEG 格式,然后通过索引 [1] 取得编码后的图像数据。

    最后使用 bytes() 函数将图像数据转换为字节形式返回。接着代码创建了一个名为 image_widget 的图像小部件对象,使用 widgets.Image 类来实例化。通过设置参数 format='jpeg',指定图像格式为 JPEG。同时,通过设置 width=320 和 height=240 来指定图像小部件的宽度和高度。

5. MIPI相机调用

try:
    m_fps = 0
    t_start = time.time()
    saved_count = 1  
    while g_camera.isOpened():
        ret, frame = g_camera.read()
        if not ret:
            print("Camera Read Fail!")
            break

        m_fps = m_fps + 1
        fps = m_fps / (time.time() - t_start)
        if (time.time() - t_start) >= 2:
            m_fps = fps
            t_start = time.time() - 1

        text = "FPS: " + str(int(fps))
        cv2.putText(frame, text, (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 255), 1)
        image_widget.value = bgr8_to_jpeg(frame)

        k = cv2.waitKey(1)
        if k == ord('s'):
            timestamp = time.strftime("%Y%m%d_%H%M%S", time.localtime())
            filename = f"{saved_count:04d}_{timestamp}.jpg"
            cv2.imwrite(filename, frame)
            print(f"Saved {filename} successfully!")
            saved_count += 1

        cv2.imshow('Frame', frame)

        if cv2.waitKey(1) & 0xFF == ord(' '):
            break

    首先我们创建了一个 while 循环,用于持续采集摄像头图像并进行相应的处理。在循环中,首先使用 g_camera.read() 方法读取摄像头的图像,返回一个 boolean 类型的变量 ret 和一个代表当前帧图像数据的多维数组 frame。如果 ret 的值为 False,则表示读取图像失败,此时程序会输出提示信息 “Camera Read Fail!” 并跳出循环。

    然后,代码通过计算帧率并在图像上绘制帧率信息,并将处理后的图像更新到之前创建的 image_widget 小部件上。同时,程序通过调用 cv2.imshow() 函数显示图像窗口。

    在循环中,当我们按下 s 键时,程序获取当前时间,将该时间作为图像保存时的时间戳,并生成指定格式的文件名。然后使用 cv2.imwrite() 函数将当前帧的图像保存在本地文件夹中。最后,在控制台输出已保存文件的信息,更新已保存文件数量。

    在最后我们让程序通过调用 cv2.waitKey() 等待键盘输入,并判断是否按下空格键,若按下空格,则跳出循环,停止采集并关闭摄像头并且退出程序。

6. 异常处理

except Exception as e:
    print("Exception: ", e)
except KeyboardInterrupt:
    print("KeyboardInterrupt")
    pass
except:
    print("Unknown error!")
finally:
    # 关闭窗口
    cv2.destroyAllWindows()
    # 在程序结束前,释放摄像头资源
    g_camera.release()

    我们使用 except Exception as e 捕获所有异常,并将异常对象保存在变量 e 中。然后,程序会输出异常信息 "Exception: " 和具体的异常内容。

    同时使用 except KeyboardInterrupt 捕获键盘中断异常,即用户按下Ctrl+C键。当出现这种情况时,程序会输出 “KeyboardInterrupt” 消息,并继续执行下面的代码。在捕获该异常后,使用 pass 语句来保持代码的完整性。

    代码使用 except 来捕获所有其他未知的异常。当发生未知异常时,程序会输出 “Unknown error!” 消息。

    在 finally 语句块中,关闭图像窗口并释放摄像头资源。通过调用 cv2.destroyAllWindows() 关闭所有打开的窗口,并调用 g_camera.release() 释放摄像头资源。在程序运行结束时,无论是否出现异常,都会执行 finally 语句块中的代码来确保关闭窗口和释放摄像头资源。

7. 完整代码

import cv2
import time
import ipywidgets.widgets as widgets
from IPython.display import display
from SunriseRobotLib import Mipi_Camera

help(Mipi_Camera)

width = 320
height = 240
g_camera = Mipi_Camera(width, height, debug=True)

if g_camera.isOpened():
    print("Open Camera OK!")
else:
    print("Fail To Open Camera!")

def bgr8_to_jpeg(value, quality=75):
    return bytes(cv2.imencode('.jpg', value)[1])

image_widget = widgets.Image(format='jpeg', width=320, height=240)

#display(image_widget)

try:
    m_fps = 0
    t_start = time.time()
    saved_count = 1  # 统计已经保存的文件数量
    while g_camera.isOpened():
        ret, frame = g_camera.read()
        if not ret:
            print("Camera Read Fail!")
            break

        m_fps = m_fps + 1
        fps = m_fps / (time.time() - t_start)
        if (time.time() - t_start) >= 2:
            m_fps = fps
            t_start = time.time() - 1

        text = "FPS: " + str(int(fps))
        cv2.putText(frame, text, (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 255), 1)
        image_widget.value = bgr8_to_jpeg(frame)

        # 检测是否按下 s 键
        k = cv2.waitKey(1)
        if k == ord('s'):
            # 获取当前的日期时间戳
            timestamp = time.strftime("%Y%m%d_%H%M%S", time.localtime())
            # 生成指定格式的文件名
            filename = f"{saved_count:04d}_{timestamp}.jpg"
            # 保存图像至本地文件夹
            cv2.imwrite(filename, frame)
            # 提示用户已经成功保存当前图像,并更新已保存的文件数量
            print(f"Saved {filename} successfully!")
            saved_count += 1

        cv2.imshow('Frame', frame)

        # 等待键盘输入并判断是否关闭窗口
        if cv2.waitKey(1) & 0xFF == ord(' '):
            break

except Exception as e:
    print("Exception: ", e)
except KeyboardInterrupt:
    print("KeyboardInterrupt")
    pass
except:
    print("Unknown error!")
finally:
    # 关闭窗口
    cv2.destroyAllWindows()
    # 在程序结束前,释放摄像头资源
    g_camera.release()

    具体参数根据系统和配置去更改,这里只以个人系统为例,如后续有任何不懂的地方,欢迎留言评论讨论!!!文章来源地址https://www.toymoban.com/news/detail-811530.html

    通往答案的道路错综复杂,我们只用最简单的方式抵达!

到了这里,关于基于旭日派的Ros系统小车的再开发——使用python脚本调用MIPI相机(学习笔记)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ROS小车——摄像头的使用(3)

    ROS小车的摄像头驱动和图像的查看,以及opencv的使用。 roslaunch robot_vision robot_camera.launch打开摄像头,并用另一个终端打开节点rostopic list发现摄像头 小车没有看图的工具,我们借助虚拟机 使用rqt工具rqt_image_view,然后选择话题列表 一个终端roslaunch robot_vision robot_camera.launch打开

    2024年02月05日
    浏览(37)
  • ROS小车——雷达的使用与SLAM建图(4)

    启动激光雷达并查看数据,建图并避障导航 roslaunch robot_navigation lidar.launch在终端输入启动雷达,雷达开始旋转, 并打印scan话题,rostopic echo/scan,在虚拟机中 roslaunch robot_navigation lidar_rviz.launch 查看图形化的雷达数据。 roslaunch robot_navigation robot_slam_lidar.launch在终端输入启动sl

    2023年04月21日
    浏览(42)
  • 基于树莓派的智能家居控制系统设计论文参考

    完整论文咨询可WX联系:gyf1842965496 智能家居控制系统功能实现详细介绍:基于树莓派的智能家居控制系统设计https://blog.csdn.net/G1842965496/article/details/125491350#comments_26030679 随着科技的进步,人们生活水平的也在不断变好,人们对居住环境的要求也不再局限于传统的居住方式,而

    2024年02月08日
    浏览(46)
  • 基于STM32F103的树莓派ROS小车——全局路径规划之Dijkstra算法

    Dijkstra Dijkstra算法概念: 基本思想:由近到远把所有点的最短路径算出来。 算法解析:从起点向四周辐射,由近到远一层一层遍历所有的点,直到包含目标点所在层级。然后将所有可行路径进行计算比较,筛选出绝对最佳路径。 优点:最终得到的路径一定是最佳路径。 缺点

    2024年02月15日
    浏览(31)
  • ros机器小车运动控制

    目录 1 机器人小车的简单介绍 1.1  小车结构 2 开始测试和运动前的准备工作 2.1  创建并编译功能包practice: 2.1.1  创建功能包practice: 2.1.2  编译功能包practice: 2.2查看话题消息 3 代码分析 3.1  编写小车运动的py文件,并进行编译调试 3.2  launch一键启动文件 4 在仿真器中模

    2024年02月07日
    浏览(49)
  • ROS小车导航转圈

    ROS小车导航转圈的解决办法 启动相关文件后,在rviz中指明地方后,小车一直在转圈。 在修改move_base集成的yaml文件的线速度和角速度时问题并没有解决,后来在看base_local_planner_params文件参数的注释时发现了其中一个参数(sim_time:0.8)对于这个参数的注释是小车规划未来路径

    2024年02月11日
    浏览(36)
  • ROS寻迹小车

    1.自行导入某车型的mesh文件到URDF/Xacro模型(碰撞检测边框长度小数点位数保留三位:最后两位是学号最后两位),四轮驱动; 2.搭建一个具有城市或者越野行驶路面,不少于3处障碍的行驶环境; 3.给无人车装配摄像头、Kinect、激光雷达等传感器。 4.通过键盘控制无人车,采

    2024年02月06日
    浏览(54)
  • ROS实践——自主巡线小车

    目录 一、    Solidworks模型转urdf 1.下载sw_urdf_exporter插件 2.创建Solidworks模型 3.创建每一个link的点和坐标系 4.创建continue类型joint的旋转轴 5.使用插件进行配置并导出 6.测试 二、    将urdf转为xacro并集成传感器 1.将solidworks导出的汽车urdf文件转为xacro文件 2.添加camera、kinect和l

    2023年04月22日
    浏览(37)
  • 基于STM32开发板的循迹小车设计

    智能寻迹基于自动引导机器人系统,可以实现小车自动识别路线。智能寻迹小车运用传感器、单片机、电机驱动及自动控制等技术实现,管理时自动寻迹导航。该技术已经应用于无人驾驶机动车、无人工厂、仓库、服务机器人等多种领域。 本设计的完整的系统主要包括STM32单

    2024年04月13日
    浏览(63)
  • ROS小车研究笔记1/31/2023 小车硬件结构及键盘移动控制节点

    1 小车硬件结构 1 中控设备 上方的单片机用于控制电机运动,搭载wifi模块和电量显示屏。下方为树莓派,安装了ROS系统和Ubuntu系统,用于整个小车控制。显示屏和树莓派相连 2 传感器系统 激光雷达及转换器。激光雷达和转换器相连,再由转换器连接树莓派以控制激光雷达 摄

    2024年02月09日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包