Debian Üzerinde Cross Compiling Yöntemi ile Raspberry Pi için OpenCV Derlenmesi
Debian Üzerinde Cross Compiling Yöntemi ile Raspberry Pi için OpenCV Derlenmesi
Raspberry Pi üzerinde OpenCV derlemek epey meşekkatli bir iş açıkçası. Geçenlerde Raspberry Pi 3B+ için OpenCV yi derlemem neredeyse bir günümü almıştı. Raspberry Pi in işlemci gücünün düşük olması, raminin yetersiz olması ve SD Kart üzerinde çalışması gibi faktörler OpenCV nin derlenme süresini epey uzatıyor. Öyle ki derlemeyi başlattığınızda dört saatin sonunda %99 da hata aldığınıza başınıza kaynar sular dökülüyor. Bu yazıda OpenCV yi Debian üzerinde derleyip, Raspberry Pi a kurulumunu anlatacağız.
Ben derlememi yaparken Windows üzerinde sanal makine kurup, Debian Linux sürümünü sanal makine üzerinde çalıştırdırdım. Sanal makinede fiziksel işlemcinin tüm çekirdeklerini kullanmasına izin verdim. 4GB ram belirledim ve SSD diskimde 20GB yer ayırdım. Sonuçta epey hızlı bir Debian dağıtımı ile bu işlemleri hallettim. Sanal makine için VMWare 12 sürümünü kullandım. Debian dağıtımlarından da Debian 10 64 Bit sürümünü kullandım.
Alet Çantası
VMWare Sanal Makinesi : https://www.vmware.com/
Debian 10 x64 ISO (DVD amd64 dosyasını indirin. DVD-1 i indirmeniz yeterli): https://www.debian.org/CD/http-ftp/
Raspbian Imajı (Raspberry Pi için): https://www.raspberrypi.org/downloads/raspbian/
Önemli Hatırlatma!
Bu yazıda anlatılan kurulum Raspberry Pi 3 ve 4 sürümleri içindir. Raspberry Pi 4 4GB üzerinde ve Raspberry Pi 3B+ üzerinde denendi. Raspberry Pi 2 de çalışır mı bilmiyorum. Deneme imkanım yok. Ayrıca Raspberry Pi Zero için biraz daha farklı bir kurulum var ayrıca anlatılacak.
Bu yazı yazıldığında OpenCV’nin son sürümü 4.1.1 ancak bu sürümde bu yöntemle GTK kütüphaneleri uyumsuzluk gösteriyor ve derleme esnasında OpenCV GTK kütüphanelerini göremiyor. O yüzden anlatım OpenCV 4.1.0 sürümü üzerinden yapıldı.
Debian ı görsel kurulumu kullanarak kurdum. Debianı ilk kurarken hem root şifresi belirteceksiniz, hem de yeni bir kullanıcı oluşturacak ve ona da şifre belirleyeceksiniz. Debian üzerinde karşılacağınız (en azından benim karşılaştığım) 2 sorun var. Birincisi sudo komutu kullandığınızda kullanıcı adınızın sudoers içinde yer almadığı ile ilgili hata. İkincisi ise apt install komutunu kullandığınızda paketin bulunamadığı ile ilgili hata.
Birinci hatanın çözümü, Debian ı recovery (kurtarma) modunda tekrar başlatıyorsunuz. Size root parolasını sorduğunda root parlonızı girdikten sonra şu komutu yazıyorsunuz. nano /etc/sudoers
Nano düzenleyici ile sudoers dosyasını düzenlememiz gerekiyor. root ALL=(ALL:ALL) ALL
satırının altına kullanici_adiniz ALL=(ALL:ALL) ALL
komutunu yazıp Ctrl+X ile çıkış yap diyorsunuz. Kaydedilsin mi diye soracak, Yes deyip kaydediyorsunuz. reboot
komutunu yazarak Debian ı tekrar başlatıyorsunuz. Artık sudo
komutunu rahatlıkla kullanabileceksiniz. sudoers dosyanızı düzenlediğinizde aşağıdaki gibi görünmeli.
İkinci sorunumuz ise apt install komutunda kütüphaneli DVD den araması. Bunun için de Dosyalar uygulamasını kullanarak, + Diğer Konumlar
-> Bilgisayar
-> etc
-> apt
klasörüne gitmek ve sources.list
dosyasına çift tıklamak. Açılan penceredeki tikler aşağıda eklediğim resimdeki gibi olmalı:
Kapat dediğinizde listeleri güncelleyeyim mi diyor, evet deyin. Kapandıktan sonra artık sudo apt install
komutunu rahatlıkla kullanabileceksiniz.
Debian Tarafında Yapılacaklar
Önce sistem güncellemelerini yapalım:
sudo apt -y update
sudo apt -y upgrade
Debian üzerinde armhf mimarisini aktifleştirelim. Sonuçta Raspberry Pi ARM mimarisi üzerine kurulu. Dolayısıyla Raspberry Pi üzerine kuracağımız kütüphanelerin de arm mimarisinde derlenmiş olması gerekiyor.
sudo dpkg --add-architecture armhf
sudo apt -y update
sudo apt install -y qemu-user-static
Bu noktada artık Debian a arm mimarisi özelliğini ekledik. Şimdi Debian üzerine Python 2 ve 3 ü kuralım. Aynı zamanda her iki Python sürümü için numpy kütüphanesini de kuralım. Numpy’nin kurulduğundan özellikle emin olun yoksa build esnasında hata alırsınız.
sudo apt-get install -y python3-dev python3-numpy python-dev python-numpy
armhf mimarisi için aynı zamanda libpython kütüphanesine ihtiyacımız var. Her iki python sürümü için bunları kuralım.
sudo apt-get install -y libpython2-dev:armhf
sudo apt-get install -y libpython3-dev:armhf
Bu noktadan sonra eğer OpenCV ile GUI programlar yazacaksanız, GTK kütüphanesini kurulması gerekiyor. Sadece komut satırından çalışacaksanız kurmayabilirsiniz. Ben kurulmasını şiddetle tavsiye edenlerdenim.
sudo apt install -y libgtk-3-dev:armhf libcanberra-gtk3-dev:armhf
Sıra OpenCV için gerekli kütüphaneleri kurmaya geldi.
sudo apt install -y libtiff-dev:armhf zlib1g-dev:armhf
sudo apt install -y libjpeg-dev:armhf libpng-dev:armhf
sudo apt install -y libavcodec-dev:armhf libavformat-dev:armhf libswscale-dev:armhf libv4l-dev:armhf
sudo apt-get install -y libxvidcore-dev:armhf libx264-dev:armhf
Şimdi de sıra Cross Compiling işlemini yapacak kütüphanelerin kurulmasına geldi.
sudo apt install -y crossbuild-essential-armhf
sudo apt install -y gfortran-arm-linux-gnueabihf
sudo apt install -y cmake git pkg-config wget
OpenCV yi indirelim.
cd ~
mkdir opencv_all && cd opencv_all
wget -O opencv.tar.gz https://github.com/opencv/opencv/archive/4.1.0.tar.gz
tar xf opencv.tar.gz
wget -O opencv_contrib.tar.gz https://github.com/opencv/opencv_contrib/archive/4.1.0.tar.gz
tar xf opencv_contrib.tar.gz
7 rm *.tar.gz
GTK+ desteğinin olabilmesi için sistem değişkenlerine şu eklemeleri yapalım.
export PKG_CONFIG_PATH=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig
export PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig
Sıra geldi Cmake ile OpenCV nin build scriptini oluşturmaya.
cd opencv-4.1.0
mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/opt/opencv-4.1.0 \
-D CMAKE_TOOLCHAIN_FILE=../platforms/linux/arm-gnueabi.toolchain.cmake \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_all/opencv_contrib-4.1.0/modules \
-D OPENCV_ENABLE_NONFREE=ON \
-D ENABLE_NEON=ON \
-D ENABLE_VFPV3=ON \
-D BUILD_TESTS=OFF \
-D BUILD_DOCS=OFF \
-D PYTHON2_INCLUDE_PATH=/usr/include/python2.7 \
-D PYTHON2_LIBRARIES=/usr/lib/arm-linux-gnueabihf/libpython2.7.so \
-D PYTHON2_NUMPY_INCLUDE_DIRS=/usr/lib/python2/dist-packages/numpy/core/include \
-D PYTHON3_INCLUDE_PATH=/usr/include/python3.7m \
-D PYTHON3_LIBRARIES=/usr/lib/arm-linux-gnueabihf/libpython3.7m.so \
-D PYTHON3_NUMPY_INCLUDE_DIRS=/usr/lib/python3/dist-packages/numpy/core/include \
-D BUILD_OPENCV_PYTHON2=ON \
-D BUILD_OPENCV_PYTHON3=ON \
-D BUILD_EXAMPLES=OFF ..
Eğer hata vermeden cmake işlemi tamamlanmış ise Operation Done gibi bir ifade vermesi gerekiyor. Bu işlemden sonra artık OpenCV yi derlemeye başlayabiliriz. Bu işlem benim makinamda 20-30 dakika arası sürüyor. Eğer tüm adımları doğru tamamlamışsanız hata vermeden bu işlem tamamlanmış olacaktır. make komutundan sonra kullandığımız -j parametresi kaç ayrı threat (iş parçacığı) ile yapılacağını soruyor. Ben 16 verdim biraz daha hızlı olsun diye. Siz bilgisayarına göre bu parametreyi vermeyebilirisiniz ya da -j4 -j8 gibi daha düşük değerler verebilirsiniz.
sudo make -j16
make işlemi bittikten sonra install komutu vereceğiz ve derleme işlemimizin sonuna geleceğiz.
sudo make install/strip
Sırada geldi Python kütüphanelerinde yanlış isimlendirilen cv2 kütüphanemizi düzeltmeye…
cd /opt/opencv-4.1.0/lib/python3.7/dist-packages/cv2/python-3.7/
sudo cp cv2.cpython-37m-x86_64-linux-gnu.so cv2.so
Artık tüm işlemlerimiz tamamlandı. Son olarak derlediğimiz OpenCV yi sıkıştırmak kaldı. Sıkıştırdıktan sonra flash belleğimiz ile Raspberry Pi imize taşıyabiliriz.
cd /opt
tar -cjvf ~/opencv-4.1.0-armhf.tar.bz2 opencv-4.1.0
cd ~
Bu işlemin sonunda ~ dizinimizde opencv-4.1.0-armhf.tar.bz2 adında bir dosyamızın olması gerekiyor. Yine pkg-config ayarlarımızı taşıyabilmemiz için hazır bir dosya kullanacağız.
git clone https://gist.github.com/sol-prog/ed383474872958081985de733eaf352d opencv_cpp_compile_settings
cd opencv_cpp_compile_settings
cp opencv.pc ~
cd ~
~ klasörümüzün içinde yer alan opencv-4.1.0-armhf.tar.bz2
ve opencv.pc
adlı iki dosyayı flash belleğimize kopyalıyoruz. Debian tarafında işlerimiz bitti.
Raspberry Pi Tarafında Yapılacaklar
Derleme için Debian üzerinde kurmuş olduğumuz tüm armhf kütüphanelerinin kurulu olduğundan emin olunuz. Öncelikle Raspberry Pi üzerine Rasbian işletim sistemini temiz kurulumla kurmanızı öneririm. Kurulumdan sonra güncellemeleri mutlaka yapalım.
sudo apt-get -y update
sudo apt-get -y upgrade
sudo rpi-update
sudo reboot
Gerekli kütüphaneleri kuralım.
sudo apt install -y libgtk-3-dev libcanberra-gtk3-dev
sudo apt install -y libtiff-dev zlib1g-dev
sudo apt install -y libjpeg-dev libpng-dev
sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
cd /usr/include/linux
sudo ln -s -f ../libv4l1-videodev.h videodev.h
cd ~
sudo apt-get -y install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
sudo apt-get -y install libmp3lame-dev libtheora-dev
sudo apt-get -y install libvorbis-dev libxvidcore-dev libx264-dev
sudo apt-get -y install libopencore-amrnb-dev libopencore-amrwb-dev
sudo apt-get -y install libavresample-dev
sudo apt-get -y install x264 v4l-utils
sudo apt-get install libxvidcore-dev libx264-dev
Flash bellekte bulunan iki dosyamızı ~ klasörümüzün içine kopyalayalım ve tar dan çıkartalım. Sonrasında dosyaları /opt klasörüne taşıyalım.
tar xfv opencv-4.1.0-armhf.tar.bz2
sudo mv opencv-4.1.0 /opt
rm opencv-4.1.0-armhf.tar.bz2
pkg-config dosyamızı yerine taşıyalım ki OpenCV düzgün çalışsın.
sudo mv opencv.pc /usr/lib/arm-linux-gnueabihf/pkgconfig
OpenCV nin kütüphanelerini işletim sistemine tanıtalım.
echo 'export LD_LIBRARY_PATH=/opt/opencv-4.1.0/lib:$LD_LIBRARY_PATH' >> .bashrc
echo "sudo modprobe bcm2835-v4l2" >> .bashrc
source .bashrc
Terminali kapatın ya da kullanıcı çıkışı yapıp tekrar terminali açın. Artık sembolik linklerimizi verelim.
sudo ln -s /opt/opencv-4.1.0/lib/python2.7/dist-packages/cv2 /usr/lib/python2.7/dist-packages/cv2
sudo ln -s /opt/opencv-4.1.0/lib/python3.7/dist-packages/cv2 /usr/lib/python3/dist-packages/cv2
Artık tüm kurulumlarımız tamamlandı. Bu noktadan sonra kurulumumuz doğru olmuş mu test edebiliriz. Test programlarımızı indirelim.
cd ~
git clone https://github.com/sol-prog/raspberry-pi-opencv.git
cd raspberry-pi-opencv/tests
Test programlarımızı çalıştıralım. Hata almaz isek düzgün kurulum yapmışsızdır.
C++ için:
g++ cli_cpp_test.cpp -o cli_cpp_test `pkg-config --cflags --libs opencv`
./cli_cpp_test
g++ gui_cpp_test.cpp -o gui_cpp_test `pkg-config --cflags --libs opencv`
./gui_cpp_test
Python için:
python3 cli_python_test.py
python3 gui_python_test.py
Python dosyalarını çalıştırdığımda aldığım çıktılar: