Explorer/RaspberryPi/Visualprocessing/Opencv

From PaparazziUAV
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
  • Installation

PIZero installation > 10 hours
PI3 installation > 4 hours

sudo apt-get install -y cmake

sudo apt-get install -y python-numpy python3-numpy libpython-dev libpython3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libtiff-dev zlib1g-dev libjpeg-dev libpng-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev

sudo apt-get install -y libatlas-base-dev gfortran
for raspberry pi3
sudo apt-get install -y libgtk2.0-dev
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git 
cd ~/opencv 
git checkout 4.3.0
cd ~/opencv_contrib
git checkout 4.3.0
mkdir ~/opencv/build
cd ~/opencv/build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
   -D CMAKE_INSTALL_PREFIX=/usr/local \
   -D INSTALL_PYTHON_EXAMPLES=OFF \
   -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
   -D OPENCV_GENERATE_PKGCONFIG=YES \
   -D BUILD_TESTS=OFF \
   -D BUILD_PERF_TESTS=OFF \
   -D BUILD_EXAMPLES=OFF ..

=> GStreamer: YES (1.14.4)

/etc/dphys-swapfile
CONF_SWAPSIZE=2048

sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start
make & 
for raspberrypi3: make -j4&
sudo make install
sudo ldconfig -v
  • Check installation
python3
Python 3.7.3 (default, Dec 20 2019, 18:57:59) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.3.0'

create ~/opencv_test/ptest.py chmod ugo+xwr ~/opencv_test/ptest.py

#!/usr/bin/python3
import numpy as np
import threading
import cv2
import time

acquisition_cpt = 0
processing_cpt = 0
frame = None

def data_acquisition(cap,out,condition):
  global acquisition_cpt,frame
  print("data_acquisition thread")
  while True:
    grabbed,frame = cap.read()
    if grabbed:
      with condition:
        acquisition_cpt = acquisition_cpt + 1
        #print("acquisition_cpt ",acquisition_cpt)
        condition.notify()

def data_processing(cap,out,condition):
  global processing_cpt
  print("data_processing thread")
  while True:
    with condition:
      condition.wait()
      img = frame.copy()
    processing_cpt = processing_cpt + 1
    #print("processing_cpt ",processing_cpt)
    out.write(img)

if __name__ == '__main__':
  cap =  cv2.VideoCapture('udpsrc port=5200 ! h264parse ! omxh264dec ! videoconvert ! video/x-raw, format=(string)BGR ! appsink', cv2.CAP_GSTREAMER);
  out =  cv2.VideoWriter('appsrc ! videoconvert ! omxh264enc ! video/x-h264,profile=high ! udpsink host=127.0.0.1 port=5210',cv2.CAP_GSTREAMER,0, 30, (640,480), True)
  time.sleep(0.1)
  if not cap.isOpened() or not out.isOpened():
    print("not opened")
    quit()
  threads = []
  condition = threading.Condition()
  for func in [data_acquisition, data_processing]:
    threads.append(threading.Thread(target=func, args=(cap,out,condition)))
    threads[-1].start() 
  for thread in threads:
    thread.join()
  cap.release()

create ~/opencv_test/test.cpp

#include <opencv2/opencv.hpp>
#define WIDTH 640
#define HEIGHT 480
#define FPS 30
#define SCALE 3/2
 
using namespace cv;
using namespace std;
int main(int, char**)
{
  Mat data;
  string streamInGstStr="udpsrc port=5200 ! h264parse ! omxh264dec ! videoconvert ! video/x-raw, format=(string)BGR ! appsink";
  string streamOutGstStr="appsrc ! videoconvert ! omxh264enc ! video/x-h264,profile=high ! udpsink host=127.0.0.1 port=5210";

  VideoCapture streamIn(streamInGstStr,CAP_GSTREAMER);
  VideoWriter  streamOut(streamOutGstStr,0,FPS/1,Size(WIDTH,HEIGHT),true);

  if (streamIn.isOpened() && streamOut.isOpened()) {
    while (true) {
      streamIn.read(data);
      if (!data.empty()) {
        streamOut.write(data);
      }
    }
  }
  return 0;
}
g++ -g ~/opencv_test/test.cpp -o ~/opencv_test/test `pkg-config --cflags --libs opencv4` 

Run following script with ~/opencv_test/test and ~/opencv_test/ptest.py

#!/bin/bash
sudo killall raspivid gst-launch test-launch test ptest.py \
rm /tmp/camera*;\
raspivid -t 0 -w 640 -h 480 -fps 30/1 -b 3000000 -g 5 -vf -hf -cd H264 -n -fl -ih -o -  \
 | gst-launch-1.0 fdsrc  \
   ! h264parse  \
   ! video/x-h264,stream-format=byte-stream  \
   ! tee name=streams \
   ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 \
   ! udpsink host=127.0.0.1 port=5100 streams. \
   ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 \
   ! udpsink host=127.0.0.1 port=5200 &
sleep 1
#~/opencv_test/ptest.py &
~/opencv_test/test &
sleep 1
gst-rtsp-server-1.14.4/examples/test-launch \
"udpsrc port=5100 do-timestamp=true ! video/x-h264,stream-format=byte-stream,alignment=au ! rtph264pay name=pay0 pt=96 config-interval=1" \
"udpsrc port=5210 do-timestamp=true ! video/x-h264,stream-format=byte-stream,alignment=au ! rtph264pay name=pay0 pt=96 config-interval=1" 

client:

gst-launch-1.0 rtspsrc location=rtsp://RASPBERRYPI_IP:8554/test ! rtph264depay ! avdec_h264 !  xvimagesink sync=false
gst-launch-1.0 rtspsrc location=rtsp://RASPBERRYPI_IP:8554/test2 ! rtph264depay ! avdec_h264 !  xvimagesink sync=false

Explorer/RaspberryPi/Visualprocessing/Opencv/Optimisation