jetson nano 配置 opencv 打开 csi相机

先用下面这样的命令确定一下相机可以被打开,没有损坏

v4l2-ctl -d /dev/video0 --list-formats-ext
gst-launch-1.0 nvarguscamerasrc sensor_id=0 ! 'video/x-raw(memory:NVMM),width=3280, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=2 ! 'video/x-raw, width=816, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e

在使用的过程中,笔者发现 jetson nano 直接 apt得到的 opencv 是不打开GStreamer的(可以在python里输入print(cv2.getBuildInformation())得到),但是nano 的csi相机需要用这个打开。这就导致系统可以启动相机,但是opencv不可以打开。

如果需要安装为jetson nano配置的opencv,可以运行下面的sh文件,运行前确保你有足够的虚拟内存

#!/bin/bash
set -e

echo "Installing OpenCV 4.5.5 on your Jetson Nano"
echo "It will take 3 hours !"

# reveal the CUDA location
cd ~
sudo sh -c "echo '/usr/local/cuda/lib64' >> /etc/ld.so.conf.d/nvidia-tegra.conf"
sudo ldconfig

# install the dependencies
sudo apt-get install -y build-essential cmake git unzip pkg-config zlib1g-dev
sudo apt-get install -y libjpeg-dev libjpeg8-dev libjpeg-turbo8-dev libpng-dev libtiff-dev
sudo apt-get install -y libavcodec-dev libavformat-dev libswscale-dev libglew-dev
sudo apt-get install -y libgtk2.0-dev libgtk-3-dev libcanberra-gtk*
sudo apt-get install -y python-dev python-numpy python-pip
sudo apt-get install -y python3-dev python3-numpy python3-pip
sudo apt-get install -y libxvidcore-dev libx264-dev libgtk-3-dev
sudo apt-get install -y libtbb2 libtbb-dev libdc1394-22-dev libxine2-dev
sudo apt-get install -y gstreamer1.0-tools libv4l-dev v4l-utils v4l2ucp  qv4l2 
sudo apt-get install -y libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev
sudo apt-get install -y libavresample-dev libvorbis-dev libxine2-dev libtesseract-dev
sudo apt-get install -y libfaac-dev libmp3lame-dev libtheora-dev libpostproc-dev
sudo apt-get install -y libopencore-amrnb-dev libopencore-amrwb-dev
sudo apt-get install -y libopenblas-dev libatlas-base-dev libblas-dev
sudo apt-get install -y liblapack-dev liblapacke-dev libeigen3-dev gfortran
sudo apt-get install -y libhdf5-dev protobuf-compiler
sudo apt-get install -y libprotobuf-dev libgoogle-glog-dev libgflags-dev

# remove old versions or previous builds
cd ~ 
#sudo rm -rf opencv*
# download the latest version
wget -O opencv.zip https://ghproxy.com/https://github.com/opencv/opencv/archive/4.5.5.zip 
wget -O opencv_contrib.zip https://ghproxy.com/https://github.com/opencv/opencv_contrib/archive/4.5.5.zip 
# unpack
unzip opencv.zip 
unzip opencv_contrib.zip 
# some administration to make live easier later on
mv opencv-4.5.5 opencv
mv opencv_contrib-4.5.5 opencv_contrib
# clean up the zip files
rm opencv.zip
rm opencv_contrib.zip

# set install dir
cd ~/opencv
mkdir build
cd build

# run cmake
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D EIGEN_INCLUDE_PATH=/usr/include/eigen3 \
-D WITH_OPENCL=OFF \
-D WITH_CUDA=ON \
-D CUDA_ARCH_BIN=5.3 \
-D CUDA_ARCH_PTX="" \
-D WITH_CUDNN=ON \
-D WITH_CUBLAS=ON \
-D ENABLE_FAST_MATH=ON \
-D CUDA_FAST_MATH=ON \
-D OPENCV_DNN_CUDA=ON \
-D ENABLE_NEON=ON \
-D WITH_QT=OFF \
-D WITH_OPENMP=ON \
-D BUILD_TIFF=ON \
-D WITH_FFMPEG=ON \
-D WITH_GSTREAMER=ON \
-D WITH_TBB=ON \
-D BUILD_TBB=ON \
-D BUILD_TESTS=OFF \
-D WITH_EIGEN=ON \
-D WITH_V4L=ON \
-D WITH_LIBV4L=ON \
-D OPENCV_ENABLE_NONFREE=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D PYTHON3_PACKAGES_PATH=/usr/lib/python3/dist-packages \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D BUILD_EXAMPLES=OFF ..

# run make
FREE_MEM="$(free -m | awk '/^Swap/ {print $2}')"
# Use "-j 4" only swap space is larger than 5.5GB
if [[ "FREE_MEM" -gt "5500" ]]; then
  NO_JOB=4
