jetson测试多个CSI摄像头(python版)

首先,CSI摄像头和USB摄像头的调用方式是不一样的。

遇到过的错误

linano@jetson-nano$:python3 mpy-Copyl.py
[ WARN:0 ] qlobal /home/nvidia/host/build opencv/nv opencv/modules/videoio/src/cap qstreamer. Cpp (1757) handleMessage OpenCV | GStreamer warninq: Embedded video playback halted; module v412src0 reported: Internal data stream error
[WARN: 0] qlobal /home/nvidia/host/build opencv/nv opencv/modules/videoio/src/cap gst.reamer.cpp (886) open OpenCV | GStreamer warning: unable to start pipeline
[ WARN:0 ] global /home/nvidia/host/build opencv/nv opencv/modules/videoio/src/cap qatreamer.cpp (480) isPipelinePlaying Opencv | Gstreamer warning: Gstreamer: pipeline have not been created

问题原因:
楼主就是刚开始接触这csi摄像头。用cv2.VideoCapture(0) / cv2.VideoCapture(1)一直报错,但是CSI摄像头和USB摄像头的调用方式是不一样的。cv2.VideoCapture(0) / cv2.VideoCapture(1)通常用于usb。

Jetson调用多个CSI摄像头

我这里有两种方法:
1、利用JetCam:JetCam是用于NVIDIA Jetson的易于使用的Python摄像头界面。
对JetCam有兴趣的可以查看下面连接(例程更多,细节更多)
https://github.com/NVIDIA-AI-IOT/jetcam
2、利用opencv (我比较喜欢)
3、两种混合使用
参考:
https://github.com/JetsonHacksNano/CSI-Camera

下面的例程都是利用python调用csi摄像头,并且在ubuntu上显示
(并非利用jupyterLab在浏览器上显示,如果需要显示在jupyterLab,则参考我上面提供的两个网站)

例一:使用JetCam+opencv 在ubuntu上显示

from jetcam.csi_camera import CSICamera
import cv2

camera0 = CSICamera(capture_device=0, width=224, height=224)
camera1 = CSICamera(capture_device=1, width=224, height=224)
image0 = camera0.read()
print(image0.shape)
image1 = camera1.read()
print(image1.shape)
print(camera0.value.shape)
print(camera1.value.shape)
while 1:
    image0 = camera0.read()
    image1 = camera1.read()
    cv2.imshow("CSI Camera0", image0)
    cv2.imshow("CSI Camera1", image1)
    kk = cv2.waitKey(1)
    if kk == ord('q'):  # 按下 q 键,退出
        break

例二:使用opencv 在ubuntu上显示

# MIT License
# Copyright (c) 2019,2020 JetsonHacks
# See license
# A very simple code snippet
# Using two  CSI cameras (such as the Raspberry Pi Version 2) connected to a
# NVIDIA Jetson Nano Developer Kit (Rev B01) using OpenCV
# Drivers for the camera and OpenCV are included in the base image in JetPack 4.3+

# This script will open a window and place the camera stream from each camera in a window
# arranged horizontally.
# The camera streams are each read in their own thread, as when done sequentially there
# is a noticeable lag
# For better performance, the next step would be to experiment with having the window display
# in a separate thread

import cv2
import threading
import numpy as np

# gstreamer_pipeline returns a GStreamer pipeline for capturing from the CSI camera
# Flip the image by setting the flip_method (most common values: 0 and 2)
# display_width and display_height determine the size of each camera pane in the window on the screen

left_camera = None
right_camera = None


class CSI_Camera:

    def __init__ (self) :
        # Initialize instance variables
        # OpenCV video capture element
        self.video_capture = None
        # The last captured image from the camera
        self.frame = None
        self.grabbed = False
        # The thread where the video capture runs
        self.read_thread = None
        self.read_lock = threading.Lock()
        self.running = False


    def open(self, gstreamer_pipeline_string):
        try:
            self.video_capture = cv2.VideoCapture(
                gstreamer_pipeline_string, cv2.CAP_GSTREAMER
            )
            
        except RuntimeError:
            self.video_capture = None
            print("Unable to open camera")
            print("Pipeline: " + gstreamer_pipeline_string)
            return
        # Grab the first frame to start the video capturing
        self.grabbed, self.frame = self.video_capture.read()

    def start(self):
        if self.running:
            print('Video capturing is already running')
            return None
        # create a thread to read the camera image
        if self.video_capture != None:
            self.running=True
            self.read_thread = threading.Thread(target=self.updateCamera)
            self.read_thread.start()
        return self

    def stop(self):
        self.running=False
        self.read_thread.join()

    def updateCamera(self):
        # This is the thread to read images from the camera
        while self.running:
            try:
                grabbed, frame = self.video_capture.read()
                with self.read_lock:
                    self.grabbed=grabbed
                    self.frame=frame
            except RuntimeError:
                print("Could not read image from camera")
        # FIX ME - stop and cleanup thread
        # Something bad happened
        

    def read(self):
        with self.read_lock:
            frame = self.frame.copy()
            grabbed=self.grabbed
        return grabbed, frame

    def release(self):
        if self.video_capture != None:
            self.video_capture.release()
            self.video_capture = None
        # Now kill the thread
        if self.read_thread != None:
            self.read_thread.join()


