จับมือติดตั้ง OpenCV4 บน Raspberry Pi4 แบบไม่มีคำว่าลงไม่ได้

มาลองกันดูว่าทำไม เราถึงลง OpenCV บน Raspberry Pi  ไม่สำเร็จทั้ง ๆ ที่ก็มีคนอีกมากมายที่ทำแล้วได้ไม่ติดอะไร

สวัสดีครับวันนี้ผมจะมาแนะนำขั้นตอนการติดตั้ง OpenCV4 บนบอร์ด Raspberry Pi  ที่ติดตั้งระบบปฎิบัติการ Raspbian Buster กันดูครับ โดยผมได้ทดลองติดตั้งตามคำแนะนำจากในเว็บไซต์ https://www.pyimagesearch.com/2019/09/16/install-opencv-4-on-raspberry-pi-4-and-raspbian-buster/   ทำตามแบบเป๊ะๆเลย ซึ่งมันจะติดปัญหาครับ แล้วบางคนเห็น error แล้วไม่ใส่ใจก็ลุยทำต่อไป จนสุดท้ายใช้ไม่ได้ครับ

เอาล่ะงั้นเรามาเริ่มต้นกันได้เลยครับ โดยผมจะติดตั้งโดยใช้วิธีการ compile จากซอร์สโค้ดนะครับ โดยจะขอข้ามเรื่องการติดตั้งระบบปฎิบัติการไปทั้งหมดเลยนะครับ ถือว่าเป็นการใช้งาน Raspberry Pi เบื้องต้นซึ่งศึกษาได้ด้วยตนเองหรือถ้าอยากได้ทางลัดที่อธิบายแบบหมดเปลือกก็ขอเชิญที่ [คอร์สออนไลน์ครบเครื่องเรื่องการใช้งาน Raspberry Pi สำหรับผู้เริ่มต้น]  เอาล่ะขอเข้าเนื้อหาเลยนะครับ 

1) ขั้นแรกเลยสำหรับคนที่ SDcard มีขนาดเล็ก เราก็จะเอา software package ที่ติดตั้งมาให้กับ OS ออกไปก่อนหรือตอนเลือก Image  มาก็อย่าเลือกตัวเต็ม แต่ถ้าเอามาแล้วก็ถอนการติดตั้งตามนี้ครับ  ($) ไม่ต้องเอาไปวางนะครับ

$ sudo apt-get purge wolfram-engine
$ sudo apt-get purge libreoffice*
$ sudo apt-get clean
$ sudo apt-get autoremove

2)  คือการติดตั้ง Software ที่เกี่ยวข้อง โดยก่อนอื่นเลยให้ทำการ update software กันเลยเลยด้วยคำสั่ง
$ sudo apt-get update && sudo apt-get upgrade

จากนั้นติดตั้ง Developer tools เอาไว้ช่วง compile
$ sudo apt-get install build-essential cmake pkg-config

 แล้วทำการติดตั้ง image package  จะได้ใช้งานกับรูปภาพได้หลาย format. หน่อย

$ sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng-dev

  จากนั้นจากรุปภาพเราก็ต้องมีการใช้งานวิดีโอด้วยแน่ๆก็ติดตั้งเผื่อไว้เลย

$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
$ sudo apt-get install libxvidcore-dev libx264-dev

 ต่อไปเป็นเรื่องของด้าน GUI  บ้างเราต้องติดตั้ง GTK development library ลงไปตามนี้จะได้ใช้งาน highgui  ไว้ทำ GUI ง่าย ๆ ได้

$ sudo apt-get install libfontconfig1-dev libcairo2-dev
$ sudo apt-get install libgdk-pixbuf2.0-dev libpango1.0-dev
$ sudo apt-get install libgtk2.0-dev libgtk-3-dev

ต่อไปก็ลง lib ช่วยเรื่องการคำนวนใน OpenCV  ลงไปอีก

$ sudo apt-get install libatlas-base-dev gfortran

 จากนั้นก็ลง HDF5 datasets กับ Qt GUIs

$ sudo apt-get install libhdf5-dev libhdf5-serial-dev libhdf5-103
$ sudo apt-get install libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5