else
  echo "Due to limited swap, make only uses 1 core"
  NO_JOB=1
fi
make -j ${NO_JOB} 

sudo rm -r /usr/include/opencv4/opencv2
sudo make install
sudo ldconfig

# cleaning (frees 300 MB)
# make clean
sudo apt-get update

echo "Congratulations!"
echo "You've successfully installed OpenCV 4.5.5 on your Jetson Nano"

用opencv的时候,可以参考下面代码

import cv2, queue, threading, time

# bufferless VideoCapture
class MyVideoCapture:

  def __init__(self, name):
    print("opening cam")
    if name=="csi":
      self.csi = True
      self.cap = cv2.VideoCapture(self.gstreamer_pipeline(flip_method = 0), cv2.CAP_GSTREAMER)
    else:
      self.csi = False
      self.cap = cv2.VideoCapture(name)
    self.width = self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)   
    self.height = self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)   

    if self.isOpened():
      print("cam opened")
    else:
      print("cam not opened")

    self.q = queue.Queue()
    t = threading.Thread(target=self._reader)
    t.daemon = True
    t.start()

  # read frames as soon as they are available, keeping only most recent one
  def _reader(self):
    while True:
      ret, frame = self.cap.read()
      if not ret:
        break
      if not self.q.empty():
        try:
          self.q.get_nowait()   # discard previous (unprocessed) frame
        except queue.Empty:
          pass
      self.q.put(frame)

  def read(self):
    return self.q.get()

  def release(self):
    self.cap.release()

  def isOpened(self):
    return self.cap.isOpened()
    
  def gstreamer_pipeline(
      self,
      sensor_id=0,
      capture_width=1920,
      capture_height=1080,
      display_width=960,
      display_height=540,
      framerate=30.0,
      flip_method=0,
  ):
      return (
          "nvarguscamerasrc sensor-id=%d !"
          "video/x-raw(memory:NVMM), width=(int)%d, height=(int)%d, 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,
              capture_width,
              capture_height,
              framerate,
              flip_method,
              display_width,
              display_height,
          )
      )


if __name__ =='__main__':
    cap = MyVideoCapture(0)
    try:
      while True:
          time.sleep(.5)   # simulate time between events
          frame = cap.read()
          cv2.imshow("frame", frame)
          if chr(cv2.waitKey(1)&255) == 'q':
              break
      cap.release()
      cv2.destroyAllWindows()
      print("cam closed")
    except:
      cap.release()
      cv2.destroyAllWindows()
      print("cam closed")
    
  • 0
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以通过以下步骤在 Jetson Nano 上使用 QtCreator 打开 CSI 摄像头并将其转换为 OpenCV 的 Mat 格式并显示: 1. 安装 CSI 摄像头驱动程序和相关软件包: ``` sudo apt-get install v4l-utils sudo apt-get install libv4l-dev sudo apt-get install libv4l-dbg sudo apt-get install libv4lconvert0 ``` 2. 在 QtCreator 中创建一个新的 QtWidgets 应用程序项目。 3. 在项目的 .pro 文件中添加以下内容: ``` CONFIG += link_pkgconfig PKGCONFIG += opencv4 ``` 这将使用 pkg-config 自动链接 OpenCV 库。 4. 在项目的 main.cpp 文件中添加以下代码: ``` #include <QApplication> #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> int main(int argc, char *argv[]) { QApplication a(argc, argv); cv::VideoCapture cap(0, cv::CAP_V4L2); if (!cap.isOpened()) { std::cerr << "Failed to open camera." << std::endl; return -1; } cv::Mat frame; while (true) { cap.read(frame); if (frame.empty()) { std::cerr << "Failed to capture frame." << std::endl; break; } cv::imshow("Camera", frame); if (cv::waitKey(1) == 'q') { break; } } cv::destroyAllWindows(); return a.exec(); } ``` 这将打开一个名为 "Camera" 的窗口,并显示从 CSI 摄像头读取的视频流。 5. 如果你想将视频流转换为 OpenCV 的 Mat 格式,可以在循环中添加以下代码: ``` cv::Mat frame; cv::Mat mat_frame; while (true) { cap.read(frame); if (frame.empty()) { std::cerr << "Failed to capture frame." << std::endl; break; } cv::cvtColor(frame, mat_frame, cv::COLOR_BGR2RGB); cv::imshow("Camera", mat_frame); if (cv::waitKey(1) == 'q') { break; } } ``` 这将使用 OpenCV 的 cvtColor 函数将 BGR 格式的帧转换为 RGB 格式,并将其存储在 Mat 对象中。你还可以对转换后的 Mat 对象进行任何你想要的操作。 6. 在 QtCreator 中点击 "Build" 按钮来编译并运行项目。 如果一切正常,应该能够看到一个实时的视频流,并且你还可以对该视频流进行任何你想要的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萧易风船长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值