# Currently there are setting frame rate on CSI Camera on Nano through gstreamer
# Here we directly select sensor_mode 3 (1280x720, 59.9999 fps)
def gstreamer_pipeline(
    sensor_id=0,
    sensor_mode=3,
    capture_width=1280,
    capture_height=720,
    display_width=1280,
    display_height=720,
    framerate=30,
    flip_method=0,
):
    return (
        "nvarguscamerasrc sensor-id=%d sensor-mode=%d ! "
        "video/x-raw(memory:NVMM), "
        "width=(int)%d, height=(int)%d, "
        "format=(string)NV12, framerate=(fraction)%d/1 ! "
        "nvvidconv flip-method=%d ! "
        "video/x-raw, width=(int)%d, height=(int)%d, format=(string)BGRx ! "
        "videoconvert ! "
        "video/x-raw, format=(string)BGR ! appsink"
        % (
            sensor_id,
            sensor_mode,
            capture_width,
            capture_height,
            framerate,
            flip_method,
            display_width,
            display_height,
        )
    )


def start_cameras():
    left_camera = CSI_Camera()
    left_camera.open(
        gstreamer_pipeline(
            sensor_id=0,
            sensor_mode=3,
            flip_method=0,
            display_height=540,
            display_width=960,
        )
    )
    left_camera.start()

    right_camera = CSI_Camera()
    right_camera.open(
        gstreamer_pipeline(
            sensor_id=1,
            sensor_mode=3,
            flip_method=0,
            display_height=540,
            display_width=960,
        )
    )
    right_camera.start()

    cv2.namedWindow("CSI Cameras", cv2.WINDOW_AUTOSIZE)

    if (
        not left_camera.video_capture.isOpened()
        or not right_camera.video_capture.isOpened()
    ):
        # Cameras did not open, or no camera attached

        print("Unable to open any cameras")
        
        # TODO: Proper Cleanup
        SystemExit(0)

    while cv2.getWindowProperty("CSI Cameras", 0) >= 0 :
        
        _ , left_image=left_camera.read()
        _ , right_image=right_camera.read()
        camera_images = np.hstack((left_image, right_image))
        cv2.imshow("CSI Cameras", camera_images)

        # This also acts as
        keyCode = cv2.waitKey(30) & 0xFF
        # Stop the program on the ESC key
        if keyCode == 27:
            break

    left_camera.stop()
    left_camera.release()
    right_camera.stop()
    right_camera.release()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    start_cameras()
    

热门文章

暂无图片
编程学习 ·

Java基础——数据库连接信息使用密文

背景数据库连接配置文件一般都是使用明文,这会带来数据库泄露的安全问题。例如jdbc.properties配置文件中,数据库连接地址、用户名、密码都是明文,如何使配置文件中的数据库连接信息避免明文显示是本文重点内容,即如何使配置信息使用密文就可以达到跟明文一样的效果。分析假…
暂无图片
编程学习 ·

Linux批量修改文件名

#!/bin/bash #生成文件的list文本,复制文件 for file in `cat val.txt` do cp val1/$file* val/ done#当前文件夹下重命名 for file in val/*-1.png; do mv "$file" "${file%-1.png}.png"; done
暂无图片
编程学习 ·

二、21【设计模式】之状态模式

今天的博客主题设计模式 ——》 设计模式之状态模式状态模式 SP (State Pattern)定义允许对象在内部状态发生改变时改变它的行为,看起来好像修改了它的类。类的行为是由状态决定的,不同的状态下该类有不同的行为。就是一个对象在其内部改变的时候,它的行为也随之改变。核心…
暂无图片
编程学习 ·

如何用Nearby Service开发针对附近人群的精准广告推送功能

当你想找一家餐厅吃饭,却不知道去哪家,这时候手机跳出一条通知,为你自动推送附近优质餐厅的信息,你会点击查看吗?当你还在店内纠结于是否买下一双球鞋时,手机应用给了你发放了老顾客5折优惠券,这样的广告你有拒绝的理由吗?这样的广告不仅不会引起用户的厌烦,还满足了用…
暂无图片
编程学习 ·

lex yacc flex bison

简介 lex与yacc是两个在Unix下的分别作词法分析和语法分析的工具, Linux对应flex与bison。 Yacc 与 Lex 快速入门 flex 和bison的安装和使用 Windows下安装lex(flex)与yacc(bison)
暂无图片
编程学习 ·

Zabbix+percona插件实现数据库mysql的监控