สุดท้ายละของข้อนี้ ถ้าเราจะติดตั้ง OpenCV แล้วไปเรียกใช้ใน python เราต้องติดตั้ง python header ไฟล์ลงไปด้วยตามนี้

$ sudo apt-get install python3-dev

 3) เราจะมาติดตั้งและสร้าง Python virtual environment กันโดยจะใช้เป็น virtualenv virtualenvwrapper เพราะอะไรถึงต้องตัวนี้ง่ายมากครับเพราะใน pyimagesearch เค้าใช้ตัวนี้ถ้าใช้เหมือนเค้าก็จะไปทำอะไรตามได้ง่ายกว่าเลือกลงตัวอื่นเอง update  pip   ซะก่อนเลย

$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python get-pip.py
$ sudo python3 get-pip.py
$ sudo rm -rf ~/.cache/pip

 แล้วลง Python virtual environment  #ปักหมุด1

$ sudo pip install virtualenv virtualenvwrapper

เปิดไฟล์ ~/.bashrc (/home/pi/.bashrc) ขึ้นมาแก้ใส่คำสั่งเพิ่มลงไป

# virtualenv and virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh

สั่ง reload .bashrc

source ~/.bashrc

สั่งสร้าง Python 3 virtual environment:

mkvirtualenv cv -p python3

เรียบร้อยครับเจอ error ทันที

 
ERROR: Environment ‘/home/pi/.virtualenvs/cv’ does not contain an activate script

ไม่เป็นไรนะใจเย็น ๆ อย่าพึ่งดึงผม
 ที่  error ก็เพราะว่าตอนเราลง virtualenv virtualenvwrapper ไปมันดันเป็น version ใหม่เลยต้องเอาออกก่อน 

sudo pip3 uninstall virtualenv virtualenvwrapper

แล้วลงแบบระบุ  version ทำแบบนี้นะครับ จริงๆแก้ใน #ปักหมุด1 ก็จะไม่เจอละแต่อยากให้เจอว่าถ้าทำตามเค้าเลย error แน่นอน

sudo pip3 install virtualenv virtualenvwrapper==’4.8.4′

สั่ง source ใหม่

source ~/.bashrc

แล้วลอง mkvirtualenv อีกรอบ

mkvirtualenv cv -p python3

เรียบร้อยติดตั้งได้ไม่เจอ error แล้วงั้นเรามาขั้นต่อไปเลย
ลงตัว picameraAPI

$ pip install “picamera[array]”

4) คอมไพล์ OpenCV เริ่มแรกไปดาวน์โหลดไฟล์ซอร์สโค้ดมาก่อนอันนี้กินเนื้อที่เยอะหน่อย เราถึงต้องลบ package ที่ไม่ใช้ออกแต่ถ้าใคร 16G++.  ก็ไม่ต้องไปสนใจ 

$ cd ~
$ wget -O opencv.zip https://github.com/opencv/opencv/archive/4.1.1.zip
$ wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.1.1.zip
$ unzip opencv.zip
$ unzip opencv_contrib.zip
$ mv opencv-4.1.1 opencv
$ mv opencv_contrib-4.1.1 opencv_contrib

แต่ก่อนจะไปคอมไพล์เดี๋ยวแก้ขนาด swap file ก่อนมันน้อยเกินไปเติมทีตั้งไว้  100MB  เองเดี๋ยวเมมหมด ด้วยการไปเปิดไฟล์ /etc/dphys-swapfile มาแก้

# set size to absolute value, leaving empty (default) then uses computed value
#   you most likely don’t want this, unless you have an special disk situation
# CONF_SWAPSIZE=100
CONF_SWAPSIZE=2048

สั่ง  restart service ของมันซะหน่อย

$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start

เอาล่ะเราพร้อมจะไปคอมไพล์กันแล้ว เริ่มต้นด้วยย้ายตัวเองไปอยู่ใน virtual environmen ที่สร้างไว้ก่อน เราสร้างไว้ชื่อว่า cv นะจำกันได้มั้ย

workon cv

ติดตั้ง numpy ลงใน virtual environment  ของเรา (ไม่ต้อง sudo พิมพ์แบบนี้เลย)

