簡述
在 Camera ( embedded Linux ) 上, 建置 OpenCV 4.0 做 background remove, motion detect
由於過程比較複雜, 先在 desktop 上完成, 再移植到 camera.
Desktop (Ubuntu 16.04)
- 安裝相依性檔案
- 編譯 OpenCV 4.0.1
- 測試 JPEG 轉檔
- 測試 WebCam 抓取影像
- 測試 Background Removal
安裝相依性檔案
$ sudo apt-get install build-essential cmake libavcodec-dev libavformat-dev libswscale-dev1
$ sudo apt-get install libjpeg-dev libpng-dev libtiff5-dev libjasper-dev libeigen3-dev libvorbis-dev libxvidcore-dev libx264-dev libfaac-dev libavutil-dev libavfilter-dev libavresample-dev
編譯 OpenCV 4.0
cmake \
-DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} \
-DBUILD_JASPER=ON \
-DBUILD_JPEG=ON \
-DBUILD_PNG=ON \
-DBUILD_TIFF=ON \
-DBUILD_TBB=OFF \
-DBUILD_TESTS=OFF \
-DBUILD_ZLIB=ON \
-DBUILD_PERF_TESTS=OFF \
-DBUILD_SHARED_LIBS=OFF \
-DBUILD_opencv_world=ON \
-DENABLE_AVX=OFF \
-DENABLE_CX11=ON \
-DWITH_CUDA=OFF \
-DWITH_OPENGL=OFF \
-DWITH_OPENCL=OFF \
-DWITH_IPP=OFF \
-DWITH_JASPER=ON \
-DWITH_JPEG=ON \
-DWITH_PNG=ON \
-DWITH_TBB=OFF \
-DWITH_EIGEN=OFF \
-DWITH_V4L=OFF \
-DWITH_VTK=OFF \
-DWITH_ZLIB=ON \
..
測試JPEG轉檔
測試程式
#include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char** argv)
{
cv::Mat image;
image = cv::imread(“sample.jpeg", cv::IMREAD_COLOR);
if ( ! image.data)
{
std::cout << “Could not open or find the image" << std::endl;
return -1;
}
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
imwrite(“gray.jpeg", gray);
return 0;
}
編譯測試程式
g++ -std=c++11 $1.cpp \
-I/home/nick/work/package/install/opencv_4.0.1/include/opencv4 \
-L/home/nick/work/package/install/opencv_4.0.1/lib/ \
-L/home/nick/work/package/install/opencv_4.0.1/lib/opencv4/3rdparty\
-lopencv_world \
-lIlmImf -littnotify -llibtiff -llibjasper -llibjpeg-turbo -llibpng -llibwebp -lzlib \
-lpthread -ldl \
-o $1
測試 WebCam 抓取影像
VideoCapture 會連結到 FFMPEG, 所以需要更改 OpenCV 的編譯設定, 安裝 FFMPEG. OpenCV 會連結到 FFMPEG, 因此, FFMPEG 要在 OpenCV 之前建置.
安裝 FFMPGE
download from https://www.ffmpeg.org/download.html
$ tar -xjf ffmpeg-4.1.tar.bz2
$ cd ffmpeg-4.1
./configure \
–prefix=/home/nick/work/package/install/ffmpeg-4.1 \
–enable-shared \
–disable-static \
–enable-gpl \
–enable-nonfree \
–enable-ffmpeg \
–enable-ffprobe \
–enable-swscale \
–enable-pthreads \
–disable-x86asm \
–disable-stripping \
–disable-libx264 \
–disable-libxvid \
–disable-lzma \
make
make install
重建 OpenCV
BUILD_DIR="${PWD}/build"
INSTALL_DIR="${PWD}/../install/opencv_4.0.1″
mkdir -p ${BUILD_DIR}
cd ${BUILD_DIR}
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nick/work/package/install/ffmpeg-4.1/lib
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/nick/work/package/install/ffmpeg-4.1/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$PKG_CONFIG_LIBDIR:/home/nick/work/package/install/ffmpeg-4.1/lib
cmake \
-DCMAKE_BUILD_TYPE=RELEASE \
-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR} \
-DBUILD_FFMPEG=ON \
-DBUILD_JASPER=ON \
-DBUILD_JPEG=ON \
-DBUILD_PNG=ON \
-DBUILD_TIFF=ON \
-DBUILD_TBB=OFF \
-DBUILD_TESTS=OFF \
-DBUILD_ZLIB=ON \
-DBUILD_PERF_TESTS=OFF \
-DBUILD_SHARED_LIBS=OFF \
-DBUILD_opencv_world=ON \
-DENABLE_CX11=ON \
-DWITH_CUDA=OFF \
-DWITH_FFMPEG=ON \
-DWITH_OPENGL=OFF \
-DWITH_OPENCL=OFF \
-DWITH_IPP=OFF \
-DWITH_JASPER=ON \
-DWITH_JPEG=ON \
-DWITH_PNG=ON \
-DWITH_TBB=OFF \
-DWITH_EIGEN=OFF \
-DWITH_V4L=ON \
-DWITH_LIBV4L=ON \
-DWITH_VTK=OFF \
-DWITH_ZLIB=ON \
..
make
重建 OpenCV 之後, 就可以正常執行從 V4L2 抓取影像的 測試程式. 原始碼
#include <opencv2/opencv.hpp>
#include <iostream>
const static char* AVI_FILE = “wnz-440.avi";
const static char* VIDEO_DEV = “/dev/video0″;
int main(int argc, char** argv)
{
std::cerr << “Init" << std::endl;
cv::VideoCapture capture(VIDEO_DEV);
if ( !capture.isOpened())
{
std::cerr << “Open camera failed" << std::endl;
return -1;
}
cv::Mat frame;
capture >> frame;
if ( frame.empty())
{
std::cerr << “Frame empty" << std::endl;
return -1;
}
imwrite(“capture.jpg", frame);
return 0;
}
編譯命令
g++ -std=c++11 $1.cpp \
-I/home/nick/work/package/install/opencv_4.0.1/include/opencv4 \
-L/home/nick/work/package/install/opencv_4.0.1/lib/ \
-L/home/nick/work/package/install/opencv_4.0.1/lib/opencv4/3rdparty\
-L/home/nick/work/package/install/ffmpeg-4.1/lib \
-lopencv_world \
-lIlmImf -littnotify -llibtiff -llibjasper -llibjpeg-turbo -llibpng -llibwebp -lzlib \
-lavformat -lavdevice -lavcodec -lavfilter -lavutil -lpostproc -lswresample -lswscale -lm -lz \
-lpthread -ldl \
-o $1
測試 Background Removal
由於這ˋ個編譯的項目是用 static ( 為了可以ˊ移植到 embedded system), 而 gtk 的依賴檔案太多, 故放棄 GUI 的測試方式. 直接寫到檔案.