文章目录1.配置zabbix监控mysql的配置1.1 在zabbix-agent主目录(默认情况下为/ var / lib / zabbix)中创建.my.cnf2.配置percona2.1安装2.2配置文件2.3.在zabbix图形界面中导入模板2.3.1 监控的server添加监控项2.3.2 更改字体 1.配置zabbix监控mysql的配置 检测试验环境:确…
暂无图片
编程学习 ·

Vue&Element

Vue&Element Vue 快速入门 Vue 介绍Vue 是一套构建用户界面的渐进式前端框架。 只关注视图层,并且非常容易学习,还可以很方便的与其它库或已有项目整合。 通过尽可能简单的 API 来实现响应数据的绑定和组合的视图组件。 特点 易用:在有 HTML CSS JavaScript 的基础上,快…
暂无图片
编程学习 ·

JDBC

JDBC(Java DataBase Connectivity) JDBC 简介 Java 数据库连接技术。即用 Java 程序操作数据库的一套接口。是独立与 特定数据库(MySQL、SQLServer) 的管理系统,也就是无论使用的是什么类型的数据库都可以用 JDBC 去连接。 让 JDBC 去翻译底层数据库的各种指令,我们只需要使…
暂无图片
编程学习 ·

转 C++常用设计模式

适配器模式可以将一个类的接口转换成客户端希望的另一个接口,使得原来由于接口不兼容而不能在一起工作的那些类可以在一起工作。通俗的讲就是当我们已经有了一些类,而这些类不能满足新的需求,此时就可以考虑是否能将现有的类适配成可以满足新需求的类。适配器类需要继承或依…
暂无图片
编程学习 ·

iOS开发之多线程(2)—— Thread

目录版本简介方法属性示例 版本 Xcode 11.5 Swift 5.2.2 简介 一个Thread即为一个线程. 方法属性 OC中的属性方法(Swift方法名类似): #pragma mark - 属性 // 可以使用返回的字典来保存线程的特定数据. (这只是一个普通的字典, 用来保存所有开发者感兴趣的数据.) @property (r…
暂无图片
编程学习 ·

tensorflow 中tf.strided_slice和tf.slice的区别

函数:tf.slice(inputs, begin, size, name) 作用:从列表、数组、张量等对象中抽取一部分数据begin和size是两个多维列表,他们共同决定了要抽取的数据的开始和结束位置 begin表示从inputs的哪几个维度上的哪个元素开始抽取 size表示在inputs的各个维度上抽取的元素个数import…
暂无图片
编程学习 ·

Ubuntu编译安装postgreSQL 10.5

Ubuntu下编译安装postgreSQL 10.5 ubuntu 16.04 LTS系统 postgreSQL 10.5 安装包准备从PostgreSQL官网下载PostgreSQL的安装包安装过程解压源码包tar zxvf postgresql-10.5.tar.gz cd postgresql-10.5检查环境配置 #创建postgreSQL的安装目录 mkdir /usr/local/postgresql #检查…
暂无图片
编程学习 ·

小甲鱼python听课笔记p11-p15

p11 7.1 列表1 = 打了激素的数组列表可以存放不同类型的数,还可以创建空列表append():向列表里面添加数据末尾添加一个元素但是只能一次插入一个数据extend():扩张的方式来扩展列表末尾添加多个元素,但要求已列表的格式添加[x,x,x,x]用一个列表来扩展另一个列表,所以他…
暂无图片
编程学习 ·

哈夫曼编码

哈夫曼编码 输入一个字符串文本 #include <stdio.h> #include <stdlib.h> #include <string.h>#define cmax 0x3f3f3f3f // 宏定义一个较大的数,作为比较数据 #define cmaxsize 10000 // 宏定义数组的长度 // ---构建哈夫曼树 // ---定义哈夫曼…
暂无图片
编程学习 ·

Codeforces 1342 E Placing Rooks —— 第二类斯特林数

This way 题意: 现在有一个n*n的棋盘,n个棋子,你要放置这些棋子使得他们满足以下条件: 每个格子都能被某个棋子打到 共有k对棋子能够打到对方 如果一个格子所处的这一行或这一列有一个棋子,那么这个格子就能被打到。两个棋子处在同一行或同一列并且它们之间没有别的棋子,…
暂无图片
编程学习 ·

LInux下部署lnmp环境,mysql8.0连接的坑,php7.4废弃函数

最近在公司搭建了一套lnmp环境,遇到的一些问题,分享一下。采用lnmp一键安装包(地址:https://lnmp.org/faq/lnmp-software-list.html)的形势,安装了最新的php7.4,mysql8.0 版本坑一:mysql8.0 1、Authentication type: 用户的 Authentication type 默认为 caching_sha2_…
暂无图片
编程学习 ·

【小甲鱼】零基础入门学习Python(二)函数

function.__doc__function(a = x, b = y) 关键字参数def function(a = x, b = y): 默认值参数def function(*params) 收集参数,可输入多个参数打包为元组函数无return时返回Nonegloble 将局部变量转化为全局变量闭包def FunX(x):def FunY(y):return x * yreturn FunYFunX(8)(5…