มาลองกันดูว่าทำไม เราถึงลง 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 บาทเท่านั้นครับ สวัสดีครับ