Orange Pi (Armbian): driving the camera in Python with OpenCV

orange pi lite camera 2MP opencv python live preview
Table of Contents

In the previous tutorial, we saw how to drive (display the live image, record a snapshot and a video clip using the keyboard) on a Raspberry Pi under Raspbian. In this tutorial we will do the same but on an Orange Pi Lite (WiFi version). It is unfortunately not possible to use the Picamera library which was designed to work exclusively for Raspberry Pi, so we will have to use OpenCV which is an extremely powerful open source library.

Equipment used

As we have seen in this article, the CSI connector of Orange Pi is different from that of Raspberry Pi. I got the 2MP camera sold by Orange Pi (about 6 € on Aliexpress). The quality of the image is far from equal to that of the camera v2.1 8MP of the Raspberry Pi, but to begin, the value for money is unbeatable.

orange pi lite h3 computer board Orange Pi Lite

€12 (shipping cost, about €3.50 )

orange pi alimentation 5v 3a jack Power 5V – 3A

Or USB cable, about €2.50

carte sd Armbian on 8Go SD Card classe 10

From €6.90

camera orange pi 2MP csi Orange Pi 2MP camera module

About €7 (free shipping)

Preparation of the environment

Let’s start by preparing the environment.

Armbian System Update

Unless you’ve just done it, it’s best to always start with a small system update

sudo apt-get update
sudo apt-get upgrade

Installing python 2.7

Once the system is up to date, you can install Python 2.7. Why not Python 3 you say? This is possible without any problems. You have to choose according to your level. If you are starting out, you will find many more examples on Python 2.7.

sudo apt-get install python-dev

We take this opportunity to install the package manager for python (pip). Indeed, all deposits may not be reported in the sources of the Armbian distribution. Run the following command to install the pip command:

sudo apt-get install python-pip

Installing OpenCV for Python

There are many tutorials on the internet that explain how to install OpenCV (on Raspberry Pi or Orange Pi) in a virtual environment from the source code. It is a solution, but to have tested it is long (a big half-day compilation on my Orange Pi Lite) and especially the use of the virtual environment is tedious, especially if you start. Here, we will follow the shortest path, we will simply install the library with this simple command

sudo apt-get install python-opencv

Accept all questions asked.

Test program: Live display of the Orange Pi camera

Put yourself in the directory of your choice and open a new document, for example Paste the code below.

import cv2
c = cv2.VideoCapture(0)

  _,f =
  cv2.imshow('Camera Orange Pi',f)
  k = cv2.waitKey(5)
  if k==1048603:
      #Esc key to stop, or 27 depending your keyboard
      #Touche ESC appuyee. le code peut dependre du clavier. Normalement 27
  elif k==-1:
  #uncomment to know the code of of the key pressed
  #Decommenter pour connaitre le code de la touche pressee 
      #print k 


What does this code do?

We call the OpenCV 2 library (import cv2 )

An object c is created which captures the video stream sent by the camera (0), that is to say that which is connected to /dev/video0.

c = cv2.VideoCapture (0)

The camera image is displayed until the Escape key is pressed