pip install numpy

สั่ง Cmake เตรียม build

$ cd ~/opencv
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE
    -D CMAKE_INSTALL_PREFIX=/usr/local
    -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules
    -D ENABLE_NEON=ON
    -D ENABLE_VFPV3=ON
    -D BUILD_TESTS=OFF
    -D INSTALL_PYTHON_EXAMPLES=OFF
    -D OPENCV_ENABLE_NONFREE=ON
    -D CMAKE_SHARED_LINKER_FLAGS=-latomic
    -D BUILD_EXAMPLES=OFF .. 

ถ้าเรียบร้อยดีแบบนี้ก็เตรียม make  ได้เลยเราจะใส่  -j4 ให้คอมไพล์ด้วย core ทั้งหมดไปเลย

$ make -j4

 แล้วก็ไปหาอะไรทำจะนอน เล่นเกม หรือ netflix ก็ได้อีก 2 ชั่วโมงค่อยกลับมา

กลับมาเจอหน้าแบบนี้ก็อุ่นใจละครับ ไม่มี error ใด ๆ ให้ระคายใจ ก็สั่ง  make install ให้มัน copy ไฟล์ที่คอมไพล์แล้วไปอยู่ในที่ชอบที่ควรซะ ทำ  link ให้เรียบร้อยแล้ว ldconfig

$ sudo make install
$ sudo ldconfig

ต่อไปคือทำ symbolic link เอาไฟล์ cv2.so ให้เรียกจากใน virtual environtment ชื่อ cv  ของเราได้

$ cd /usr/local/lib/python3.7/site-packages/cv2/python-3.7
$ sudo mv cv2.cpython-37m-arm-linux-gnueabihf.so cv2.so
$ cd ~/.virtualenvs/cv/lib/python3.7/site-packages/
$ ln -s /usr/local/lib/python3.7/site-packages/cv2/python-3.7/cv2.so cv2.so

แล้วไปแก้ swap file   ให้ขนาดกลับมาเป็น  100M เท่าเดิมด้วยการไปเปิดไฟล์ /etc/dphys-swapfile มาแก้

# set size to absolute value, leaving empty (default) then uses computed value
#   you most likely don’t want this, unless you have an special disk situation
CONF_SWAPSIZE=100
#CONF_SWAPSIZE=2048

 สั่ง  restart service ของมันซะหน่อย 

$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start

 มาลองกันดีกว่าว่าใช้งานได้มั้ย โดยก่อนลองดูก่อนว่าเราอยู่ใน virtual environtment ที่เตรียมไว้แล้วรึยัง 

$ cd ~
$ workon cv
$ python
>>> import cv2
>>> cv2.__version__
‘4.1.1’
>>>

 บางคนถามว่าแล้วมันต้องมาคอยพิมพ์ workon cv ทุกครั้งเลยมั้ยแล้วถ้าโปรแกรมต้องทำงานเริ่มต้นอัตโนมัติทำไง, แล้วถ้าจะออกจาก cv virtual environtment  ต้องทำยังไง โอเคตอบทีละข้อนะครับ – ไปเพิ่ม  workon cv  ในท้าย  .bashrc   ก็ได้ทุกครั้งที่เข้ามาก็จะโหลด virtual environtment cv  ให้เรียบร้อย – อยากออกจาก virtual environtment ให้พิมพ์ deactivate 

$ deactivate

 เป็นยังไงครับใครมี SD card  เหลือว่างๆก็ลองลงดูตามได้เลยครับ แล้วไปหาตัวอย่างไฟล์ OpenCV  มาลองเล่นดูได้ https://www.youtube.com/watch?v=0W9Ug_Qqtz4&feature=youtu.be

และสุดท้ายก่อนจะจบบทความนี้ก็ขอฝากประชาสัมพันธ์ [คอร์สครบเครื่องเรื่องการใช้งาน Raspberry Pi สำหรับผู้เริ่มต้น] ไว้ด้วยสำหรับผู้ที่สนใจอยากครบเครื่องเรื่องการใช้งาน Raspberry Pi จริงๆราคาเพียง 1,500 บาทเท่านั้นครับ สวัสดีครับ

Leave a Comment