The video stream ( is read and stored in the variable f (_, f = () ).

Then the video stream is displayed using the imshow function which takes as parameter:

  • The title of the window in which the video stream will be broadcast
  • The variable that contains the video stream
cv2.imshow('Camera Orange Pi',f)

First test

Save the script (CTRL + X then Y) and run


Oh, it does not work!

libv4l2: error setting pixformat: Operation not permitted
HIGHGUI ERROR: libv4l unable to ioctl S_FMT
libv4l2: error setting pixformat: Operation not permitted
libv4l1: error setting pixformat: Operation not permitted
libv4l2: error setting pixformat: Operation not permitted
libv4l1: error setting pixformat: Operation not permitted
HIGHGUI ERROR: libv4l unable to ioctl VIDIOCSPICT

OpenCV Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /usr/local/opencv-2.4.10/modules/highgui/src/window.cpp, line 261
Traceback (most recent call last):
  File "", line 7, in <module>
cv2.error: /usr/local/opencv-2.4.10/modules/highgui/src/window.cpp:261: error: (-215) size.width>0 && size.height>0 in function imshow

Why it does not work ?

First, we know that the cv2 library (OpenCV) works. This is already good news, we will not be compelled to compile everything from sources! If we googled the error (libv4l2: error setting pixformat: Operation not permitted ), we quickly find this article of the designer of the script vidcopy which allows to recopy the video stream produced by the v4l2loopback library.

Install v4l2loopback and vidcopy

We’ll just follow Leonardo Lontra’s tutorial.

Installing v4l2loopback

# git clone
# cd v4l2loopback/
# make && make install

Installing vidcopy

Vidcopy is a script that will create a virtual video output (/dev/video1) in which the video stream of the physical camera (/dev/video0) will be copied.

# apt-get install libv4l-dev
# git clone
# cd vidcopy/
# gcc vidcopy.c -o vidcopy

Loading required modules

# modprobe gc2035
# modprobe vfe_v4l2
# sleep 5
# modprobe v4l2loopback

Now, to make the changes permanent, run the following commands. They will add the corresponding rows to the modules in the / etc / modules configuration file. The modules will be automatically loaded at the next startup.

echo "v4l2loopback" | sudo tee -a /etc/modules
echo "gc2035" | sudo tee -a /etc/modules
echo "vfe_v4l2" | sudo tee -a /etc/modules

Copy stream to /dev/video1 with vidcopy

Place yourself in the vidcopy directory and run the script. It takes as a parameter: Here, it remains only to launch the script vidcopy to create a new virtual camera

  • -w: width of the image (1600 pixels for a 2MP camera
  • -h: height of the image (max. 1200 pixels for a 2MP camera)
  • -r: number of frames per second. For example 20 (maximum 30)
  • -i /dev/video0: Input video stream. Video0 for the camera connected to the CSI connector of the Orange Pi
  • -o /dev/video1: output of the video stream
  • -f: output format. The following formats have been successfully tested: UYVY / YV12 / YU12 / NV12 / NV21 by the author of the script

For the 2MP camera of Orange PI it gives

./vidcopy -w 800 -h 600 -r 30 -i /dev/video0 -o /dev/video1 -f UYVY

The script remains open in the terminal. It is stopped with the combination CTRL + C. I do not have enough backwards on the script yet, but asking for an 800 x 600 image, the output switches to 640 x 480.

Required width: 800
Required height: 600
Required FPS: 30
input device: /dev/video0
output device: /dev/video1
Driver Caps:
  Driver: "sunxi-vfe"
  Card: "sunxi-vfe"
  Bus: "sunxi_vfe sunxi_vfe.0"
  Version: 1.0
  Capabilities: 05000001
  FMT : CE Desc
  422P:    planar YUV 422
  YU12:    planar YUV 420
  YV12:    planar YVU 420
  NV16:    planar YUV 422 UV combined
  NV12:    planar YUV 420 UV combined
  NV61:    planar YUV 422 VU combined
  NV21:    planar YUV 420 VU combined
  HM12:    MB YUV420
  YUYV:    YUV422 YUYV
  YVYU:    YUV422 YVYU
  UYVY:    YUV422 UYVY
  VYUY:    YUV422 VYUY
  BA81:    RAW Bayer BGGR 8bit
  GBRG:    RAW Bayer GBRG 8bit
  GRBG:    RAW Bayer GRBG 8bit
  GRBG:    RAW Bayer RGGB 8bit
  BG10:    RAW Bayer BGGR 10bit
  GB10:    RAW Bayer GBRG 10bit
  BA10:    RAW Bayer GRBG 10bit
  BA10:    RAW Bayer RGGB 10bit
  BG12:    RAW Bayer BGGR 12bit
  GB12:    RAW Bayer GBRG 12bit
  BA12:    RAW Bayer GRBG 12bit
  BA12:    RAW Bayer RGGB 12bit
Selected Camera Mode:
  Width: 640
  Height: 480
  PixFmt: UYVY

All you have to do is connect the python script to this new video stream. Open the python script and replace 0 by 1 in the VideoCapture function like this c = cv2.VideoCapture(1) . Save the script.

Et voilà ! You can use the image of the Orange Pi camera in your Python projects.

orange pi lite camera 2MP opencv python live preview

Save an image to the keyboard

Last little thing to finish this tutorial, trigger the recording of a picture on the keyboard. Add a variable pics_taken = 0 to the beginning of the code. Then retrieve the code of the key with which you want to record an image. Here it is 1048586 (Return). Add this test and change the destination path of the images. It is done.

elif k==1048586:
      pics_taken += 1
      cv2.imwrite('/home/pi/Desktop/img_' + str(pics_taken) + ".jpg", f)


As always with the Orange Pi, there is a much better performance / price ratio than the Raspberry Pi provided that you put your hand to the keyboard ;-). On the performance side, the Orange Pi Lite with its SoC quad-core and its 512MB Ram is perfectly able to support Armbian’s XFCE desktop, Open CV and Python. Remains to be tested on a more complex project, for example facial recognition or motion detection.

Click to rate this post!
[Total: 0 Average: 0]

Thanks for your reading

Did you like this project ? Don't miss any more projects by subscribing to our weekly newsletter!

Are you having a problem with this topic?

Maybe someone has already found the solution, visit the forum before asking your question

We will be happy to hear your thoughts

Leave a Reply

Read more
DIY Projects
DIY Projects